我正在尝试使用Auth0发布JWT令牌来访问我的API(以便Auth0处理所有OAuth和安全问题等,而我的API只需要检查令牌)。当我尝试测试授权代码流以便客户端接收访问令牌(使用Node + Express)时,会发生以下情况:
授权代码请求正常,客户端将重定向回我的redirect_uri,并将代码附加到查询中。一切都好。
然后令牌请求总是失败。如果我包含audience
参数,则请求会返回access_denied
错误,其中包含以下详细信息:Service not found: {the audience parameter}
,无论我为audience
参数设置了什么值。
如果我不包含audience
参数,我会收到server_error
消息Service not found: https://oauth.auth0.com/userinfo
。
我已经检查了每个Auth0设置并彻底阅读了每个文档页面,到目前为止还没有任何工作。我还测试了Auth0的API调试器中的授权代码流程,它运行良好。我的测试遵循完全相同的参数,但仍然收到请求令牌的错误。我在localhost上测试。客户端凭据和隐式流程正常工作。
这是我创建的测试端点,它从Auth0:
中检索授权代码
const qs = require('querystring');
const getCode = (req, res) => {
const params = {
audience, // the value of the API Audience setting for the client
client_id, // the client ID
redirect_uri, // the redirect_uri, which is also listed in the Allowed Callback URLs field
response_type: `code`,
scope: `offline_access open` // ask to return ID token and refresh token,
state: `12345`,
};
const authDomain = `mydomain.auth0.com/oauth`;
res.redirect(`${authDomain}/oauth/authorize?${qs.stringify(params)}`);
};
redirect_uri
然后重定向到以下端点,在那里我发出访问令牌请求:
const https = require('https');
const callback = (req, res) => {
const body = {
client_id,
client_secret,
code: req.query.code,
grant_type: `authorization_code`,
redirect_uri, // same value as provided during the code request
};
const opts = {
headers: { 'Content-Type': `application/json` },
hostname: `mydomain.auth0.com`,
method: `POST`,
path: `/oauth/token`,
};
const request = https.request(opts, response => {
let data = ``;
response.on(`data`, chunk => { data += chunk; });
response.on(`error`, res.send(err.message));
response.on(`end`, () => res.json(JSON.parse(data))); // this executes, but displays the error returned from Auth0
});
request.on(`error`, err => res.send(err.message));
request.end(JSON.stringify(body), `utf8`);
};
有关我可能做错的任何建议吗?
答案 0 :(得分:3)
问题是我在Auth0上调用了错误的URL。我错误地认为授权和令牌端点都以/oauth
开头,而实际上授权端点只是/authorize
,而令牌端点是/oauth/authorize
。更正我的代码中的URL修复了问题。
答案 1 :(得分:1)
我的解决方案是找不到api的标识符。如果不正确,将找不到它。我在“受众群体”中加了一个反斜杠,其中标识符没有。很简单的错误,但是在Auth0中错误不是很明显。