我在我的网络应用上使用Angular 2和Auth0进行身份验证。我可以使用以下代码获取用户配置文件:
auth0 = new auth0.WebAuth({
domain: 'MY-DOMAIN',
clientID: 'MY-CLIENT-ID',
callbackURL: 'MY-CALLBACK',
responseType: 'token id_token'
});
登录:
public login(username: string, password: string): void {
this.auth0.client.login({
realm: 'Username-Password-Authentication',
username,
password
}, (err: any, authResult: any) => {
if (err) {
alert('Error: ' + err.description);
return;
}
if (authResult && authResult.idToken && authResult.accessToken) {
this.setUser(authResult); <--- Here is where I get the profile
this.router.navigate(['/home']);
}
});
}
在token
上保存localStorage
并获取个人资料:
private setUser(authResult: any): void {
localStorage.setItem('access_token', authResult.accessToken);
localStorage.setItem('id_token', authResult.idToken);
this.auth0.client.userInfo(authResult.accessToken, (error: any, profile: any) => {
if (!error) {
localStorage.setItem('profile', JSON.stringify(profile));
this.userProfile = profile;
}
});
}
这样可行,但我得到的配置文件对象不包含auth0网站上配置的user_metadata或app_metadata。我怎么能包括它?
答案 0 :(得分:2)
您可以使用Auth0 Hook。登录Auth0并在左侧导航窗格中选择“Hooks”。在“客户端凭据交换”下,创建一个新的挂钩。在这里,您可以添加到默认情况下您的应用程序传递给Lock API的范围。添加以下行:
access_token.scope.push('user_profile');
我认为应该同时包含user_metadata和app_metadata。
您应该能够在不使用钩子的情况下从客户端本身指定它。如果你签出this link,它应该显示一些你可以指定的关于scope参数的额外选项。此示例看起来特别有用:
var options = { auth: {
params: {scope: 'openid email user_metadata app_metadata picture'}, }};
答案 1 :(得分:2)
Deevz的答案是正确的,接受它,所以它被标记为这样。不过,我想扩展它。您必须向auth0客户端添加新规则。这是在&#39;规则&#39;中完成的。部分。
function (user, context, callback) {
var namespace = 'unique-namespace';
context.idToken[namespace + 'app_metadata'] = user.app_metadata;
context.idToken[namespace + 'user_metadata'] = user.user_metadata;
context.accessToken[namespace + 'app_metadata'] = user.app_metadata;
context.accessToken[namespace + 'user_metadata'] = user.user_metadata;
callback(null, user, context);
}
我希望它有所帮助。