CSRF с потоком проверки подлинности PHP клиента Google

Я интегрирую Google Войти через Открытый идентификатор. В документации сказано, что мне нужно создать токен состояния защиты от подделки. Я прочитал несколько ссылок о CSRF (Sitepoint, Переполнение стека, Шифлетт) и еще пару. Я не могу до конца понять, как я должен реализовать это решение.

Я почти уверен, что не правильно понял концепцию, но очень стараюсь. Это процесс, который я до сих пор кодировал:

<?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));

}
}

?>

Конечно, это тестовый скрипт, чтобы увидеть, является ли это правильным способом сделать это. Пока это работает хорошо, но я не уверен, что это правильный путь. Я прошу поддержки у кого-то, кто может подтвердить, что это нормально для использования или какие изменения могут быть предложены. За ваш ценный вклад я очень благодарен!

1

Решение

Мне сейчас так стыдно за себя. Документация была очень ясной, но я не думал. Функция CSRF реализуется путем передачи параметра «состояние» клиентскому объекту.

$state = bin2hex(openssl_random_pseudo_bytes(16));
$_SESSION["state"] = $state;
// 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");
$client->setState($state);

Затем, после аутентификации, просто подтвердите, что возвращенный токен такой же, как в сеансе.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]