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!