1

私はOpen IDとGoogleのログインを統合しています。ドキュメンテーションには、私は偽造防止状態トークンを作成する必要があると言われています。私はCSRF(SitepointStackOverflowShiflett)についていくつかの参考文献を読んだことがあります。私はこのソリューションを実装する方法を理解することができません。GoogleクライアントPHP認証フローを使用したCSRF

私は、私がコンセプトを正しく理解していないと確信していますが、私は懸命に努力しています。これは私がこれまでにコード化されているプロセスである:もちろん

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

    } 
} 

?> 

、これはこれはそれを行うための適切な方法があるかどうかを確認するためにテスト・スクリプトです。これまではうまくいきましたが、これが正しいかどうかはわかりません。私は親切にも、これが使えるかどうか、あるいはどのような変更が示唆されるかを確認できる誰かのサポートをお願いしています。あなたの貴重な情報のために、私は非常に感謝しています!

答えて

0

今私は自分自身を恥じている。ドキュメンテーションは非常にはっきりしていましたが、私の心は理解できませんCSRFは、 "state"パラメータをクライアントオブジェクトに渡すことによって実装されます。

$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... 
} 
関連する問題