1

Google 로그인을 Open ID과 통합합니다. 문서에 위조 방지 토큰을 만들어야한다고 나와 있습니다. CSRF (Sitepoint, StackOverflow, Shiflett)에 대한 여러 참고 자료와 몇 가지 내용을 읽었습니다. 이 솔루션을 구현하는 방법을 이해하는 것을 끝낼 수 없습니다.CSRF with Google 클라이언트 PHP 인증 흐름

저는 개념을 제대로 이해하지 못했지만 열심히 노력하고 있습니다. 이것은 내가 지금까지 코딩 한 과정이다 : 물론

<?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... 
}