2017-02-21 20 views
1

Я использую Angular 2 и Auth0 для аутентификации в своем веб-приложении. Я могу получить профиль пользователя, используя следующий код:Включить user_metadata и app_metadata в JWT, используя 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; 
     } 
    }); 
} 

Так что это работает, но объект профиля, который я получаю, не включает user_metadata или app_metadata, настроенные на веб-сайте Auth0. Как я могу включить его?

ответ

1

Вы можете использовать крюк Auth0. Войдите в Auth0 и в навигационной панели слева выберите «Крючки». В разделе «Client Credentials Exchange» создайте новый крючок. Здесь вы можете добавить в области, которые по умолчанию ваше приложение переходит в API блокировки. Добавление следующей строки:

access_token.scope.push('user_profile'); 

Я считаю, что должны включать как user_metadata AND app_metadata.

Вы также должны указать это от клиента без использования крючка. Если вы выберете this link, он должен показать вам дополнительные опции, которые вы можете указать в отношении параметра области. Этот образец выглядит особенно полезным:

var options = { auth: { 
params: {scope: 'openid email user_metadata app_metadata picture'}, }}; 
0

Ответ Deevz верен, признайте его таким, чтобы он был помечен как таковой. Однако я хотел бы расширить его. Вы должны добавить новое правило к своему клиенту auth0. Это делается в разделе «Правила».

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

Надеюсь, это поможет.