可以請你解釋一下 passport 背後的機制嗎?(二)


前言

七天系列要結束了,看起來還是寫不完...哈哈哈...嗚嗚

警告,本文是一個新手的筆記,有極大的機率搞錯了什麼。

Session, Token-base Authetication

用 session 不行嗎,為什麼 API 一定要用 token 驗證?

簡單來說,使用情境上不需要 session。前面資安問題提過 web 上常見的攻擊中,有一個叫 CSRF(跨站請求偽造) 的東西,可是一般的 app 並不是用 cookie,也就不會有瀏覽器發送請求一併把 cookie 送出這件事,所以...好像就把使用者狀態加密存起來就好了吧。
這個概念就是 token,再詳細一點,是 JSON Web Token。

對啦,我有聽過 JWT,Laravel 5.2 之前都是推薦用這個!

沒錯,而且其實 JWT 也只是一個套件。
不服氣的話,你自己來寫一個 token-base 驗證啊。

想像一下如果我們有一組亂碼紀錄使用者已經登入了,可能的流程會長怎樣:
使用者輸入帳號密碼登入 -> 資料庫在 api-token 欄位產生一組用時間+帳號密碼產生的亂碼 -> 回傳亂碼請前端存起來 -> 下次請求的時候把這個亂碼放在 header

那麼要怎麼做到在使用者登入的觸發產生亂碼這件事呢?
聽起來怎麼很像某種設計模式...難...難不成是...觀察者模式!?

Laravel 裡可以很方便的做出來,透過 observer 和 provider。
透過 UserObserver,把 UserObserver 和 User 綁定。observer 的目的是要操控 model,在 model 的資料被存進資料庫前觸發 creating(),產生一組亂碼存進資料庫。

來個簡單的範例:

<?php

namespace App\Observers;

use App\User;

class UserObserver
{
    /**
     * Listen to the User creating event.
     *
     * @param  \App\User  $user
     * @return void
     */
    public function creating(User $user)
    {
      $user->api_token = bin2hex(openssl_random_pseudo_bytes(30));
    }
}

由誰來觸發呢? ObserverServiceProvider。
provider 在程式啟動的時候就會把觀察者 (UserObserver) 加入被觀察者 (User) 裡,當被觀察者改變內容的時候,就會通知觀察者做事情。

    public function boot()
    {
      User::observe(UserObserver::class);
    }

參考

#Laravel #後端 #新手 #面試





一個新手的筆記。本系列文適合有多年程式開發經驗者,或具備思考與查證能力者閱讀。適合程式課程開發者參考,可以了解新手可憐的小腦袋;嚴禁寫作業照抄,一定不及格。

留言討論