9

私は、JavaScriptのGoogleクライアント "コード"を使用してGoogleのAPIからリフレッシュトークンを取得しようとしています。それは私にサーバー側に送信するコードを返します。私は取得Googleの遊び場から同じコードを使用していますがGoogle APIのPHPクライアントコードがリフレッシュトークンを返さない

https://www.googleapis.com/oauth2/v4/token 

:今、サーバ側から私はこの呼び出しでGoogle-API-PHP-クライアントを使用してを使用してリフレッシュトークンとアクセストークンを取得するためにコードを送信していますトークンにもリフレッシュして応答が、私は私自身のサーバーからそれを得ることはありません.. は、これは私がいくつかの回答で述べたようにオフラインにアクセスタイプを設定しているが、それでも私は、応答を取得するコード

public function getRefreshToken($code) 
{ 
    $client = new Google_Client(); 
    $client->setClientId(config('services.google.client_id')); 
    $client->setClientSecret(config('services.google.client_secret')); 
    $client->setRedirectUri('postmessage'); 
    $client->setScopes(config('services.google.scopes')); 
    $client->setAccessType("offline"); 
    $client->setApprovalPrompt("force"); 
    dd($client->authenticate($code)); 
    dd($client->getRefreshToken()); 
    return ; 
} 

です私たちの更新トークン..これは応答です

access_token :"xxxxxxxxxxxxxxxxxxxxxx" 
created:1510242052 
expires_in:3598 
id_token:"xxxxxxxx" 
token_type:"Bearer" 

答えて

7

あなたのPHPコードは私にはうまく見えます。私はあなたのフロントエンドのjavascript、特にそれが構築するGoogleへのリンクは、責任を負う可能性があります疑いがあります。償還時にauthorization_codeが更新トークンを生成するかどうかは、Googleへの最初のリンクに含まれるパラメータに部分的に依存するかどうか。

this answerで詳述されているように、javascriptクライアントライブラリは「クライアントサイドフロー」を使用します。通常、フロントエンドアプリではresponse_type=tokenと指定しますが、response_type=codeと指定した場合は、codeが返されます。しかし、償還されると、codeは更新トークンを生成しません。

例えば、a link built by a front end javascript libraryは次のようになります。

https://accounts.google.com/o/oauth2/v2/auth?client_id=7xxxxxxxxxxx-xxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http://localhost:8080/oauth2callback.php&response_type=code&scope=profile 

あなたのバックエンドを戻ってくるcodeを償還することができますが、応答は、リフレッシュトークンが含まれていません。これは設計によるものです。

リフレッシュトークンの対象となるを取得する方法の1つは、バックエンドPHPクライアントライブラリを使用して、javascriptクライアントライブラリではなく、リンクを構築することです。

https://accounts.google.com/o/oauth2/auth?response_type=code&ACCESS_TYPE =オフライン &のclient_id = 7xxxxxxxxxx-hxxxxxxxxxxxxxxxx.apps.googleusercontent.com & REDIRECT_URI =のhttp%3A%2F%2Flocalhost%3A8080%2Foauth2callback.php &状態&範囲:$client->createAuthUrl()は、このようなリンクを構築します= & approval_prompt =力をプロファイリング

This toy exampleは、リンクをこのように構築し、リフレッシュトークンを受信ありません。

access_type=offineおよびapproval_prompt=forceの追加に注意してください。認証に成功すると、この場合のリダイレクトにはcodeが含まれ、交換時ににはにリフレッシュトークンが含まれます。

OAuth 2.0プレイグラウンドは、access_type=offlineprompt=consentを含む初期リンクを作成し、リフレッシュトークン用に償還可能なコードも作成します。

これは役に立たない場合は、フロントエンドが作成しているGoogleへのリンクを使って質問を更新できますか?(もちろん、クライアントIDを編集したもの)

+0

私はあなたに私に「元のパラメータが必要です」というエラーが表示されたらどうしようとしましたか。 –

+0

リフレッシュトークンが戻ってきていますか?いつこのエラーが発生しますか?初めてGoogleに行ったときは? 'authenticate()'を呼び出すとどうなりますか?あなたが実際にaccess_tokenを使用しようとすると?このエラーは、Maps APIエラーのように聞こえます。あなたが使用しようとしているものは何ですか? –

+0

ここには2つのことがあります。 1.最初にこれはスタックオーバーフローの答えのいずれにも言及されていません、なぜこの質問に恩恵を与えなければならなかったのですか?誰もまだこの質問に注意を払わなかったどこにも答えられませんでした。 2. GOOGLE DOCUMENTSのどこにも言及されているようなものはありません。どうしてこんなことに ? –

関連する問題