Как сохранить сеанс Firebase Auth в моем приложении Ioni c - PullRequest
0 голосов
/ 16 апреля 2020

Я искал информацию об этом, но я не мог понять, что я должен делать. Мне нужно, чтобы в моем приложении Ioni c пользователь мог войти в систему и закрыть приложение, а при повторном входе сеанс входа в систему сохраняется. Как то, как работает твиттер, Instagram и эти приложения. Я читал, что если установить постоянство firebase в LOCAL, этого должно быть достаточно, но он не работает для меня. Я думаю, что это будет angular проблема, потому что я понимаю, что firebase работает с постоянными сессиями.

Мой app.module.ts

import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy, RouterModule } from '@angular/router';

import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';

import { AppComponent } from './app.component';
import { AngularFireModule } from '@angular/fire/';
import { environment } from '../environments/environment';
import { routes } from './app-routing.module';

@NgModule({
  declarations: [AppComponent],
  entryComponents: [],
  imports: [
    BrowserModule,
    CommonModule,
    IonicModule.forRoot(),
    AngularFireModule.initializeApp(environment.firebase),
    RouterModule.forRoot(routes),
  ],
  providers: [
    StatusBar,
    SplashScreen,
    AngularFireAuth,
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Мой main.page.ts logInService.LogIn возвращает зарегистрированного пользователя и ноль в любом другом случае

import { AngularFireAuth } from '@angular/fire/auth';
import { LoginService } from './../../services/login.service';
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router'
import { User } from "../../clases/data"

import { FormGroup, FormBuilder, Validators } from "@angular/forms";

@Component({
  selector: 'app-login',
  templateUrl: './main.page.html',
  styleUrls: ['./main.page.scss'],
})
export class MainPage implements OnInit {


  protected email: "";
  protected password: "";
  protected errLabel: string = "";
  public user;
  credentialsForm: FormGroup;

  constructor(private routes: Router, private fAuth: AngularFireAuth) {
    let response = fAuth.auth.currentUser;
    if (response != null) {
      this.routes.navigateByUrl("/home");
      console.log(response);
    }
  }

  ngOnInit() {
    if (this.fAuth?.auth?.currentUser != null)
      this.routes.navigateByUrl("/home");
  }

  async onSumbit() {
    let loginService = new LoginService(this.fAuth);
    let user: User = new User(this.email, this.password);
    let response = await loginService.logIn(user);
    console.log("MainPage: ", response)
    if (response != null) {
      this.routes.navigateByUrl("/home")
    }
    else {
      this.errLabel = "The password is not correct.";
    }


  }

}

My login.service.ts

import { User } from './../clases/data';
import { Injectable } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import * as firebase from "firebase/app";

@Injectable({
  providedIn: 'root'
})
export class LoginService {

  public isLogged: any = false;

  constructor(public fAuth: AngularFireAuth)
  {
    fAuth.authState.subscribe(user => (this.isLogged = user))
  }

  async logIn(user: User)
  {
    var res = null;
    res = firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION).then(async () =>
    {
      this.fAuth.auth.onAuthStateChanged(user => console.log(user));
        let userReceived = await this.fAuth.auth.signInWithEmailAndPassword(user.email, user.pass).catch(() => {console.log("Error during login"); return (null)})
        return (userReceived);
    }).catch(() => {console.log("Error during setting log in persistence"); return (null)})

    return (res);
  }

  async signUp(user: User)
  {
   return await this.fAuth.auth.createUserWithEmailAndPassword(user.email, user.pass).catch(
      () => {
        console.log("Error during the creation of the new user.")
        return "The email already exists.";
      }).then(
        () => {
          console.log("User created successfully")
          return (this.updateProfile({displayName: user.name}));
        }
      )
  }

  async updateProfile(user)
  {
    return await this.fAuth.auth.currentUser.updateProfile(user).catch((error) => {console.log(error); return ("There was an error creating your user, try it again past a few minutes if it continues ocurring contact with us in it_problems@halamaui.com")}).then(() => null)
  }

}

1 Ответ

0 голосов
/ 16 апреля 2020

Прежде всего вам не следует создавать экземпляр Сервиса с новым ключевым словом. Позвольте инжектору выполнить свою работу и просто добавьте LoginService в конструктор вашей главной страницы, например:

constructor(private routes: Router, private fAuth: AngularFireAuth, private loginService: LoginService) {
  let response = fAuth.auth.currentUser;
  if (response != null) {
    this.routes.navigateByUrl("/home");
    console.log(response);
  }
}

Добавляя private или publi c перед аргументом конструктора в Typescript, он добавляется как свойство класса, так что вы можете использовать его в любом месте main.page.ts с this.loginService

Хорошо, теперь проблема с постоянством. Вы не используете настойчивую ЛОКАЛЬНОСТЬ, как вы сами сказали, что используете настойчивую СЕССИЮ. Поэтому вам нужно будет использовать firebase.auth.Auth.Persistence.LOCAL вместо firebase.auth.Auth.Persistence.SESSION

Я использую Firebase с AngularFire2 в одном из моих проектов, а также могу подтвердить, что firebase.auth.Auth.Persistence.LOCAL будет держать ваших пользователей в системе

...