IONI C 4 - Angular / Firestore - PullRequest
       0

IONI C 4 - Angular / Firestore

0 голосов
/ 05 февраля 2020

У меня проблема с аутентификацией и профилем пользователя. Я использую ioni c v4 / angular и firestore. В настоящее время я могу войти в систему по электронной почте и паролю, но когда я хочу в профиле go получить эти данные пользователя, я вижу пустую страницу.

Здесь мой user.service.ts

import { Injectable } from '@angular/core'
import { AngularFireAuth } from '@angular/fire/auth'
import { first } from 'rxjs/operators'
import { auth } from 'firebase/app'

interface user {
    username: string,
    uid: string
}

@Injectable()
export class UserService {
    private user: user

    constructor(private afAuth: AngularFireAuth) {

    }

    setUser(user: user) {
        this.user = user
    }

    getUsername(): string {
        return this.user.username
    }

    reAuth(username: string, password: string) {
        return this.afAuth.auth.currentUser.reauthenticateWithCredential(auth.EmailAuthProvider.credential(username, password))
    }

    updatePassword(newpassword: string) {
        return this.afAuth.auth.currentUser.updatePassword(newpassword)
    }

    updateEmail(newemail: string) {
        return this.afAuth.auth.currentUser.updateEmail(newemail)
    }

    async isAuthenticated() {
        if(this.user) return true

        const user = await this.afAuth.authState.pipe(first()).toPromise()

        if(user) {
            this.setUser({
                username: user.email.split('@')[0],
                uid: user.uid
            })

            return true
        }
        return false
    }

    getUID(): string {
        return this.user.uid
    }
}

Здесь мой login.page.ts

export class LoginPage implements OnInit {

    username: string = ""
    password: string = ""

    constructor(public afAuth: AngularFireAuth, public user: UserService, public router: Router) { }

    ngOnInit() {
    }

    async login() {
        const { username, password } = this
        try {
            // kind of a hack. 
            const res = await this.afAuth.auth.signInWithEmailAndPassword(username, password)

            if(res.user) {
                this.user.setUser({
                    username,
                    uid: res.user.uid,
                })
                console.log(res.user.uid)
                this.router.navigate(['/home-results'])
            }

        } catch(err) {
      alert("Bad Credentials")
            console.dir(err)
            if(err.code === "auth/user-not-found") {
                console.log("User not found")
            }
        }
    }
}

profil.page.ts

@Component({
  selector: 'app-profil',
  template: `
  <!-- User logged in -->
  <ng-template #authenticated>
  <div *ngIf="auth.user | async as user">
    <h3>Howdy, {{ user.username }}</h3>
    <p>UID: {{ user.uid }}</p>
    <!-- <p>Favorite Color: {{ user.countryBirth }} </p> -->
    <button (click)="auth.signOut()">Logout</button>
  </div>
  </ng-template>`,


  styleUrls: ['./profil.page.scss'],
})
export class ProfilPage {

  constructor(public auth: AuthService ,public user:UserService){}

}

Ответы [ 4 ]

1 голос
/ 06 февраля 2020

Я не уверен, в какой степени Firebase Authentication будет поддерживать профиль пользователя (хотя сторонняя аутентификация, такая как Facebook, предоставит объекту аутентификации информацию о пользователе, но вы не сможете обновить его). Возможно, вы захотите сохранить профили пользователей в FireStore через документ User в коллекции Users, используя UID Firebase в качестве одного из свойств документа. Таким образом, вы можете хранить пользовательские данные профиля пользователя, задав c в соответствии с потребностями вашего приложения.

AngularFire docs может помочь вам настроить коллекции и показать, как получить / установить документы в коллекции. Но, в частности, что касается вашего вопроса о том, как получить данные аутентификации пользователя, вы можете подписаться на аутентификацию Firebase Authestate, которая предоставит вам всю информацию аутентификации пользователя, включая электронную почту и UID.

user.service.ts

user: any = null;

constructor(private afAuth: AngularFireAuth){  }

init(){
   this.afAuth.authState.subscribe(auth => {
     this.user = auth;
   });
}

app.component.ts

constructor(public userService: UserService){
  this.userService.init();
}

У меня есть стартер Ioni c Firebase Auth repo , который вы также можете найти полезным для справки.

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

0 голосов
/ 26 марта 2020

Наконец-то я нашел и решил свою проблему.

  constructor(
    private afAuth: AngularFireAuth,
    private afs: AngularFirestore,
    private router: Router,
    public auth: AuthService
  ) {
    this.user$ = this.afAuth.authState.pipe(
      switchMap(user => {
        if (user) {
          console.log(user.email)
          console.log(user.uid)
          return this.afs.doc<User>(`users/${user.uid}`).valueChanges();
        } else {
          return of(null);
        }
      })
    );
  }
0 голосов
/ 06 февраля 2020

Я заменяю текущую строку следующим:

this.usersCollection = afs.collection<User>('users'+ firebase.auth().currentUser.uid);

вместо

this.usersCollection = afs.collection<User>('users/');

, но html все еще пусто

0 голосов
/ 05 февраля 2020

Вместо использования Маршрутизатор попробуйте использовать NavController

import { NavController } from '@ionic/angular';

constructor(private navCtrl: NavController) {
   if (this.user) {
     this.navCtrl.navigateRoot('/home-results');
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...