我无法使用我的代码获取刷新令牌。我只能获取访问令牌,令牌类型等。我已经按照一些教程,例如将access_type=offline
放在我的登录URL上:
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参数找到
approval_prompt =力
如果我可以扩展user987361的答案:
来自OAuth2.0文档的offline access部分:
当您的应用程序收到刷新令牌时,存储该刷新令牌以供将来使用非常重要。如果您的应用程序丢失了刷新令牌,则必须在获得另一个刷新令牌之前重新提示用户同意。如果需要重新提示用户同意,请在授权代码请求中包含
approval_prompt
参数,并将值设置为force
。
因此,当您已经授予访问权限时,即使grant_type
在同意页面的查询字符串中设置为authorization_code
,后续对refresh_token
的access_type
的请求也不会返回offline
。
如上面引用中所述,为了在收到refresh_token
之后获得新的approval_prompt
,您需要通过提示将用户发回,您可以通过将force
设置为blog post来完成。
干杯,
PS此更改也在access_type=offline
中公布。
你想要的是approval_prompt=force
。
这将在用户第一次授权应用程序时返回刷新令牌。后续调用不会强制您重新批准该应用程序(https://developers.google.com/accounts/docs/OAuth2WebServer#offline)。
详情请见:$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
这是使用谷歌官方SDK在PHP中的完整代码
access_type=offline&prompt=consent
对于我们的应用程序,我们必须使用这两个参数approval_prompt=force
。 https://accounts.google.com/o/oauth2/auth?
不适合我们
嗨,我按照以下步骤操作,我已经能够获得刷新令牌。
授权流程有两个步骤。
'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline'
URL获取授权码。
为此,发送提供以下参数的发布请求。 https://accounts.google.com/o/oauth2/token?
以上提供将获得授权码。因此,在您第一次尝试授权权限后,您将能够获得刷新令牌。后续尝试不会提供刷新令牌。如果您再次需要令牌,则撤消您应用程序中的访问权限。
希望这会帮助别人欢呼:)
OAuth在实模式下有两种情况。正常和默认的访问方式在线调用。在某些情况下,您的应用可能需要在用户不在场时访问Google API,这是离线方案。在第一次授权代码交换期间,在离线场景中获得刷新令牌。
所以你可以得到referh_token是一些场景,而不是全部。
你可以在prompt=consent
中获得内容。
自2016年3月起,使用https://github.com/googleapis/oauth2client/issues/453重新生成Google API刷新令牌。
如prompt=none|consent|select_account
所述,
approval_prompt = force已被qazxswpoi取代