コードでリフレッシュトークンを取得できません。アクセストークン、トークンタイプなどしか取得できません。ログイン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_token、token_type、id_tokenおよびexpires_in。
これをURLパラメータに追加することで判明
authorization_Prompt = force
ser987361 の答えを拡張できる場合:
OAuth2.0ドキュメントの オフラインアクセス 部分から:
アプリケーションが更新トークンを受け取った場合、将来の使用のためにその更新トークンを保存することが重要です。アプリケーションが更新トークンを失った場合、別の更新トークンを取得する前に、ユーザーに同意を求めるプロンプトを再度表示する必要があります。ユーザーに同意を再度求める必要がある場合は、許可コード要求に
approval_Prompt
パラメーターを含め、値をforce
に設定します。
したがって、すでにアクセスを許可している場合、同意ページのクエリ文字列でgrant_type
がoffline
に設定されていても、authorization_code
のrefresh_token
に対する後続のリクエストはaccess_type
を返しません。
上記の引用で述べたように、newrefresh_token
を取得するために、すでに受け取っている場合、プロンプトを介してユーザーを送り返す必要があります。 approval_Prompt
をforce
に設定することで実行できます。
乾杯、
PSこの変更は ブログ投稿 でも発表されました。
access_type=offline
が必要です。
これにより、ユーザーがアプリを初めて承認したときに更新トークンが返されます。後続の呼び出しでは、アプリの再承認は強制されません(approval_Prompt=force
)。
詳細を参照してください: https://developers.google.com/accounts/docs/OAuth2WebServer#offline
これは、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
このアプリでは、これらのパラメーターaccess_type=offline&Prompt=consent
の両方を使用する必要がありました。 approval_Prompt=force
機能しませんでした私たちにとって
こんにちは、次の手順に従って、更新トークンを取得できました。
承認フローには2つのステップがあります。
https://accounts.google.com/o/oauth2/auth?
URLを使用して認証コードを取得します。
そのために、次のパラメーターを指定して送信リクエストが送信されます。 'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline'
上記を提供すると、認証コードを受け取ります。
https://accounts.google.com/o/oauth2/token?
URLを使用してAcessTokenおよびRefreshTokenを取得します。そのために、次のパラメーターを指定して送信リクエストが送信されます。
「コード」:コード、「client_id」:CID、「client_secret」:CSECRET、「redirect_uri」:リダイレクト、「grant_type」:「authorization_code」、
そのため、最初の試行でアクセス許可を承認すると、更新トークンを取得できます。その後の試行では、更新トークンは提供されません。再度トークンが必要な場合は、アプリケーションのアクセス権を取り消します。
これが誰かの応援に役立つことを願っています:)
OAuthには、リアルモードで2つのシナリオがあります。通常のデフォルトのスタイルのアクセスはオンラインと呼ばれます。場合によっては、ユーザーがいないときにアプリケーションがGoogle APIにアクセスする必要がある場合があります、それはオフラインシナリオです。オフラインシナリオでは、最初の認証コード交換中に更新トークンが取得されます。
したがって、refersh_tokenを取得できるシナリオはすべてではありません。
https://developers.google.com/identity/protocols/OAuth2WebServer#offline にコンテンツを含めることができます。
2016年3月以降、Prompt=consent
を使用してGoogle API更新トークンを再生成します。
https://github.com/googleapis/oauth2client/issues/45 で述べたように、
authorization_Prompt = forceは
Prompt=none|consent|select_account
に置き換えられました