5 votes

Angular2 Firebase Set User Custom Propertise (en anglais)

J'ai essayé de définir les propriétés ou les attributs personnalisés de l'utilisateur à l'aide de la fonction auth.updateProfile mais elle n'enregistre que displayName car elle est mentionnée dans son docs :

this.af.auth.createUser({
   email: formData.value.email,
   password: formData.value.password,
}).then((user) => {
   let userProfile = formData.value;
   userProfile.role = AuthService.ROLE_PATIENT;
   userProfile.displayName = `${formData.value.firstName} ${formData.value.lastName}`;
   user.auth.updateProfile(userProfile).then(function(){
   this.router.navigate(['/']);  
}); 

Problème maintenant, comment puis-je définir les propriétés personnalisées de l'utilisateur afin de pouvoir les obtenir dans FirebaseAuthState

Question : Pourquoi dois-je enregistrer les propriétés personnalisées avec chaque utilisateur ?

Réponse : Parce que je travaille avec Auth Guard pour activer une route particulière en utilisant role qui est sauvegardée dans l'exemple de base de données :

canActivate(route: ActivatedRouteSnapshot,
              state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    //Currently I'm using this which only check that user is logged in or not
    return this.auth
      .take(1)
      .map((authState: FirebaseAuthState) => !!authState)
      .do(authenticated => {
        if (!authenticated) this.router.navigate(['/login']);
      });   
  }

Mais je veux une vérification supplémentaire pour valider que l'utilisateur a le rôle de patient que j'ai enregistré lors de la création de l'utilisateur ci-dessus, par exemple : return user.role == 'patient'

1voto

Frank van Puffelen Points 16029

Les fournisseurs d'identité existants dans Firebase Authentication n'ont aucun moyen d'ajouter des propriétés personnalisées. Si vous souhaitez ajouter des propriétés personnalisées, vous devrez soit implémenter un fournisseur d'identité personnalisé (cf. monnayage de jetons personnalisés dans le cadre d'un processus de confiance y se connecter avec un jeton personnalisé ) OU faire un consultation côté client des informations supplémentaires à partir d'une autre source de données (comme la base de données Firebase).

0voto

Chrillewoodz Points 10100

Vous pouvez peut-être faire quelque chose comme ça :

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    //Currently I'm using this which only check that user is logged in or not
    return this.auth
      .take(1)
      .map((authState: FirebaseAuthState) => {

        return this.af.database.list('/path/to/account').first().map((account: IAccount) => {

          if (authState && account.role === 'patient') {
            return true;
          }
          else {
            return this.router.navigate(['/login']);
          }
        });
      });
  }

C'est un peu tiré par les cheveux mais ça pourrait marcher. Ou vous aider à trouver une réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X