【问题标题】:IONIC 4 - Angular / FirestoreIONIC 4 - Angular / Firestore
【发布时间】:2020-05-21 16:29:18
【问题描述】:

我遇到了有关身份验证和用户配置文件的问题。 我正在使用 ionic v4 / angular 和 firestore。 目前我可以通过电子邮件和密码登录,但是当我想进入个人资料以获取此用户数据时,我面对的是一个空白页面。

这里是我的 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")
            }
        }
    }
}

profile.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){}

}

【问题讨论】:

    标签: angular typescript firebase google-cloud-firestore ionic4


    【解决方案1】:

    我不确定 Firebase 身份验证会在多大程度上维护用户配置文件(尽管 Facebook 等第三方身份验证会向身份验证对象提供用户详细信息,但您无法更新它们)。您可能希望通过将 Firebase UID 作为文档属性之一的用户集合中的用户文档来维护 FireStore 中的用户配置文件。这样,您可以存储特定于您的应用需求的自定义用户配置文件数据。

    AngularFire docs 可以帮助您设置集合并向您展示如何获取/设置集合中的文档。但特别是关于如何获取用户身份验证数据的问题,您可以订阅 Firebase 身份验证身份验证状态,该身份验证状态将为您提供所有用户身份验证信息,包括电子邮件和 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();
    }
    

    我有一个 Ionic Firebase Auth starter repo,您可能会发现它对您有参考价值。

    希望这会有所帮助。

    【讨论】:

    • 您好 Rich,非常感谢您的解释,我通过您更改了我的 user.service,但它仍然无法正常工作。我会检查你的 git repo 和你提供给我的文档。
    • 我的坏安东尼。我忘记包含从 app.component 到用户服务的必要 init() 调用。我更新了这个例子。希望这会让你做好准备。
    • 嗨 Rich,我正在关注您在 git 存储库上的工作。当我想访问用户配置文件时,我几乎解决了我的问题,除了关于“订阅”的最后一个问题。它注意到:无法读取属性“订阅”
    • 抱歉,Anthony,我无法重现该警告/错误。感觉好像在 Observable 可用之前发生了一些事情,使其无法订阅。请随时通过电子邮件与我们联系。也许共享一个或两个代码 sn-p,我们可以解决这个问题。您可以找到我的个人网站,然后在我的 SO 简历中发送电子邮件。
    【解决方案2】:

    尝试使用 NavController

    ,而不是使用 Router
    import { NavController } from '@ionic/angular';
    
    constructor(private navCtrl: NavController) {
       if (this.user) {
         this.navCtrl.navigateRoot('/home-results');
       }
    }
    

    【讨论】:

    • 嗨,Pablo,感谢您的回答,但它仍然无法正常工作。我仍然面对一个空白页
    【解决方案3】:

    我将当前行替换为以下内容:

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

    而不是

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

    但是html仍然是空白的

    【讨论】:

      【解决方案4】:

      最后,我找到并解决了我的问题。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-27
        • 2018-06-24
        • 1970-01-01
        • 2019-09-25
        • 1970-01-01
        • 2020-05-30
        • 2017-12-29
        • 2017-09-09
        相关资源
        最近更新 更多