Auth0 / userinfo端点返回未经授权的错误

即使在Node.js应用程序中传递不记名标记,它也会导致未经授权的结果错误。

function getUser(authData){ var postData = querystring.stringify({ authorization: authData }); var options = { host: 'pole.auth0.com', method: 'GET', path: '/userinfo' }; //make request httpsRequest(postData, options) .then(function(result) { // success res.status(201).send({ 'success': true }); }, function(err) { res.status(500).send({ 'success': false, 'reasonCode': "Internal error." }); }); }; 

帮手function:

 function httpsRequest (data, options) { return new Promise(function (resolve, reject) { var req = https.request(options, function (res) { var result = ''; console.log(options); res.on('data', function (chunk) { result += chunk; }); res.on('end', function () { console.log("https end result - " + result); resolve(result); }); res.on('error', function (err) { reject(err); }) }); // req error req.on('error', function (err) { reject(err); }); //send request witht the postData form req.write(data); req.end(); }); } 

authData参数具有类似Bearer [token]的string值。 我正在使用https.request来发出api请求

代码有什么问题吗?

根据/userinfo 端点文档,您应该执行GET HTTP请求而不是POST ,另外还需要在Authorization标头中传递访问令牌。


更新:

问题在于如何尝试在授权标头中传递令牌。

您没有提到您用作HTTP客户端的东西,但是这里有一些使用request-promise作为Node HTTP客户端的示例代码; 这工作正常。

 var rp = require('request-promise'); var options = { uri: 'https://[YOUR_TENANT].auth0.com/userinfo', headers: { 'Authorization': 'Bearer [YOUR_ACCESS_TOKEN]' } }; rp(options) .then(function (info) { console.log('User information:', info); }) .catch(function (err) { // API call failed... }); 

更新2:

使用Node.js内置的HTTP客户端:

 const https = require('https'); var options = { hostname: '[YOUR_TENANT].auth0.com', port: 443, path: '/userinfo', method: 'GET', headers: { 'Authorization': 'Bearer [YOUR_ACCESS_TOKEN]' } }; var req = https.request(options, (res) => { res.on('data', (d) => { process.stdout.write(d); }); }); req.end(); req.on('error', (e) => { console.error(e); }); 

同样重要的是如何在正确的头部传递令牌。