zl程序教程

您现在的位置是:首页 >  前端

当前栏目

[Angular] AuthService and AngularFire integration

Angular and Integration
2023-09-14 08:59:18 时间

Config AngularFire, we need database and auth module from firebase.

import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {RouterModule, Routes} from '@angular/router';
import {AngularFireModule, FirebaseAppConfig} from 'angularfire2';
import {AngularFireAuthModule} from 'angularfire2/auth';
import {AngularFireDatabaseModule} from 'angularfire2/database';
import {SharedModule} from './shared/shared.module';

export const ROUTES: Routes = [
  {
    path: 'auth',
    children: [
      {path: '', pathMatch: 'full', redirectTo: 'login'},
      {path: 'login', loadChildren: './login/login.module#LoginModule'},
      {path: 'register', loadChildren: './register/register.module#RegisterModule'}
    ]
  }
];

export const forebaseConfig: FirebaseAppConfig = {
  apiKey: "xxxxxxxx",
  authDomain: "fitness-app-a26ed.firebaseapp.com",
  databaseURL: "https://fitness-app-a26ed.firebaseio.com",
  projectId: "fitness-app-a26ed",
  storageBucket: "fitness-app-a26ed.appspot.com",
  messagingSenderId: "781493219422"
};

@NgModule({
  imports: [
    CommonModule,
    AngularFireModule.initializeApp(forebaseConfig),
    AngularFireAuthModule,
    AngularFireDatabaseModule,
    SharedModule,
    RouterModule.forChild(ROUTES)
  ]
})
export class AuthModule {}

 

For the SharedModule:

import {ModuleWithProviders, NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {ReactiveFormsModule} from '@angular/forms';

import { AuthFormComponent } from './components/auth-form/auth-form.component';
import {AuthService} from './services/auth/auth.service';


@NgModule({
  imports: [
    CommonModule,
    ReactiveFormsModule
  ],
  declarations: [
    AuthFormComponent
  ],
  exports: [
    AuthFormComponent
  ]
})
export class SharedModule {

  // We don't want multi instance for AuthService, so we need forRoot method
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: SharedModule,
      providers: [
        AuthService
      ]
    }
  }
}

We use forRoot method to register our AuthSerivce, so there won't be multi instances for it.

But in the AuthModule, we need to change a little bit:

import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {RouterModule, Routes} from '@angular/router';
import {AngularFireModule, FirebaseAppConfig} from 'angularfire2';
import {AngularFireAuthModule} from 'angularfire2/auth';
import {AngularFireDatabaseModule} from 'angularfire2/database';
import {SharedModule} from './shared/shared.module';

export const ROUTES: Routes = [
  {
    path: 'auth',
    children: [
      {path: '', pathMatch: 'full', redirectTo: 'login'},
      {path: 'login', loadChildren: './login/login.module#LoginModule'},
      {path: 'register', loadChildren: './register/register.module#RegisterModule'}
    ]
  }
];

export const forebaseConfig: FirebaseAppConfig = {
  apiKey: "xxxxxxxx",
  authDomain: "fitness-app-a26ed.firebaseapp.com",
  databaseURL: "https://fitness-app-a26ed.firebaseio.com",
  projectId: "fitness-app-a26ed",
  storageBucket: "fitness-app-a26ed.appspot.com",
  messagingSenderId: "781493219422"
};

@NgModule({
  imports: [
    CommonModule,
    AngularFireModule.initializeApp(forebaseConfig),
    AngularFireAuthModule,
    AngularFireDatabaseModule,
    SharedModule.forRoot(),
    RouterModule.forChild(ROUTES)
  ]
})
export class AuthModule {}

 

AuthService is the serivce which talk to Firebase Auth Module:

import {Injectable} from '@angular/core';
import {AngularFireAuth} from 'angularfire2/auth';

@Injectable()
export class AuthService {
  constructor(
    private af: AngularFireAuth
  ) {

  }

  createUser(email: string, password: string) {
    return this.af.auth.createUserWithEmailAndPassword(email, password);
  }

  loginUser(email: string, password: string) {
    return this.af.auth.signInWithEmailAndPassword(email, password)
  }
}

 

Register user:

import {Component} from '@angular/core';
import {FormGroup} from '@angular/forms';
import {AuthService} from '../../../shared/services/auth/auth.service';
@Component({
  selector: 'register',
  template: `
    <div>
      <auth-form (submitted)="registerUser($event)">
        <h1>Register</h1>
        <a routerLink="/auth/login">Already have an account?</a>
        <button type="submit">Create account</button>
        <div class="error" *ngIf="error">
          {{error}}
        </div>
      </auth-form>
    </div>
  `
})
export class RegisterComponent {

  error: string;

  constructor(
    private authService: AuthService
  ) {

  }

  async registerUser(event: FormGroup) {
    const {email, password} = event.value;
    try {
      await this.authService.createUser(email, password);
    } catch(err) {
      this.error = err.message;
    }
  }
}

 

login user:

import {Component} from '@angular/core';
import {FormGroup} from '@angular/forms';
import {AuthService} from '../../../shared/services/auth/auth.service';

@Component({
  selector: 'login',
  template: `
    <div>
      <auth-form (submitted)="loginUser($event)">
        <h1>Login</h1>
        <a routerLink="/auth/register">Not registered?</a>
        <button type="submit">Login</button>
        <div class="error" *ngIf="error">
          {{error}}
        </div>
      </auth-form>
    </div>
  `
})
export class LoginComponent {

  error: string;

  constructor(
    private authService: AuthService
  ) {

  }

  async loginUser(event: FormGroup) {
    const {email, password} = event.value;
    try {
      await this.authService.loginUser(email, password);
    } catch(err) {
      this.error = err.message;
    }
  }
}