16.1 用auth0服務 實現用登陸和管理 使用auth版本的2個大坑。

 

 

這是三週內容,實現用戶登陸和管理html

回到master分支 api

 

 

切換到 han分支 更新一下 而後工做瀏覽器

 

開始工做寫代碼了cookie

安裝2個angular端的auth0的lib,也可不安裝,後邊有不安裝的作法angular2

 

 

 不安裝的方法是dom

 

咱們知道咱們全部的client端的代碼或者js文件,都是經過我們用ng bulid --watch 時刻生成的 public目錄下index.html加載運行的異步

可是呢?咱們是不可以直接修改index.html的他是angular-cli幫咱們生成的(用ng build --watch命令)ide

那咱們去哪裏修改呢?ui

咱們固然是oj-client/src/  下 index.htmlthis

 

 

2個均可以,區別就是一個下載到本地安裝,另一個是用在線的。均可以。咱們用安裝的

 

 

 

這樣咱們就有全部的依賴,利用這個lib(包)咱們就能夠用auth0

 

 

下一步就是實現login in 功能(和之前咱們的寫法同樣 , 創建service)

angular-cli就幫咱們生成2個文件

 

而後就從官網上 複製粘貼模板

 

必須聲明才能夠

 

 

 

 

 如何讓其餘component使用這個service呢?

 

 

 服務有了 就要用了 由於login那個按鈕在navbar哪裏 因此

 

 

 咱們去頁面看看

 

而後咱們試試運行一下

 

 

 

 

 

 

 

 

點一下sign in 試試

 

 

 說明cookie記錄了

 

發現是能夠的。

官網jwt.io將token貼入會返回3部分信息  

 

 

可是

有2個大坑,雖說繼承auth很簡單,可是呢,由於api版本和用法的不一樣,會出現不少問題,解決方法就是版本對應。

好比,咱們在用比較新的版本時(10.8),

咱們發現等咱們在具體頁面登陸的時候

登陸後 跳轉到了 首頁 而不是登陸時具體的頁面

這是很不理想的!

 

問題二

另一個坑是

當咱們在具體頁面刷新之後登陸 會報錯,callback地址改變再也不是localhost:3000 而是變成 localhost:3000/problems/1

可是這個地址是咱們沒有添加到callback地址的,你會說,咱們添加就行了,可是若是是localhost:3000/problems/2

你還要添加一次 3 你還要添加 這是咱們不能接受的

 

 

實際上是API版本問題

怎麼修正呢?

你能夠選擇就的版本

修改client端下的index.html

若是你是用CDN那個方式的話就改具體的版本號

 

 

新API爲何這樣呢?

留個坑 看文檔吧

仍是改回老版本吧 且用cdn的方式

 

 

 

//version : use cdn in index.html by <script  src="https://cdn.auth0.com/lock-9.0.min.js"></script>
import { Injectable } from '@angular/core';
import {tokenNotExpired} from "angular2-jwt";

declare var Auth0Lock:any;

@Injectable(/*{providedIn: 'root'}*/)
export class AuthService {
  
  clientId ='Kpohf0lVYOVRyK2-QjArHjqCq6kSdelz';
  domain = 'bittiger.auth0.com';
  lock = new Auth0Lock(this.clientId,this.domain,{});

  constructor() { 
/*    this.lock.on("authenticated",(authResult)=>{
      localStorage.setItem('id_token',authResult.idToken);
    });*/
  }
  public login(){
    /*this.lock.show();*/
    this.lock.show((error :string, profile:Object , id_token:string ) => {
      if(error){
        console.log(error);
      }else {
        localStorage.setItem('profile',JSON.stringify(profile));
        localStorage.setItem('id_token',id_token);
      }
    });
  }
  public logout(){
    localStorage.removeItem('id_token');
    localStorage.removeItem('profile');
  }
  public authenticated(){
    return tokenNotExpired();
  }
}

  老版本9.0的寫法 不是在construction裏面判斷了,而是改爲,在login裏面 調用callback function (三個參數),

 

 

咱們在登陸之後

應該在navbar顯示名字

 

 

仍是用cdn吧

https://auth0.com/docs/libraries/lock/v9

變成異步的登陸

 

那麼profile怎麼弄呢(咱們頁面顯示具體用戶名,而不是寫死的變量。字符串)

 

 

咱們去navbar

這個nickname是在咱們瀏覽器按F12點

 

 

 可是咱們要寫成異步的,由於,他是個http請求,請求的是auth0這個官網,否則會報null的錯誤

 

咱們想

 

 

 

 

 

這個是固定 的 就不用數據綁定了

相關文章
相關標籤/搜索