1

J'intègre Google Connectez-vous avec Open ID. La documentation dit que j'ai besoin de créer un jeton d'état anti-falsification. J'ai lu plusieurs références sur CSRF (Sitepoint, StackOverflow, Shiflett) et quelques autres. Je ne peux pas finir de comprendre comment je suis supposé mettre en œuvre cette solution.CSRF avec le flux d'authentification PHP du client Google

Je suis à peu près sûr que je n'ai pas bien compris le concept mais je fais beaucoup d'efforts. C'est le processus que je l'ai codé jusqu'à présent:

<?php session_start(); 

//INCLUDE PHP CLIENT LIBRARY 
require_once 'vendor/autoload.php'; 

$scopes = array('email', 'profile'); 

// Create client object 
$client = new Google_Client(); 
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/index.php'); 
$client->setAuthConfig("client.json"); 
$client->addScope($scopes); 
$client->setAccessType("offline"); 

if(isset($_SESSION["access_token"]) && $_SESSION["access_token"]) { 

    if(isset($_SESSION['tokencsrf']) && $_SESSION['tokencsrf'] !== "") { 

    $client->setAccessToken($_SESSION["access_token"]); 

    if ($client->isAccessTokenExpired()) { 
     $refreshTokenTxt = "refreshToken.txt"; 
     $tokenHandle = fopen($refreshTokenTxt, "r"); 
     $refreshToken = fread($tokenHandle, filesize($refreshTokenTxt)); 
     $client->refreshToken($refreshToken); 
     $_SESSION['access_token'] = $client->getAccessToken(); 
     $client->setAccessToken($_SESSION["access_token"]); 
    } 

    $objOAuthService = new Google_Service_Oauth2($client); 

    $userData = $objOAuthService->userinfo->get(); 

    var_dump($userData); 

    } else {  
    die(" --- INVALID CSRF! ---");  
    }  

} else { 

    $_SESSION['tokencsrf'] = bin2hex(openssl_random_pseudo_bytes(16)); 

    if(!isset($_GET["code"])){ 

    $authUrl = $client->createAuthUrl(); 
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL)); 

    } else { 

    $client->authenticate($_GET['code']); 
    $_SESSION['access_token'] = $client->getAccessToken(); 

    $refreshTokenTxt = "refreshToken.txt"; 

    if (!file_exists($refreshTokenTxt)) { 
     $tokenHandle = fopen($refreshTokenTxt, "w"); 
     fwrite($tokenHandle, $_SESSION['access_token']["refresh_token"]); 
    } 

    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/index.php'; 
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); 

    } 
} 

?> 

Bien sûr, cela est un script de test pour voir si cela est la bonne façon de le faire. Jusqu'à présent, cela fonctionne bien, mais je ne suis pas sûr que ce soit la bonne façon. Je demande le soutien de quelqu'un qui peut confirmer si cela est acceptable ou quels changements peuvent être suggérés. Pour votre contribution précieuse, je suis très reconnaissant!

Répondre

0

Je me sens si honteuse de moi-même en ce moment. La documentation était très claire mais mon esprit ne l'était pas. Le CSRF est implémenté en passant le paramètre "state" à l'objet client. Puis, une fois l'authentification terminée, il suffit de confirmer que le jeton retourné est le même que dans la session.

if($_GET["state"] == $_SESSION["state"]) { 
    //do stuff here... 
}