使用Auth0

时间:2017-02-21 17:49:40

标签: angular authentication auth0

我在我的网络应用上使用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。我怎么能包括它?

2 个答案:

答案 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);
}

我希望它有所帮助。