获取刷新令牌google api

问题描述 投票:69回答:8

我无法使用我的代码获取刷新令牌。我只能获取访问令牌,令牌类型等。我已经按照一些教程,例如将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。

google-calendar-api token access-token gdata
8个回答
97
投票

通过将此添加到您的url参数找到

approval_prompt =力


57
投票

如果我可以扩展user987361的答案:

来自OAuth2.0文档的offline access部分:

当您的应用程序收到刷新令牌时,存储该刷新令牌以供将来使用非常重要。如果您的应用程序丢失了刷新令牌,则必须在获得另一个刷新令牌之前重新提示用户同意。如果需要重新提示用户同意,请在授权代码请求中包含approval_prompt参数,并将值设置为force

因此,当您已经授予访问权限时,即使grant_type在同意页面的查询字符串中设置为authorization_code,后续对refresh_tokenaccess_type的请求也不会返回offline

如上面引用中所述,为了在收到refresh_token之后获得新的approval_prompt,您需要通过提示将用户发回,您可以通过将force设置为blog post来完成。

干杯,

PS此更改也在access_type=offline中公布。


12
投票

你想要的是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


9
投票

这是使用谷歌官方SDK在PHP中的完整代码

access_type=offline&prompt=consent

6
投票

对于我们的应用程序,我们必须使用这两个参数approval_prompt=forcehttps://accounts.google.com/o/oauth2/auth?不适合我们


5
投票

嗨,我按照以下步骤操作,我已经能够获得刷新令牌。

授权流程有两个步骤。

  1. 是使用'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline' URL获取授权码。 为此,发送提供以下参数的发布请求。 https://accounts.google.com/o/oauth2/token?以上提供将获得授权码。
  2. 使用https://developers.google.com/identity/protocols/OAuth2WebServer#offline URL检索AcessToken和RefreshToken。为此,发送提供以下参数的发布请求。 “code”:code,“client_id”:CID,“client_secret”:CSECRET,“redirect_uri”:REDIRECT,“grant_type”:“authorization_code”,

因此,在您第一次尝试授权权限后,您将能够获得刷新令牌。后续尝试不会提供刷新令牌。如果您再次需要令牌,则撤消您应用程序中的访问权限。

希望这会帮助别人欢呼:)


4
投票

OAuth在实模式下有两种情况。正常和默认的访问方式在线调用。在某些情况下,您的应用可能需要在用户不在场时访问Google API,这是离线方案。在第一次授权代码交换期间,在离线场景中获得刷新令牌。

所以你可以得到referh_token是一些场景,而不是全部。

你可以在prompt=consent中获得内容。


0
投票

自2016年3月起,使用https://github.com/googleapis/oauth2client/issues/453重新生成Google API刷新令牌。

prompt=none|consent|select_account所述,

approval_prompt = force已被qazxswpoi取代

© www.soinside.com 2019 - 2024. All rights reserved.