OAuth2 認證機制 Token 原理

簡單說要做任何需要認證的請求時。例如(我「想」要新增動物)那麼就要先跟伺服器請求核發一組 Access Token(就是一段亂碼)。把這個 Token 附帶在請求中,就可以操作需要驗證的API (我要新增動物-附帶有效的Token)

Passport 是一個官方推薦的套件,可以輕鬆簡單的讓你完成一個完善的 OAuth2 認證機制!

(這裡指的是否登入的感覺,不是權限角色的分組)

順帶一提,Passport Laravel版本必須要大於 5.3 才能使用。

有四種不同的授權類型

  • 密碼授權
  • 授權碼授權
  • 個人授權
  • 同步授權

密碼授權

如果公司自己有手機app或其他產品,會用到 API 那就可以用密碼授權!這是最簡單的一種,但這種方法比較少見,可能過程中要輸入帳號密碼,相對來說比較有風險。

使用者再請求 Token 的時候必須附帶資料如下

  'grant_type' => 'password', //告訴伺服器密碼授權
  'client_id' => '2', // 伺服器端會有一筆client ID 在安裝Passport 有新增一組或在依照需求增加。
  'client_secret' => 'tXGMPZpKOlv3qkjrCPBeokueJN8mwaT7K8yAnbYE',  //那個ID對應的 secret 值
  'username' => 'victor@2020ironman.demo.com', // 登入哪個使用者
  'password' => '123456789', //密碼
  'scope' => '', //作用區(再找一篇來解釋這個)

回傳

{
    "token_type": "Bearer",
    "expires_in": 1295999,
    "access_token": "eyJ0eXAi...",
    "refresh_token": "def5020..."
}

表示授權成功!可以利用這一個access_token 來請求操作需要驗證的API。

這是 Token 請求方式。但我們的系統中還未設定 Animal 資源還有Type 資源 的驗證。

設定需驗證的方法

AnimalController、TypeController 皆加入 __construct()

public function __construct()
{
    $this->middleware('auth:api', ['except' => ['index','show']]);
}

除了 index (查詢清單) 、 show (查詢單一資源) 不需要驗證其他必需認證才可以操作。

接下來開啟 Postman 送一次新增動物的請求。

POST api/animal

因為我們沒有附上 access_token 所以請求失敗 狀態碼 401 未認證。

取的 access_token 方法 Postman

POST /oauth/token HTTP/1.1
Content-type: application/x-www-form-urlencoded

把access_token 複製下來,並且回到請求新增動物的畫面。貼到 Headers

再請求一次新增動物的api

成功!

如果出現如下方圖片錯誤請清除快取再嘗試一試看看!

清除快取

php artisan config:cache
參數說明
access_token這個 Token 是用來,對於需要操作驗證需求時要提供給API伺服器驗證的東西
refresh_token如果你有設定access_token過期時間的話,可以用這個 Token 來請求新的 access_token
expires_inaccess_token 還有多久過期

自訂 Token 過期時間

Passport 預設 Token 核發後一年過期,如果想自自訂有效時間

AuthServiceProvider

public function boot()
{
    $this->registerPolicies();

    Passport::routes();

    // access_token 設定核發後15天候過期
    Passport::tokensExpireIn(now()->addDays(15));
    
    // refresh_token 設定核發後30天候過期
    Passport::refreshTokensExpireIn(now()->addDays(30));
}

刷新 access_token

時間越短安全性越高,如密碼授權的方式,不斷的發送請求內容還包含 帳號密碼 也會增加 安全上的疑慮。

可以利用 refreshtoken 來刷新,accesstoken 不管是過期後獲釋還沒有過期都可以請求刷新access_token

POST /oauth/token
{
    "grant_type" : "refresh_token",
    "refresh_token" : "the-refresh-token",
    "client_id" : "client-id",
    "client_secret" : "client-secret",
    "scope" : ""
}

回傳

{
    "token_type": "Bearer",
    "expires_in": 1296000,
    "access_token": "eyJ0eX...",
    "refresh_token": "def502..."
}

回傳一組新的授權資料!


發佈留言