【问题标题】:Get refresh token google api获取刷新令牌google api
【发布时间】:2012-02-15 01:45:42
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

通过将其添加到您的 url 参数中发现

approval_prompt=force

更新:

请改用access_type=offline&amp;prompt=consent

approval_prompt=force 不再有效 https://github.com/googleapis/oauth2client/issues/453

【讨论】:

  • 为什么它不能与 Auto 一起使用?我不希望用户每次都授予权限。我怎么能克服这个?
  • 因为 reresh 令牌只在第一次授予应用程序权限时返回。之后,所有带有 approval_prompt=auto 的请求都不再具有 refresh_token。检查这个答案以获得更详细的解释stackoverflow.com/a/10857806/987864
  • 当你需要 refresh_token 时,你需要access_type=offline
  • 已编辑对有效内容的答案,因为该答案已过时且似乎不再有效。我花了很多时间尝试这个,因为有多个地方说要使用这种方法。我终于阅读了文档(我应该先完成),它说你必须使用prompt=consent。参考:developers.google.com/identity/protocols/…
  • @Daan 和@Goblinlord 都是正确的,即使在阅读了他们的 cmets 之后,我也对此感到困惑。事实上,我们两者都需要,access_type=offline&amp;prompt=consent。否则refresh_token 将不存在。
【解决方案2】:

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

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

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

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

如上面的引用所述,为了在已经收到一个 refresh_token,您需要通过提示将您的用户发回,您可以通过设置@ 987654332@转force

干杯,

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

【讨论】:

  • 我要补充一点,如果您丢失了refresh token,或者您的用户撤销了您的访问权限,您只需要获得一个new refresh token。否则,您可以继续使用相同的refresh token 来获取新的access tokens。
  • 我有一个 CMS,不同的用户使用不同的谷歌帐户连接到分析 api。但是,有时多个用户可以使用同一个公司 Google 帐户进行连接,但每个用户都希望访问不同的 Analytics 帐户。只有第一个接收刷新令牌,而所有其他人都没有,因此必须每小时重新连接。有没有办法为后续身份验证获取相同的刷新令牌,而不仅仅是在一小时内到期的 access_token?
  • 是的。去做就对了。当您发送请求时,您将获得访问令牌和刷新令牌。
  • 我正在努力获得一个 refresh_token,而你用解决方案启发了我!!! “因此,当您已经授予访问权限时,即使在同意页面的查询字符串中将 access_type 设置为离线,后续对授权代码的 grant_type 的请求也不会返回 refresh_token。”
【解决方案3】:

你想要的是access_type=offline

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

查看更多详情: https://developers.google.com/accounts/docs/OAuth2WebServer#offline

【讨论】:

  • 链接的那个页面声明 Google 客户端会在访问令牌过期时负责更新(更新令牌大概在秘密 XML 文件中),但没有显示您将如何检测到访问令牌已更改,以便可以将其保存在应用程序中以供下次访问。是否对此有回调,或者应用程序是否应该始终检查访问令牌是否在其执行的每个远程访问中发生更改?
【解决方案4】:

这是使用谷歌官方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

【讨论】:

    【解决方案5】:

    对于我们的应用,我们必须使用这两个参数 access_type=offline&amp;prompt=consentapproval_prompt=force 对我们不起作用

    【讨论】:

    • 谢谢 Ricky,这对我也有用。我认为较早的答案,建议approval_prompt=force,当时可能是正确的,但不再有效。这里有一些讨论:github.com/google/oauth2client/issues/453
    • "approval_prompt=force" 为我工作
    【解决方案6】:

    您好,我按照以下步骤操作,并且能够获取刷新令牌。

    授权流程有两个步骤。

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

      为此,发送一个发布请求,提供以下参数。 'scope=' + SCOPE + '&amp;client_id=' + CLIENTID + '&amp;redirect_uri=' + REDIRECT + '&amp;response_type=' + TYPE + '&amp;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",

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

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

    【讨论】:

      【解决方案7】:

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

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

      您可以在https://developers.google.com/identity/protocols/OAuth2WebServer#offline 中获取内容 .

      【讨论】:

        【解决方案8】:

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

        正如https://github.com/googleapis/oauth2client/issues/453中提到的,

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

        【讨论】:

          【解决方案9】:

          对于那些使用 PHP 的 Google API Client Library 并寻求离线访问和刷新令牌的人,在撰写本文时要小心,文档显示的示例不正确。

          目前正在显示:

          $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
          

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

          所有这些都很好——除了一件

          $client->setApprovalPrompt("consent");
          

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

          $client->setPrompt("consent");
          

          这是有道理的,因为使用 HTTP 请求时,它已从 approval_prompt=force 更改为 prompt=consent。因此,将 setter 方法从 setApprovalPrompt 更改为 setPrompt 遵循自然约定 - 但它不在文档中!!!我至少找到了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-10-13
            • 2016-01-26
            • 2014-07-15
            • 1970-01-01
            • 1970-01-01
            • 2013-06-14
            • 2016-08-03
            相关资源
            最近更新 更多