簡單說要做任何需要認證的請求時。例如(我「想」要新增動物)那麼就要先跟伺服器請求核發一組 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_in | access_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..."
}
回傳一組新的授權資料!