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

Dar*_*man 37 google-api google-oauth

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

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

但有时候(迄今为止只有两次超过6个月)我经历过一些奇怪的行为:

对Google API的请求返回Invalid Credentials(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. 请求提要响应"无效凭据"错误.
  4. 所有其他令牌仍然工作得很好,这意味着代码是有效的.

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

问题

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

Pau*_*cus 20

根据错误和错误代码的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"
  }
}
Run Code Online (Sandbox Code Playgroud)

这与您的错误版本完全匹配,因此很可能是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次错误,那么你很幸运!

  • 当我尝试通过google Plus登录时,我得到了一个access_token,但在使用该access_token时,我去获取用户信息,它给了我401错误.如果我的凭证有误,那么我该如何获得访问令牌?如果我有访问令牌那么为什么它不给我任何结果?请帮忙 :( (2认同)

Ada*_*han 7

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

session_start(); //starts a session
session_unset(); //flushes out all the contents previously set
Run Code Online (Sandbox Code Playgroud)

记得session_unset()在干运行后取下一次.

  • 仅对我有用的答案,谢谢。 (2认同)