来自 GoogleAPI 的带有 JWT 的 Oauth2 令牌响应“invalid_grant”

Posted

技术标签:

【中文标题】来自 GoogleAPI 的带有 JWT 的 Oauth2 令牌响应“invalid_grant”【英文标题】:Oauth2 token response "invalid_grant" with JWT from GoogleAPI 【发布时间】:2015-09-19 07:01:56 【问题描述】:

我已从 Google API 控制台启用服务帐户来执行 two-legged OAuth 以调用 Google Analytics API。我正在使用 javascript 并按照 pure JavaScript implementation of JWT and JWS 生成签名的 JWT 并按照 guide 中的描述对令牌进行 HTTP/REST 调用。一旦我使用encodedURL 创建POST,我会得到一个400“错误”:“invalid_grant”。 "error_description": "错误请求"

我阅读了一些帖子以确保在请求中包含电子邮件而不是 client_id。我确定确实如此,从那时起,Google 更新了他们的文档。

有什么想法吗?如有必要,我也会发布代码,但我主要关注Rothrock 在link 上的帖子。

我在http://jwt.io/ 上尝试了签名的 JWT,它说它是无效的签名。 payloadheader 解码正确。有没有办法在使用 Google API 控制台提供的私钥编码后测试签名?

这是我的代码:

  var pHeader = "alg":"RS256", "typ":"JWT";
  var sHeader = JSON.stringify(pHeader);
  var pClaim =;
  pClaim.iss = "(ServiceAccount_Email_Address).apps.googleusercontent.com";
  pClaim.scope = "https://www.googleapis.com/auth/analytics.readonly";
  pClaim.aud = "htps://www.googleapis.com/oauth2/v3/token";
  pClaim.exp = KJUR.jws.IntDate.get("now + 1hour");
  pClaim.iat = KJUR.jws.IntDate.get("now");

  var sClaim = JSON.stringify(pClaim);

  var key = "-----BEGIN PRIVATE KEY----- Private Key from JSON file ----END PRIVATE KEY-----"; 

  var sJWS = KJUR.jws.JWS.sign('RS256', sHeader, sClaim, key);
  var urlEncodedData = '';
  var urlEncodedDataPairs = [];
  var token;
  urlEncodedDataPairs.push("grant_type" + '=' + "urn:ietf:params:oauth:grant-type:jwt-bearer");
  urlEncodedDataPairs.push("assertion" + '=' + sJWS);
  urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g,'+');

 $(function()
    $.ajax(
              type: "POST",
              url: 'https://www.googleapis.com/oauth2/v3/token',
              data: urlEncodedData,
              dataType: 'JSON',
              contentType: 'application/x-www-form-urlencoded',
              success: function(result)
                console.log(JSON.stringify(result));
              
    );
 );

【问题讨论】:

【参考方案1】:

我在某个时候找到了这个问题的答案,但想在此处发布以进行澄清。上面代码中的所有内容都是正确的。提供的 SSH 密钥中有一些有效的 \n 字符。我的密钥在-----BEGIN PRIVATE KEY----- 和实际密钥字符串的开头之间有一条线。

【讨论】:

那么我是否必须删除私钥中的 25 个“\n”实例? No Brad 你不需要删除那些。

以上是关于来自 GoogleAPI 的带有 JWT 的 Oauth2 令牌响应“invalid_grant”的主要内容,如果未能解决你的问题,请参考以下文章

在 Postman 预请求脚本中生成 RSA JWT

用于向 Google API (Swift) 验证服务帐户的 JWT 签名无效

CORS 错误和带有 JWT 令牌的 403 响应

如何存储来自 Post-Response 的 JWT 并以 HTML 形式发送?

服务器 2008 上的 HttpTwo 客户端(带有 JWT 的 APNS)

带有 .NET JSON Web 令牌处理程序的 Google 身份工具包令牌验证异常