安裝:
使用最新的就行,使用時問題不在於版本,而在於你會不會讀原始碼。
$ composer require tymon/jwt-auth
生成配置檔案:
會在config
資料夾中生成一個jwt.php
檔案。jwt.php
可以配置一些加密演算法、token過期時間等資訊。
$php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
生成加密金鑰:
token
是由 header(base64演算法加密) + payload(base64演算法加密) + secret
再用HS256等演算法加密後組成的。secret
是伺服器儲存的,下面命令會在.env
檔案中生成一個隨機的secret
。secret
要注意保管,不能洩露。.env
檔案在.gitignore
檔案中預設是被標記的,即.env
檔案是不建議上傳到 github 上,同樣也就不建議將secret
上傳到 github 上防止洩露。
$ php artisan jwt:secret
生成模型檔案並執行遷移:
生成模型檔案:
$ php artisan make:model DemoModel -m
-m
表示同時生成模型對應的遷移檔案。(資料庫遷移是個重要知識點,不懂的自行學習修改遷移檔案:
因為是學習/測試,因此我把程式最簡化,只需要name
和password
即可。執行遷移:
$ php artisan migrate
修改模型檔案:
修改內容:
必須
extends User
這裡as Authenticatable
了。
該User
類繼承了許多介面,比如Authenticatable
介面,JWT
有部分功能使用到了 laravel 自帶的Auth
功能,比如JWTAuth::attempt()
函式,這個函式是JWTAuth
類呼叫的,而並不是Auth
呼叫,但它的呼叫卻需要Authenticatable
類例項,因此如果不extends User
的話,會丟擲validateCredentials() must be an instance of Illuminate\Contracts\Auth\Authenticatable
異常。
這也是為什麼可以直接使用auth("api")->attempt(xxx)
進行驗證的原因。因為是學習/測試,因此我把程式最簡化,只需要
name
和password
即可。新增
implements JWTSubject
介面,並繼承以下方法:public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; }
我理解的含義是,將
JWT
與Model
進行對映,因為我們需要使用JWT
生成token
,而生成時需要傳入JWTSubject
例項物件,但實際我們傳入的是App\Models\DemoModel
例項物件,比如JWTAuth::fromSubject(instance of JWTSubject)
。
修改 Config 配置檔案:
- 修改
app.php
配置檔案:
給aliases
新增以下兩個欄位:
新增該別名的好處是,能直接在頭部'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class, 'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,
use JWTAuth;
便可使用JWTAuth::XXX
,而無需use Tymon\JWTAuth\Facades\JWTAuth;
長長的 path 。但你use JWTAuth;
時會發現使用JWTAuth::XXX
vscode 編輯器會報錯,這是因為編輯器並沒有識別別名的特性,在報錯下直接發請求,也是可以正常響應的。
如果想直接use 長長的 path
,可以不用新增這兩行別名,因為有些編輯器會自動引入use XXX
。 - 修改
auth.php
配置檔案:
使用守衛為api
(因為我們前後端分離,路由是從/api
進入的);
將驅動者改為jwt
;既然我們要使用DemoModel
的eloquent
,那麼就要model=>App\Models\DemoModel::class
。
- 建立路由:在
routes/api.php
下
so easy! - 建立控制器:
$ php artisan controller:DemoController
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\DemoModel;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Facades\JWTAuth;
class DemoController extends Controller
{
public function register(Request $request)
{
$credentials = [
'name' => $request->name,
'password' => $request->password
];
$dm = DemoModel::create($credentials);
if ($dm) {
// 生成 token
$token = JWTAuth::fromSubject($dm);
return var_dump($token);
}
}
public function login(Request $request)
{
// 驗證 token
return var_dump((JWTAuth::parseToken()->check()));
}
}
var_dump()
和dd()
用法差不多,var_dump()
能輸出更詳細的內容。
測試工具:postman
使用者註冊——服務端會生成
token
響應給客戶端(postman):
傳送 Post 請求,注意 url 中必須加上/api/
,這是因為我們使用的是routes/api.php
。不清楚api.php
和web.php
的區別可以百度。複製下面的
token
,不用複製引號。使用者登陸——客戶端(postman)會攜帶
token
給伺服器驗證:
把剛複製的token
貼上到這裡:
會響應true
,可以點選Preview
看的更清晰:
我有點作業要急著做,待定一下…
本作品採用《CC 協議》,轉載必須註明作者和本文連結