使用来自GoogleAPI的JWT的Oauth2令牌回复“invalid_grant”

时间:2015-07-01 22:42:27

标签: javascript oauth oauth-2.0 google-oauth jwt

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

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

任何想法?如有必要,我也会发布代码,但我主要关注此Rothrocklink帖子。

我在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 个答案:

答案 0 :(得分:1)

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