我有这个问题,我不确定它是某个“错误”还是我的错。
所有这些都适用于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:我当时没有实施任何规则或挂钩。
答案 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返回。