網路程式設計

第八課 Firestore使用者認證

購物車範例(1/2)

ng g service products/shared/product

ng g class products/shared/product

ng g component products/item-form

ng g component products/item-list
ng g component products/item-detail

npm install ngx-bootstrap --save
ng new ShoppingCart
cd ShoppingCart
npm install firebase angularfire2 --save

ng g module app-routing --flat --module=app
ng g component home

建立專案

firebase資料庫

routing模組

資料庫存取服務

資料欄位界面

產品清單元件

產品編輯

新增產品

首頁元件

購物車範例登入、註冊、頁面保護(2/2)

ng g service services/auth

ng g component login

ng g component register

ng g service services/auth-guard

Firestore登入登出服務

路徑保護服務

註冊元件

登入元件

登入元件(1/2)

import { Component, OnInit } from '@angular/core';

import { AuthService } from '../services/auth.service';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css'],
  providers: [ AuthService ]
})
export class LoginComponent implements OnInit {
  mail: string;
  password: string;
  state: boolean;

  constructor(private as: AuthService) { }

  ngOnInit() {
    this.logout();
  }

  login(){
    this.as.login(this.mail, this.password);
    console.log('logged on');
    this.mail = '';
    this.password = '';
  }
  
  logout() {
    this.as.logout();
  }
}

login.component.ts

登入元件(2/2)

<div class="container my-5">
  <div class="row justify-content-center">
    <div class="card col-sm-4 ">
      <h4 class="text-center">網路商城</h4>
      <div class="card-body">
        <span id="reauth-email" class="reauth-email"></span>
        <div class="form-group">
          <label>電子郵件:</label>
          <input type="email" [(ngModel)]="mail" class="form-control" placeholder="Email address" required autofocus>
        </div>
        <div class="form-group">
          <label>密碼:</label>
          <input type="password" [(ngModel)]="password" class="form-control" placeholder="Password" required>
        </div>

        <button (click)="login()" [disabled]="!mail || !password" class="mt-5 btn btn-lg btn-primary btn-block btn-signin" type="submit">登入</button>
      </div>
    </div>
  </div>
</div>

login.component.html

版本1:未做輸入驗證,沒有路徑保護

登入服務(1/1)

import { Injectable } from '@angular/core';

import { Observable } from 'rxjs/Observable';

import { AngularFireAuth } from 'angularfire2/auth';
import { Router } from '@angular/router';

@Injectable()
export class AuthService {

  constructor(
    private afAuth: AngularFireAuth,
    private router: Router
  ) {}

  // firestore email login
  login(mail: string, password: string) {
    this.afAuth.auth.signInWithEmailAndPassword(mail, password).then(
      value => {
        console.log(value);
        console.log('login::',this.afAuth.authState);
        this.router.navigate(['/products']);
      }
    ).catch(
      err => {
        console.log("Error::", err.message);
      }
      )
  }

  // firestore email registration
  register(mail: string, password: string) {
    this.afAuth.auth.createUserWithEmailAndPassword(mail, password).then(
      value => {
        console.log('register', value);
        this.router.navigate(['/login']);
      }
    ).catch(
      err => {
        console.log("Error::", err.message);
      }
      )
  }

  // firestore logout
  logout() {
    this.afAuth.auth.signOut();
  }

}

auth.service.ts

註冊元件(1/2)

import { Component, OnInit } from '@angular/core';

import { AuthService } from '../services/auth.service';

@Component({
  selector: 'app-register',
  templateUrl: './register.component.html',
  styleUrls: ['./register.component.css'],
  providers: [ AuthService ]
})
export class RegisterComponent implements OnInit {
  model: any = {};
  loading = false;
  constructor( private as: AuthService) { }

  ngOnInit() {
  }

  register(){
    this.loading = true;
    this.as.register(this.model.email, this.model.password);    
    this.model= {};
  }

}

register.component.ts

註冊元件(2/2)

<div class="container my-5">
  <div class="row justify-content-center">
    <div class="col-6 col-offset-3">
      <h2>註冊新帳號</h2>
      <form name="form" (ngSubmit)="f.form.valid && register()" #f="ngForm" novalidate>
        <div class="form-group" [ngClass]="{ 'has-error': f.submitted && !email.valid }">
          <label for="email">電子郵件</label>
          <input type="text" class="form-control" name="Email" [(ngModel)]="model.email" #email="ngModel" required />
          <div *ngIf="f.submitted && !email.valid" class="alert alert-danger">Email未輸入</div>
        </div>
        <div class="form-group" [ngClass]="{ 'has-error': f.submitted && !password.valid }">
          <label for="password">密碼</label>
          <input type="password" class="form-control" name="password" [(ngModel)]="model.password" #password="ngModel" required />
          <div *ngIf="f.submitted && !password.valid" class="alert alert-danger">密碼未輸入</div>
        </div>        
        <div class="form-group">
          <button [disabled]="loading" class="btn btn-primary">註冊新帳號</button>
          <img *ngIf="loading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA=="
          />
          <a [routerLink]="['/login']" class="btn btn-link">Cancel</a>
        </div>
      </form>
    </div>
  </div>
</div>

register.component.html

Auth Guard

網路程式設計

By Leuo-Hong Wang

網路程式設計

第八課:使用者認證

  • 790