OAuth2.0令牌奇怪行为(无效凭据401)

时间:2013-07-23 14:50:10

标签: google-api google-oauth

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

  1. 用户确认使用所选范围访问Google帐户的权限。
  2. 检索刷新令牌并将其保存到长时间存储。
  3. 每次需要(如果访问令牌过期)访问令牌被检索并用于访问API。
  4. 但有时候(迄今为止只有两次超过6个月)我经历过一种奇怪的行为:

    对Google API的请求会返回无效凭据(401)错误。 刷新访问令牌(使用存储的刷新令牌)无济于事。

    以下是我在测试此问题时获得的一些结构化输出:

        + ------------------------------------------------------------------------- + 
        | 1.TRYING TO REFRESH THE TOKEN.                                            |
        | 2.DONE REFRESHING THE TOKEN.                                              |
        + ------------------------------------------------------------------------- + 
        |    access:           **************************************************** | 
        |   refresh:                  ********************************************* | 
        |   expires:                                                           3600 | 
        |   created:                                            2013-07-23 13:12:36 | 
        + ------------------------------------------------------------------------- + 
    

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

        + ------------------------------------------------------------------------- + 
        | 1. TRYING TO CHECK THE TOKEN .                                            |
        | 2. DONE CHECKING THE TOKEN THE TOKEN.                                     |
        + ------------------------------------------------------------------------- + 
        |       issued_to:                  ************.apps.googleusercontent.com |
        |        audience:                  ************.apps.googleusercontent.com |
        |         user_id:                                             ************ |
        |      expires_in:                                                     3600 |
        |           email:                                     **********@gmail.com |
        |  verified_email:                                                        1 |
        |     access_type:                                                  offline |
        |         scopes::                                                          |
        + ------------------------------------------------------------------------- + 
        | 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                                     |
        + ------------------------------------------------------------------------- + 
    

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

        Error calling GET https://www.googleapis.com/drive/v2/files (401) Invalid Credentials
    
        domain:         global
        reason:         authError
        message:        Invalid Credentials
        locationType:   header
        location:       Authorization
    

    我们也遇到过与日历相同的问题。 所以:

    1. 令牌之前有效(一切正常)。
    2. 刷新令牌仍然有效。
    3. 请求Feed以“无效凭据”错误响应。
    4. 所有其他令牌仍然运行良好,这意味着代码有效。
    5. 通常在撤销令牌时,尝试刷新令牌时会返回“invalid_grant”错误。

      问题

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

12 个答案:

答案 0 :(得分:19)

根据有关错误的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请求可以返回对实际诊断问题明显无益的错误。出于多种原因,我收到了“Invalid Credentials”错误。这几乎总是因为我做了一些我认为无关紧要的改变,但确实如此。

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

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

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

响应正文中的微小变化也会导致此错误。

我不知道你是如何通过REST调用或客户端lib发出请求的,但我使用ruby lib,它允许命令行界面进行API调用。我找到了这个& OAuth2 Playground非常有助于诊断Google API调用。

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

我还要说,如果你在6个月内只遇到过2次错误,那么你很幸运!

答案 1 :(得分:6)

当我尝试在Google控制台中更改重定向网址然后在服务器上更新我的json凭据文件时遇到此问题。我必须在重新开始之前清除会话变量。所以在你的项目中只需执行一次:

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

请记得在干运行一次后移除session_unset()

答案 2 :(得分:3)

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

首先我尝试刷新凭据。没有结果。然后我删除了我的应用程序(因为我仍然在开发环境,这没关系,但是如果你已经在生产中使用它,请小心这个行动),创建一个新的,在客户端更新凭证JSON。仍然没有结果。

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

清除Google Chrome中的存储空间对我有用(不知道什么'清除存储'正在清除的所有详细信息):

  1. F12 Ctrl + Shift + I
  2. var Promise = require("bluebird"); var request = Promise.promisify(require("request"), {multiArgs: true}); Promise.promisifyAll(request, {multiArgs: true}) var url_arr = ["https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=AIzaSyDe3MyoHI6aSbYKdHOXloz9QepAMfes9XE", "https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=AIzaSyDe3MyoHI6aSbYKdHOXloz9QepAMfes9XE"]; function* fetch(obj) { console.log("2") var myobj = yield request.getAsync(obj).promise(); console.log("3", myobj) return myobj; } url_arr.forEach(function (obj){ console.log("1", obj) var output = fetch(obj); console.log("4, ", output); }); 标签
  3. Application

答案 5 :(得分: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确保   按照自述文件中的说明操作。 " 您必须启用"通讯录API"和   " Google+ API"通过Google API控制台。"

在Google API控制台中启用这些功能会修复"无效凭据"我的问题。

答案 6 :(得分:0)

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

答案 7 :(得分: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'];

Google在其API指南中提供了这些注释,说明无论何时更改范围,都必须更新凭据。我相信这意味着,虽然我不确定,但必须更新令牌。旧令牌仍然由谷歌持有,它认为我只有只读访问权限,因此它会返回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中的Connected Apps并删除了旧的连接凭据。我不确定这一步是否必要,但我只是想访问我的个人帐户。然后,当我运行我的程序时,它促使我重新进行身份验证,一切正常,我没有收到身份验证错误。完成后,请务必删除已注释的行以使用已制作的令牌。我正在使用Google API quickstart.js文件来完成所有这些工作。

因此,当我更新我的范围时,旧令牌仍然使用只读范围,因此我会得到(401)无效凭据。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

userInfo: Invalid Credentials 我收到以下错误,因为我试图访问的范围数组元素即个人资料和电子邮件,这些链接是我从google + api范围页面获得的链接:某种程度上是虚假/无效的,所以我进入了我的同意屏幕,  在电子邮件配置文件openID 下,提到了 Google API的作用域下的,我将鼠标悬停在每个URL上,并用各自的URL替换了旧的URL,从而解决了我的错误

答案 10 :(得分:0)

也许这对某人有用:

使用Calendar API的JavaScript Google-API客户端时,我遇到了类似的问题。在随机时间它可以工作,但是大多数情况下我遇到相同的错误。添加范围,测试键,无济于事。几个小时后,我找到了这个解决方案,不知道为什么会起作用,但是它为我解决了这个问题:

<select id="Users" v-model="Selected">
    <option>--Select--</option>
    @foreach(var item in list)
    {
        <option id="@item.User" value="@item.Department">@item.User</option>
    }
</select>

答案 11 :(得分:-1)

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

Image