我是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错误。
老实说,我很迷茫,对于适合我的应用程序的主题,似乎没有很好的帮助来源。如果有人对此主题有经验,请告诉我!
谢谢