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); });
同样重要的是如何在正确的头部传递令牌。