web-dev-qa-db-ja.com

更新トークンGoogle APIを取得

コードでリフレッシュトークンを取得できません。アクセストークン、トークンタイプなどしか取得できません。ログインURLにaccess_type=offlineを追加するなどのチュートリアルに従っています。

echo "<a href='https://accounts.google.com/o/oauth2/auth?" 
    . "access_type=offline&client_id=123345555.apps.googleusercontent.com& "
    . "scope=https://www.googleapis.com/auth/calendar+https://www.googleapis.com/auth/plus.me&response_type=code& "
    . "redirect_uri=http://www.sample.com/sample.php&state=/profile'>Google</a>";

アクセストークンを取得する私のフィールド:

$fields=array(
    'code'=>  urlencode($authcode),
    'client_id'=> urlencode($clientid),
    'client_secret'=> urlencode($clientsecret),
    'redirect_uri'=> urlencode($redirecturi),
    'grant_type'=> 'authorization_code',
);

しかし、私はrefresh_tokenを取得できず、ただaccess_tokentoken_typeid_tokenおよびexpires_in

71

これをURLパラメータに追加することで判明

authorization_Prompt = force

97

ser987361 の答えを拡張できる場合:

OAuth2.0ドキュメントの オフラインアクセス 部分から:

アプリケーションが更新トークンを受け取った場合、将来の使用のためにその更新トークンを保存することが重要です。アプリケーションが更新トークンを失った場合、別の更新トークンを取得する前に、ユーザーに同意を求めるプロンプトを再度表示する必要があります。ユーザーに同意を再度求める必要がある場合は、許可コード要求にapproval_Promptパラメーターを含め、値をforceに設定します。

したがって、すでにアクセスを許可している場合、同意ページのクエリ文字列でgrant_typeofflineに設定されていても、authorization_coderefresh_tokenに対する後続のリクエストはaccess_typeを返しません。

上記の引用で述べたように、newrefresh_tokenを取得するために、すでに受け取っている場合、プロンプトを介してユーザーを送り返す必要があります。 approval_Promptforceに設定することで実行できます。

乾杯、

PSこの変更は ブログ投稿 でも発表されました。

58
bossylobster

access_type=offlineが必要です。

これにより、ユーザーがアプリを初めて承認したときに更新トークンが返されます。後続の呼び出しでは、アプリの再承認は強制されません(approval_Prompt=force)。

詳細を参照してください: https://developers.google.com/accounts/docs/OAuth2WebServer#offline

12
Elliot Coad

これは、Google公式SDKを使用したPHPの完全なコードです

$client = new Google_Client();
## some need parameter
$client->setApplicationName('your application name');
$client->setClientId('****************');
$client->setClientSecret('************');
$client->setRedirectUri('http://your.website.tld/complete/url2redirect');
$client->setScopes('https://www.googleapis.com/auth/userinfo.email');
## these two lines is important to get refresh token from google api
$client->setAccessType('offline');
$client->setApprovalPrompt('force'); # this line is important when you revoke permission from your app, it will Prompt google approval dialogue box forcefully to user to grant offline access
10

このアプリでは、これらのパラメーターaccess_type=offline&Prompt=consentの両方を使用する必要がありました。 approval_Prompt=force機能しませんでした私たちにとって

6
Ricky

こんにちは、次の手順に従って、更新トークンを取得できました。

承認フローには2つのステップがあります。

  1. https://accounts.google.com/o/oauth2/auth? URLを使用して認証コードを取得します。

    そのために、次のパラメーターを指定して送信リクエストが送信されます。 'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline'上記を提供すると、認証コードを受け取ります。

  2. https://accounts.google.com/o/oauth2/token? URLを使用してAcessTokenおよびRefreshTokenを取得します。そのために、次のパラメーターを指定して送信リクエストが送信されます。

    「コード」:コード、「client_id」:CID、「client_secret」:CSECRET、「redirect_uri」:リダイレクト、「grant_type」:「authorization_code」、

そのため、最初の試行でアクセス許可を承認すると、更新トークンを取得できます。その後の試行では、更新トークンは提供されません。再度トークンが必要な場合は、アプリケーションのアクセス権を取り消します。

これが誰かの応援に役立つことを願っています:)

5
dnWick

OAuthには、リアルモードで2つのシナリオがあります。通常のデフォルトのスタイルのアクセスはオンラインと呼ばれます。場合によっては、ユーザーがいないときにアプリケーションがGoogle APIにアクセスする必要がある場合があります、それはオフラインシナリオです。オフラインシナリオでは、最初の認証コード交換中に更新トークンが取得されます。

したがって、refersh_tokenを取得できるシナリオはすべてではありません。

https://developers.google.com/identity/protocols/OAuth2WebServer#offline にコンテンツを含めることができます。

4
Julian89757

2016年3月以降、Prompt=consentを使用してGoogle API更新トークンを再生成します。

https://github.com/googleapis/oauth2client/issues/45 で述べたように、

authorization_Prompt = forceはPrompt=none|consent|select_accountに置き換えられました

1
Finwe