2017-02-21 3 views
1

Ich verwende Angular 2 und Auth0 zur Authentifizierung in meiner Web-App. Ich bin in der Lage das Benutzerprofil mit dem folgenden Code zu erhalten:Include user_metadata und app_metadata in JWT mit Auth0

auth0 = new auth0.WebAuth({ 
    domain: 'MY-DOMAIN', 
    clientID: 'MY-CLIENT-ID', 
    callbackURL: 'MY-CALLBACK', 
    responseType: 'token id_token' 
}); 

Anmeldung:

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

Speicher token auf localStorage und bekommt das Profil:

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

das funktioniert so, aber Das Profilobjekt, das ich erhalte, enthält nicht die user_metadata oder die app_metadata, die auf der Auth0-Website konfiguriert sind. Wie kann ich es aufnehmen?

Antwort

1

Sie könnten einen Auth0-Haken verwenden. Logge dich in Auth0 ein und wähle auf der linken Seite "Hooks". Erstellen Sie unter "Client Credentials Exchange" einen neuen Hook. Hier können Sie den Bereichen hinzufügen, die Ihre App standardmäßig an die Sperr-API übergibt. Fügen Sie die folgende Zeile hinzu:

access_token.scope.push('user_profile'); 

Ich glaube, sollte sowohl user_metadata UND app_metadata enthalten.

Sie sollten in der Lage sein, dies auch vom Client selbst zu spezifizieren, ohne einen Haken zu verwenden. Wenn Sie this link auschecken, sollte es Ihnen einige zusätzliche Optionen anzeigen, die Sie in Bezug auf den Bereichsparameter angeben können. Dieses Beispiel sieht besonders nützlich aus:

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

Deevz Antwort ist richtig, akzeptieren Sie es, so dass es als solches gekennzeichnet ist. Ich möchte es jedoch erweitern. Sie müssen Ihrem auth0-Client eine neue Regel hinzufügen. Dies geschieht im Abschnitt "Regeln".

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

Ich hoffe, es hilft.