Auth0“找不到服务”错误

时间:2017-04-16 02:21:04

标签: node.js express auth0

我正在尝试使用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`);

};

有关我可能做错的任何建议吗?

2 个答案:

答案 0 :(得分:3)

问题是我在Auth0上调用了错误的URL。我错误地认为授权和令牌端点都以/oauth开头,而实际上授权端点只是/authorize,而令牌端点是/oauth/authorize。更正我的代码中的URL修复了问题。

答案 1 :(得分:1)

我的解决方案是找不到api的标识符。如果不正确,将找不到它。我在“受众群体”中加了一个反斜杠,其中标识符没有。很简单的错误,但是在Auth0中错误不是很明显。