angular - 选项卡之间的firebase身份验证持久性问题
问题描述
我正在使用 angular 和 ionic 开发一个应用程序,并且最近在该应用程序上获得了 firebase 身份验证。我遇到的问题是,当用户导航到“个人资料”选项卡并在该选项卡上登录他们的帐户时,他们会被重定向到个人资料页面,现在的问题是当我点击离开该选项卡然后返回他们现在的个人资料页面时再次提示登录页面。我不确定如何解决此问题我不知道用户是否正在注销,或者用户是否仍在登录,现在除非再次登录,否则无法访问他们的个人资料页面。这是该问题的简短演示https://youtu.be/4RQjesHBwvI
这是我的 tab3.page.ts(登录页面)
import { Component } from '@angular/core';
import { AlertController } from '@ionic/angular';
import { LoadingController, ToastController } from '@ionic/angular';
import { Router } from '@angular/router';
import { AngularFireAuth } from '@angular/fire/auth';
@Component({
selector: 'app-tab3',
templateUrl: 'tab3.page.html',
styleUrls: ['tab3.page.scss']
})
export class Tab3Page {
email: string = '';
password: string = '';
error: string = '';
constructor(private fireauth: AngularFireAuth,
private router: Router,
private toastController: ToastController,
public loadingController: LoadingController,
public alertController: AlertController) {
}
async openLoader() {
const loading = await this.loadingController.create({
message: 'Please Wait ...',
duration: 2000
});
await loading.present();
}
async closeLoading() {
return await this.loadingController.dismiss();
}
login() {
this.fireauth.auth.signInWithEmailAndPassword(this.email, this.password)
.then(res => {
if (res.user) {
console.log(res.user);
this.router.navigate(['/tabs/home']);
}
})
.catch(err => {
console.log(`login failed ${err}`);
this.error = err.message;
});
}
async presentToast(message, show_button, position, duration) {
const toast = await this.toastController.create({
message: message,
showCloseButton: show_button,
position: position,
duration: duration
});
toast.present();
}
}
这是tab3.page.html(登录页面)
<ion-content no-padding>
<div class="main">
<ion-card no-margin>
<ion-card-content>
<ion-row class="row">
<div class="fire-logo">
<img src="assets/firebase.png" class="img-logo">
<ion-text>
<h2 no-margin margin-vertical text-center>Welcome! Log in here</h2>
</ion-text>
</div>
</ion-row>
<ion-row>
<ion-col>
<ion-input clearInput type="email" placeholder="Email" [(ngModel)]="email" class="input" padding-horizontal
clear-input="true"></ion-input>
</ion-col>
</ion-row>
<ion-row>
<ion-col>
<ion-input clearInput type="password" placeholder="Password" [(ngModel)]="password" class="input"
padding-horizontal clear-input="true"></ion-input>
</ion-col>
</ion-row>
<ion-row>
<ion-col>
<ion-button expand="block" (click)="login()" color="undefined" class="transition">
<strong class="white">
Login</strong></ion-button>
</ion-col>
</ion-row>
<ion-row>
<ion-col>
<ion-text class="error" text-center>{{error}}</ion-text>
</ion-col>
</ion-row>
<ion-row>
<ion-col>
<ion-text text-center class="block">Don't have an account yet ?
<span class="bold" routerLink="/tabs/register">Sign up here</span></ion-text>
</ion-col>
</ion-row>
<ion-row>
<ion-col>
<ion-text text-center class="block bold" routerLink="/tabs/forgot">Forgot Password</ion-text>
</ion-col>
</ion-row>
</ion-card-content>
</ion-card>
</div>
</ion-content>
这是 home.page.ts(个人资料页面)
import { Component } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import { Router } from '@angular/router';
import { LoadingController, ToastController } from '@ionic/angular';
@Component({
selector: 'app-home',
templateUrl: './home.page.html',
styleUrls: ['./home.page.scss'],
})
export class HomePage{
user: any;
email: string = '';
password: string = '';
username: string = '';
image: number;
phone: number;
error: string;
userWantsToSignup: boolean = false;
linkError: string = '';
constructor(private toastController: ToastController, public loadingController: LoadingController, private fireauth: AngularFireAuth, private router: Router) { }
ionViewDidEnter() {
this.fireauth.auth.onAuthStateChanged((user) => {
if (user) {
this.user = user;
console.log(this.user);
}
})
}
updateEmail() {
this.user.updateEmail(this.email)
.then(() => {
this.email = '';
this.presentToast('Email updated', false, 'bottom', 1000);
this.error = '';
})
.catch(err => {
console.log(` failed ${err}`);
this.error = err.message;
});
}
updateUsername() {
this.user.updateProfile({
displayName: this.username
})
.then((data) => {
console.log(data);
this.username = '';
this.presentToast('Username updated', false, 'bottom', 1000);
this.error = '';
})
.catch(err => {
console.log(` failed ${err}`);
this.error = err.message;
});
}
updateImage() {
this.user.updateProfile({
photoURL: `https://picsum.photos/id/${this.image}/200/200`
})
.then((data) => {
console.log(data);
this.image = null;
this.presentToast('Image updated', false, 'bottom', 1000);
this.error = '';
})
.catch(err => {
console.log(` failed ${err}`);
this.error = err.message;
});
}
updatePassword() {
this.user.updatePassword(this.password)
.then(() => {
this.password = '';
this.presentToast('Password updated', false, 'bottom', 1000);
this.error = '';
})
.catch(err => {
console.log(` failed ${err}`);
this.error = err.message;
});
}
logout() {
this.fireauth.auth.signOut().then(() => {
this.router.navigate(['/tabs/tab3']);
})
}
async presentToast(message, show_button, position, duration) {
const toast = await this.toastController.create({
message: message,
showCloseButton: show_button,
position: position,
duration: duration
});
toast.present();
}
}
这是 home.page.html(个人资料页面)
<ion-header>
<ion-toolbar color="dark">
</ion-toolbar>
</ion-header>
<ion-content>
<div class="ion-padding">
Welcome user
<p>Here are your profile details</p>
<ion-item *ngIf="user">
<ion-thumbnail slot="start">
<img [src]="user.photoURL">
</ion-thumbnail>
<ion-label text-wrap>
<ion-text color="primary">
<h3>{{user.displayName}}</h3>
</ion-text>
<p>{{user.email}}</p>
</ion-label>
</ion-item>
</div>
<ion-list-header color="medium">
Update Profile
</ion-list-header>
<ion-item>
<ion-label position="fixed">Username</ion-label>
<ion-input type="string" placeholder="Enter new" [(ngModel)]="username"></ion-input>
<ion-button slot="end" color="success" expand="full" (click)="updateUsername()">Update</ion-button>
</ion-item>
<ion-item>
<ion-label position="fixed">Image</ion-label>
<ion-input type="number" placeholder="A number 1-1000" [(ngModel)]="image"></ion-input>
<ion-button slot="end" color="success" expand="full" (click)="updateImage()">Update</ion-button>
</ion-item>
<ion-list-header color="medium">
Sensitive Updates
</ion-list-header>
<ion-item>
<ion-label position="fixed">Email</ion-label>
<ion-input type="string" placeholder="Enter new" [(ngModel)]="email"></ion-input>
<ion-button slot="end" color="success" expand="full" (click)="updateEmail()">Update</ion-button>
</ion-item>
<ion-item>
<ion-label position="fixed">Password</ion-label>
<ion-input type="string" placeholder="Enter new" [(ngModel)]="password"></ion-input>
<ion-button slot="end" color="success" expand="full" (click)="updatePassword()">Update</ion-button>
</ion-item>
<ion-row>
<ion-col>
<ion-text class="error" text-center>{{error}}</ion-text>
</ion-col>
</ion-row>
<ion-row>
<ion-col>
<ion-text class="error" text-center>{{linkError}}</ion-text>
</ion-col>
</ion-row>
</ion-content>
<ion-footer class="transition">
<ion-toolbar color="undefined" (click)="logout()">
<ion-title>
Logout
</ion-title>
</ion-toolbar>
</ion-footer>
我不确定问题出在此页面上还是我需要在其他地方进行的重定向。
解决方案
推荐阅读
- python - Sharepoint 文件到 Jupyter Notebook
- swift - 在没有 Xcode 的情况下添加 swift 包/依赖项
- rust - 如何用元组字段定义结构?
- html - 链接来自不同文件夹的 CSS 文件和 HTML/PHP 文件
- php - Magento 1.9 getMediaGalleryImages() 从产品集合中返回空
- hibernate - 获取 Infinispan 锁座线程
- linux - 二进制文件执行错误(Assembly - linux)
- node.js - 如果 CSRF 来自 Express 服务器本身,有没有办法保护它?
- bash - 删除超过 4 天的文件 - 不工作
- c - RISC V gcc工具链在使用mret时泄漏堆栈