Auth0 JWT作为访问令牌仅在第二次登录时进入

时间:2017-08-18 06:49:16

标签: auth0

我有这个问题,我不确定它是某个“错误”还是我的错。

所有这些都适用于ASP.NET Core Angular上的SAP,它正在托管页面上访问Auth0。

我已更新托管页面上的托管页面Auth0lock对象,以包含指定受众群体的params对象

var lock = new Auth0Lock(config.clientID, config.auth0Domain, {
  auth: {
    redirectUrl: config.callbackURL,
    responseType: 'token',
    params: {
      "audience": "https://api.webatom.com"
    }
  },
  assetsUrl:  config.assetsUrl,
  allowedConnections: connection ? [connection] : null,
  rememberLastLogin: !prompt,
  language: language,
  languageDictionary: languageDictionary,
  theme: {
    //logo:            'YOUR LOGO HERE',
    //primaryColor:    'green'
  },
  prefill: loginHint ? { email: loginHint, username: loginHint } : null,
  closable: false,
  // uncomment if you want small buttons for social providers
  // socialButtonStyle: 'small'
});

在第一次登录时,我得到了通常的auth结果,其中我收到JWT作为id_token和访问令牌的短字符串,我在auth0中没有收到有关帐户访问请求的消息。

在第二次登录和其他登录期间,我得到了我想要的东西。我收到消息,我将JWT作为访问令牌,id_token作为null。

如何从第一次登录开始就获得第二个结果?这是一个错误还是我做错了什么?

谢谢。

PS:我当时没有实施任何规则或挂钩。

2 个答案:

答案 0 :(得分:0)

作为第一步:https://jwt.io添加为允许的回叫客户端,将Auth0托管登录页面恢复为默认值(即删除您所做的更改),然后使用您自己的设置修改下面的网址,然后将其粘贴到浏览器网址并点击返回。

https://{{YOUR_TENANT}}.auth0.com/login?client={{YOUR_CLIENT_ID}}&redirectUrl=https://jwt.io&responseType=token&connection={{YOUR_CONNECTION_NAME}}&audience=https://api.webatom.com&scope=openid

一切顺利,它应返回JWT访问令牌并将其自动填充到JWT.io文本区域。

接下来,试试这个 - 改为使用Auth0的授权网址。再次,使用Auth0默认托管登录页面,而不是您修改过的页面。

https://{{YOUR_TENANT}}.auth0.com/authorize?client_id={{YOUR_CLIENT_ID}}&protocol=oauth2&redirect_uri=https://jwt.io&response_type=token&scope=openid profile&audience=https://api.webatom.com&nonce=123&state=xyz

应该是相同的结果。大概这就是你想要的每一次?

如果您确实需要Id令牌,则只需将responseType / response_type修改为token id_token

所以我建议你不要直接修改Lock的Auth0 Hosted Login页面设置(与身份验证相关的参数...),而只是根据上面/authorize端点的请求发送你想要的参数。 。例如,如果您使用auth0.js使用客户端应用程序,则可以在客户端设置所有内容,并在用户进行身份验证时将其发送完毕。

auth0.js库配置的示例代码段可能是:

  auth0 = new auth0.WebAuth({
    domain: AUTH_CONFIG.domain,
    clientID: AUTH_CONFIG.clientId,
    redirectUri: AUTH_CONFIG.callbackUrl,
    audience: "https://webapi.com",
    responseType: 'token id_token', // just use token if you don't need id token
    scope: 'openid profile read:book' // read:book is a scope defined for API  
  });

答案 1 :(得分:-1)

到目前为止,我找到了一项有趣的工作......

当返回不透明令牌时,您可以简单地复制其aud散列并在将JwtBearerOptions对象创建到启动类时将其粘贴到Audience参数中。

当在控制器api中使用[Authorize]注释时,这解决了无效受众的错误,这是我从一开始就需要jwt的主要原因。

我认为让观众为jwtBearer正确解码它的jwt的唯一方法是将受众设置在托管页面上,以便在访问令牌中使用JWT返回。