获取刷新令牌google api

时间:2012-01-20 13:45:46

标签: google-calendar-api token access-token gdata

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

9 个答案:

答案 0 :(得分:97)

通过将此添加到您的网址参数

找到

approval_prompt =力

答案 1 :(得分:57)

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

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

  

当您的应用程序收到刷新令牌时,它就是   存储该刷新令牌以供将来使用很重要。如果你的   应用程序丢失刷新令牌,它将不得不重新提示   用户在获得另一个刷新令牌之前获得同意如果你需要   要重新提示用户同意,请添加approval_prompt   授权代码请求中的参数,并将值设置为   force

因此,当您已授予访问权限后,grant_type authorization_code refresh_token的后续请求将不会返回access_type,即使offline设置为{{1}在同意页面的查询字符串中。

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

干杯,

PS此更改也在blog post中公布。

答案 2 :(得分:12)

你想要access_type=offline

这将在用户第一次授权应用时返回刷新令牌。后续调用不会强制您重新批准该应用(approval_prompt=force)。

详情请见: https://developers.google.com/accounts/docs/OAuth2WebServer#offline

答案 3 :(得分:9)

这是使用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

答案 4 :(得分:5)

您好我遵循了以下步骤,我能够获得刷新令牌。

授权流程有两个步骤。

  1. 是使用https://accounts.google.com/o/oauth2/auth?网址获取授权码。

    为此,发送一个提供以下参数的发布请求。 'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline'以上提供的内容将获得授权码。

  2. 使用https://accounts.google.com/o/oauth2/token?网址检索AcessToken和RefreshToken。 为此,发送提供以下参数的发布请求。

    &#34;代码&#34; :代码, &#34; CLIENT_ID&#34; :CID,     &#34; client_secret&#34; :CSECRET,     &#34; REDIRECT_URI&#34; :REDIRECT,     &#34; grant_type&#34; :&#34; authorization_code&#34;,

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

    希望这有助于有人欢呼:)

答案 5 :(得分:5)

对于我们的应用,我们必须使用这些参数 access_type=offline&prompt=consent approval_prompt=force 对我们无效

答案 6 :(得分:4)

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

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

您可以将内容放在https://developers.google.com/identity/protocols/OAuth2WebServer#offline

答案 7 :(得分:0)

自2016年3月起,使用prompt=consent重新生成Google API刷新令牌。

https://github.com/googleapis/oauth2client/issues/453中所述,

  

approval_prompt = force已替换为prompt=none|consent|select_account

答案 8 :(得分:0)

对于在撰写本文时使用Google API Client Library for PHP并寻求脱机访问和刷新令牌的用户,请注意,本文显示的示例不正确。

当前显示:

ModelA:
id = models.AutoField(primary_key=True)

ModelB:
id = models.AutoField(primary_key=True)
titlecomponent = models.ForeignKey('ModelA',on_delete=models.PROTECT)

来源:https://developers.google.com/identity/protocols/OAuth2WebServer#offline

所有这些都很好-除一件外

$client = new Google_Client();
$client->setAuthConfig('client_secret.json');
$client->addScope(Google_Service_Drive::DRIVE_METADATA_READONLY);
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
// offline access will give you both an access and refresh token so that
// your app can refresh the access token without user interaction.
$client->setAccessType('offline');
// Using "consent" ensures that your application always receives a refresh token.
// If you are not using offline access, you can omit this.
$client->setApprovalPrompt("consent");
$client->setIncludeGrantedScopes(true);   // incremental auth

经过一番推理,我将此行更改为以下内容,并一切正常

$client->setApprovalPrompt("consent");

这很有意义,因为使用HTTP请求时,它已从 approval_prompt = force 更改为 prompt = consent 。因此,将setter方法从 setApprovalPrompt 更改为 setPrompt 符合自然的惯例-但它不在DOCS中!!!我至少发现了。