40

通常,Google OAuth2.0 机制运行良好。

  1. 用户确认访问具有选定范围的 Google 帐户的权限。
  2. 检索刷新令牌并将其保存到长时间存储中。
  3. 每次需要(如果访问令牌过期)访问令牌都会被检索并用于访问 API。

但有时(到目前为止只有两次超过 6 个月)我经历了奇怪的行为:

对 Google API 的请求会返回 Invalid Credentials (401) 错误。刷新访问令牌(使用存储的刷新令牌)没有帮助。

这是我在测试此问题时得到的一些结构化输出:

    + -------------------------------------------------- ------------------------------------ +
    | 1.尝试刷新令牌。|
    | 2.完成刷新令牌。|
    + -------------------------------------------------- ------------------------------------ +
    | 使用权: ************************************************ **** |
    | 刷新:********************************************* |
    | 过期:3600 |
    | 创建时间:2013-07-23 13:12:36 |
    + -------------------------------------------------- ------------------------------------ +

我还尝试通过向 https://www.googleapis.com/oauth2/v1/tokeninfo发送请求来验证“新鲜”访问令牌

    + -------------------------------------------------- ------------------------------------ +
    | 1. 尝试检查令牌。|
    | 2.完成检查令牌令牌。|
    + -------------------------------------------------- ------------------------------------ +
    | 发给:************.apps.googleusercontent.com |
    | 观众:************.apps.googleusercontent.com |
    | 用户 ID:************ |
    | expires_in: 3600 |
    | 电子邮件:**********@gmail.com |
    | 验证电子邮件:1 |
    | access_type: 离线 |
    | 范围:: |
    + -------------------------------------------------- ------------------------------------ +
    | https://www.googleapis.com/auth/userinfo.email |
    | https://www.googleapis.com/auth/userinfo.profile |
    | https://www.googleapis.com/auth/plus.me |
    | https://www.googleapis.com/auth/drive |
    + -------------------------------------------------- ------------------------------------ +

但是当我尝试访问驱动器提要时,响应是:

    调用 GET https://www.googleapis.com/drive/v2/files 时出错 (401) 凭据无效

    领域:全球
    原因:authError
    消息:无效的凭据
    位置类型:标题
    地点:授权

我们在日历上也遇到了同样的问题。所以:

  1. 令牌之前有效(一切正常)。
  2. 刷新令牌仍然有效。
  3. 请求提要以“无效凭据”错误响应。
  4. 所有其他令牌仍然运行良好,这意味着代码是有效的。

通常,当令牌被撤销时,尝试刷新令牌时会返回“invalid_grant”错误。

问题

  1. 这种行为的原因是什么?如果刷新令牌被撤销或以其他方式无效,新访问令牌的请求是否会产生错误?
  2. 有没有办法验证刷新令牌?
4

13 回答 13

22

根据有关错误和错误代码的 Google API 文档:

https://developers.google.com/drive/handle-errors#401_invalid_credentials

401: Invalid Credentials

Invalid authorization header. The access token you're using is either expired or invalid.

error: {
  errors: [
   {
  "domain": "global",
  "reason": "authError",
  "message": "Invalid Credentials",
  "locationType": "header",
  "location": "Authorization",
  }
  ],
  "code": 401,
  "message": "Invalid Credentials"
  }
}

这与您的错误版本完全匹配,因此很可能 Google 认为您的请求有问题。

但是,众所周知,Google API 请求可能会返回明显无助于实际诊断问题的错误。由于多种原因,我收到了“无效凭据”错误。这几乎总是真的,因为我做了一些我认为无关紧要的改变,但确实如此。

我的第一个想法(在这里暗中拍摄)是转到 Google API 控制台:

https://code.google.com/apis/console

Google 的身份验证令牌验证程序 ( https://www.googleapis.com/oauth2/v1/tokeninfo ) 可以返回有效响应,但可能会更改客户端密码或客户端 ID。

即使响应正文中的微小变化也可能导致此错误。

我不知道您是如何发出请求的,无论是通过 REST 调用还是客户端库,但我使用 ruby​​ 库,它允许命令行界面进行 API 调用。我发现这个和 OAuth2 Playground 对诊断 Google API 调用非常有帮助。

仅供参考:我从 Google API 中只收到 2 个错误:“凭据无效”和“权限不足”。后者几乎总是与不良范围有关。前者几乎是其他一切。

我还要说,如果你在 6 个月内只经历了 2 次错误,那你是幸运的!

于 2013-07-23T18:00:37.113 回答
9

当我尝试在谷歌控制台中更改重定向 url,然后在服务器上更新我的 json 凭据文件时,我遇到了这个问题。在重新开始之前,我必须清除会话变量。因此,在您的项目中只需执行一次:

session_start(); //starts a session
session_unset(); //flushes out all the contents previously set

session_unset()记住在干运行一次后将其删除。

于 2016-09-26T07:28:07.030 回答
4

我在开发环境中。我也有这个问题。

首先,我尝试刷新凭据。没有结果。然后我删除了我的应用程序(因为我仍在开发环境中,没关系,但如果您已经在生产环境中使用此操作,请注意此操作),创建一个新应用程序,更新客户端上的凭据 JSON.. .仍然,没有结果。

我通过打开一个未登录我的 Google 帐户(私人浏览,因为我在 Firefox 上)的新浏览器实例解决了这个问题,再次登录我的 Google 帐户,并尝试使用我的客户端(这是一个 Web 应用程序)。我按预期被重定向到授权屏幕,之后,它对我来说很好。

于 2016-12-14T21:36:34.337 回答
4

也许这种行为是由于谷歌描述如下的限制:

当前每个客户端的每个用户帐户限制为 50 个刷新令牌。如果达到限制,创建新令牌会自动使最旧的令牌无效,而不会发出警告。此限制不适用于服务帐户。

用户帐户或服务帐户可以在所有客户端上拥有的令牌总数也有更大的限制。大多数普通用户不会超过这个限制,但开发者的测试帐户可能会

于 2018-02-26T19:01:53.127 回答
2

我最近遇到了这个奇怪的错误。我的解决方法:我在重定向到AuthUrl之前放置了取消设置所有会话的功能。

于 2016-09-15T22:56:52.577 回答
1

我对这个错误有同样的问题:

The redirect URI in the request, does not match the ones authorized for the OAuth client.

但是abhishek77in在这里找到了这个非常简单的解决方案:

https://coderwall.com/p/fmr5ag/avoid-invalid-credentials-with-google-oauth2

解决方案是:

如果您使用的是 https://github.com/zquestz/omniauth-google-oauth2 ,请确保遵循 README 中的说明。"您必须通过 Google API 控制台启用 "Contacts API" 和 "Google+ API"。 "

在 Google API 控制台中启用这些为我解决了“无效凭据”问题。

于 2018-03-29T18:49:18.350 回答
1

userInfo: Invalid Credentials 我收到以下错误,因为我试图访问的范围数组元素,即我从 google+ api 范围页面获得的链接的配置文件和电子邮件:以某种方式出现错误/无效,所以我进入了我的同意屏幕,并在Scopes for Google APIs下提到电子邮件配置文件 openID悬停在每个我到达那里的相应网址用这些替换我的旧网址解决了我的错误

于 2019-05-02T12:04:02.333 回答
1

清除 Google Chrome 中的存储对我有用(不知道“清除存储”正在清除的所有细节):

  1. F12( Ctrl+Shift+I)
  2. Application标签
  3. Clear storage
于 2018-01-10T15:11:27.807 回答
0

也许这对某人有帮助:

我在使用日历 API 的 JavaScript Google-API 客户端时遇到了类似的问题。在随机时间它会起作用,但大多数时候我得到了同样的错误。添加范围,测试密钥,没有任何帮助。几个小时后,我找到了这个解决方案,不知道它为什么有效,但它为我解决了这个问题:

gapi.client.init({
    'apiKey': API_KEY,  <-- DOESN'T WORK
    'clientId': CLIENT_ID,
    'discoveryDocs': DISCOVERY_URLS,
    'scope': SCOPE
}).then(function() {
    // gapi.client.setApiKey(API_KEY); <-- ADD THIS
})
于 2020-02-25T14:59:20.430 回答
0

(401) Invalid Credentials当我删除对特定应用程序的 Google 帐户的访问权限时,我收到了。所以我要做的就是再次请求授权 URL(以 开头的那个https://accounts.google.com/o/oauth2/auth)。

于 2017-05-25T13:03:45.660 回答
0

当我删除 c:\Users\[user]\.credentials 中的文件 json 时,我解决了这个问题。

于 2017-09-02T23:11:23.190 回答
0

当我需要将范围从只读更改为读写所有文件时,我遇到了同样的问题。因此,我将文件顶部的范围从只读更新为:

// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/sheets.googleapis.com-nodejs-quickstart.json
var SCOPES = ['https://www.googleapis.com/auth/drive'];

谷歌,从他们的 API 指南,有这些评论说,每当你改变范围时,你必须更新凭据。我相信这意味着,尽管我不确定,令牌必须更新。旧令牌仍由 Google 持有,它认为我只有只读访问权限,因此它会返回 401 错误。所以,我需要重新制作我的令牌,但谷歌从未提供一个新的同意屏幕,允许我说允许读取和写入所有文件。所以,我需要让那个屏幕再次出现,所以它会创建一个新的令牌来替换旧的:

fs.readFile(TOKEN_PATH, function(err, token) {
    if (err) {
      getNewToken(oauth2Client, callback);
    } else {
        getNewToken(oauth2Client, callback);
    //   oauth2Client.credentials = JSON.parse(token);
    //   callback(oauth2Client);
    }
  });

因为我已经保存了一个令牌,所以它永远不会创建一个新的。所以,我只是注释掉了旧令牌的使用,并告诉它得到一个新的令牌,不管我们有没有。然后,我在 Google 中访问了我的已连接应用程序并删除了我的旧连接凭据。我不确定这一步是否必要,但我只是想访问我的个人帐户。然后,当我运行我的程序时,它提示我重新进行身份验证,一切正常,我没有收到身份验证错误。完成后,请确保删除注释掉的行以使用已制作的令牌。我正在使用 Google API quickstart.js 文件来完成所有这些工作。

因此,当我更新我的范围时,旧令牌仍在使用只读范围,因此我会得到 (401) Invalid Credentials。

于 2017-06-06T05:47:36.690 回答
-1

如果您使用的帐户是 GSuite 设置的一部分,则可能需要将 GSuite Basic 添加到该帐户。您可以通过用户 > 单击用户 > 许可证来实现此目的。

图片

于 2020-06-02T19:27:38.977 回答