在Node.js中使用JWT执行Oauth2令牌POST请求时发生错误“内部错误”“类型不正确的内容:multipart / form-data; boundary = ---...”

时间:2018-07-06 16:33:23

标签: node.js oauth-2.0 jwt token access

我是Node的初学者,正在尝试创建微服务以在Google的Dialogflow和公司的后端服务器之间路由API调用。我相信,为了进行API调用以编辑意图等,我需要一个Oauth2访问令牌,但是我一直试图获取该令牌。

我已经看到此错误在此之前发布:Unsupported content with type: multipart/form-data in google plus api oauth2

但是这些答案都没有(至少对我而言)有效,并且已经2岁了,所以认为值得重新撰写一篇文章。

我目前正在使用https://www.jwt.io中的以下jwt-generator.js创建JWT:

// Using CryptoJS library
const CryptoJS = require("crypto-js")

// Defining our token parts
var header = {
    "alg": "RS256",
    "typ": "JWT"
  };
  
  var claimSet = {
    "iss": "dialogflow-iprbag@PROJETID.iam.gserviceaccount.com",
    "scope": "google.cloud.dialogflow/",
    "aud": "https://www.googleapis.com/oauth2/v4/token",
    "exp": Math.floor(Date.now()/1000) + 3600,
    "iat": Math.floor(Date.now()/1000)
  };
  
  var secret = "-----BEGIN PRIVATE KEY-----blahblahblah-----END PRIVATE KEY-----\n";
  
  function base64url(source) {
    // Encode in classical base64
    encodedSource = CryptoJS.enc.Base64.stringify(source);
    
    // Remove padding equal characters
    encodedSource = encodedSource.replace(/=+$/, '');
    
    // Replace characters according to base64url specifications
    encodedSource = encodedSource.replace(/\+/g, '-');
    encodedSource = encodedSource.replace(/\//g, '_');
    
    return encodedSource;
  }
  
  var stringifiedHeader = CryptoJS.enc.Utf8.parse(JSON.stringify(header));
  var encodedHeader = base64url(stringifiedHeader);
  
  var stringifiedClaimSet = CryptoJS.enc.Utf8.parse(JSON.stringify(claimSet));
  var encodedClaimSet = base64url(stringifiedClaimSet);
  
  var signature = stringifiedHeader + "." + stringifiedClaimSet;
  signature = CryptoJS.HmacSHA256(signature, secret);
  signature = base64url(signature);
  
  console.log(encodedHeader + "." + encodedClaimSet + "." + signature);

然后我将使用以下token-get.js节点脚本通过POST请求将生成的JWT发送到Oauth2令牌服务器:

const request = require('request')

var formData = {
    "grant_type": "urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer",
    "assertion": JWT_HERE,
    "Content-Type": "application/x-www-form-urlencoded"
}

request.post({url:'https://www.googleapis.com/oauth2/v4/token', formData: formData}, function(req, err, res) {
    console.log(res)
}) 

据我了解,grant_type标头是恒定的,但是当我在邮递员中测试此请求时,我收到无效的grant_type错误。当我运行token-get.js时,出现了不受支持的dataForm错误。

老实说,我很迷茫,对于适合我的应用程序的主题,似乎没有很好的帮助来源。如果有人对此主题有经验,请告诉我!

谢谢

0 个答案:

没有答案