Google OAuth:“ invalid_grant”还是一回事

时间:2019-03-08 15:24:45

标签: google-api google-oauth

我已经费了好几个小时才能将Google OAuth2流程输入到我的Node / Express应用程序中。基本知识很简单:

  1. 创建Google应用程序凭据
  2. 将用户重定向到同意屏幕
  3. 接收一个code
  4. codeaccess_token交换为refresh_token
  5. 存储refresh_token以备将来使用

无论出于何种原因,我都无法通过上面的第4步,总是得到以下响应:

{
  "error": "invalid_grant",
  "description": "Bad Request"
}

关于上述问题,还有很多其他解决方案,但还没有一种解决方案对我有效:

  • 无论结果如何,都不要使用相同的code
  • 添加新的授权重定向URI后请等待一段时间
  • http://localhost:3000 包含为授权的重定向URI
  • 包括所有带有/不带有协议,端口,斜杠的变体
  • 如有需要,可以将access_type设置为 offline (确实如此)
  • 使用请求而不是Axios
  • 包括一个空scope参数,例如OAuth Playground
  • 使用查询字符串编码参数
  • 确认application/x-www-urlencoded是内容类型
  • 重试时注销所有Google帐户
  • 请注意Google的令牌创建限制

根据上述情况,这是我的困境的具体情况:

主机http://localhost:3000

回调#1 http://localhost:3000/auth/google/callback发送code并运行下面的交换操作

回调#2 http://localhost:3000/auth/google/callbacktwo其中应返回access_tokenrefresh_token

交换操作:针对请求模块进行了调整

{
    method: 'POST',
    uri: 'https://www.googleapis.com/oauth2/v4/token',
    headers: {
      'content-type': 'application/x-www-form-urlencoded'
    },
    body: {
      'code': req.query.code,
      'redirect_uri': 'http://localhost:3000/auth/google/callbacktwo',
      'client_id': '***.apps.googleusercontent.com',
      'client_secret': '***',
      'scope': null,
      'grant_type': 'authorization_code'
    }
}

授权的重定向URI :在应用程序>凭据> OAuth 2.0客户端ID中可见

See screenshot


总而言之,我被困住了。我的设置/方法根本上有问题,或者我是第一个遇到此错误的开发人员(后者不能成立)。也可以支付协助费用。

1 个答案:

答案 0 :(得分:0)

在令人震惊的事件中,我解决了此问题,发布时间超过了以下内容:


更改#1

  

在我的“授权重定向URI”列表中添加了“ http://127.0.0.1”变体

由于'127.0.0.1'等同于'localhost',以为我会尝试一下。在其他地方阅读。


更改#2

  

将Exchange操作的redirect_uri更改为回调#1,即发送code的位置。

我想“如果Google不喜欢redirect URI而不是它发送code的地方会怎样?”


更改#3

  

删除了Exchange操作的scope参数

尽管在OAuth Playground中清晰可见,但在文档中却没有。


结果如何?收到了我一直寻找了几个小时的物体:

{
   "access_token": "****",
   "expires_in": 3600,
   "refresh_token": "***",
   "scope": "https://www.googleapis.com/auth/userinfo.profile",
   "token_type": "Bearer",
   "id_token": "*****"
}

免责声明:这并不意味着以上内容对您有用,但对我有用,我会接受。