Проблема с сохранением аутентификации Firebase между вкладками - PullRequest
0 голосов
/ 03 апреля 2020

Я работаю над приложением, использующим angular и ioni c, и недавно получил проверку подлинности 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();
  }

}

Вот вкладка3. 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();
  }
}

Вот домашняя страница. 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>

Я не уверен, в чем проблема, если она находится на этой странице или перенаправление мне нужно сделать где-то еще.

...