2017-01-20 18 views
1

PHP 5.4.45およびGoogle APIクライアントPHPライブラリバージョン2.1.1を使用して、サーバー側のWebアプリケーションにGoogle OAuth 2.0を使用しています。PHPのGoogle IDトークンの情報がありません

私は成功しrefresh_tokenaccess_tokenid_tokenauthorization codeを交換することができ、私は正しくid_tokenを確認し、そこからユーザーのデータを抽出しますが、いくつかの情報が不足していることができます。

私が正しく同意画面で、ユーザーのアプリケーション設定で表示されます両方profileemailスコープを、要求された、しかし、電子メールが利用可能である一方で、profileスコープに関連付けられたすべての請求がid_tokenから欠落している(名、写真など)。

私はさまざまなユーザーで試してみましたが、問題は解決しません。

これは私が(ちょうどテストの目的のために)使用しているコードです:

require_once 'php/libs/google_api_client_library/vendor/autoload.php'; 

if(!isset($_GET['code'])){ 
    die("code parameter not set"); 

}else{ 
    //exchange 'code' with access token, refresh token and id token 
    $data = array(
     'code' => $_GET['code'], 
     'client_id' => $MY_CLIENT_ID, 
     'client_secret' => $MY_CLIENT_SECRET, 
     'redirect_uri' => 'https://www.mywebsite.com/oauth2callback.php', 
     'grant_type' => 'authorization_code' 
    ); 
    $options = array(
     'http' => array(
      'header' => "Content-type: application/x-www-form-urlencoded\r\n", 
      'method' => 'POST', 
      'content' => http_build_query($data) 
     ) 
    ); 
    $response = file_get_contents('https://accounts.google.com/o/oauth2/token', false, stream_context_create($options)); 

    if($response){ 
     $tokens = json_decode($response); 

     $client = new Google_Client(); 

     //validate idToken and get user info 
     $idtoken = $client->verifyIdToken($tokens->id_token); 

     echo "<h1>ID_TOKEN</h1>"; 
     var_dump($idtoken); 
    } 
} 

奇妙なことは、それが前に正常に動作するために使用することで、それが突然、そのように振る舞う始めた、と私ドンこのコードを変更することを忘れないでください。

JavaScript APIクライアントライブラリですべてがうまくいくので、これはPHPでサーバーサイドでのみ発生することに気付きました。

これはなぜ起こっているのですか?

詳細情報と事前の感謝が必要な場合はお知らせください。

+0

何を試しましたか? –

+0

私はオンラインとオフラインの 'access_type'の両方で異なるGoogleアカウントを使用しようとしましたが、何も変わりませんでした。 私はクエリ文字列に 'fetch_basic_profile = true'を、' scopes'に 'openid'を含めてみました。これはいくつかの例で見たことがあるが運がないからです。 私はまた、PHPライブラリを使ってid_tokenから抽出したデータが、Googleのtokeninfoエンドポイントによって返されたものと同じであることを確認しました。 –

答えて

0

私は正確に問題だったのか分からないが、私はインターネット上で発見したいくつかの例の助けを借りて、私はGoogle_Service_Oauth2クラスを使用して、次のように私のコードを編集した:

require_once 'php/libs/google_api_client_library/vendor/autoload.php'; 

if(!isset($_GET['code'])){ 
    die("code parameter not set"); 

}else{ 
    $client = new Google_Client(); 
    $client->setClientId($MY_CLIENT_ID); 
    $client->setClientSecret($MY_CLIENT_SECRET); 
    $client->setApplicationName('MyApplicationName'); 
    $client->setRedirectUri('https://www.mywebsite.com/oauth2callback.php'); 
    $oauth = new Google_Service_Oauth2($client); 

    $client->authenticate($_GET['code']); //exchange 'code' with access token, refresh token and id token 

    $accessToken = $client->getAccessToken(); 

    $userData = $oauth->userinfo->get(); //get user info 

    echo "<h1>USER DATA</h1>"; 
    var_dump($userData); 
} 

そして今ではすべての作品ちょうどいい!

関連する問題