?? JWT 認(rèn)證插件

簡介
Json web token 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519)。該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。
安裝
composer require tinywan/jwt
生成令牌
$user = [
'id' => 2022, // 這里必須是一個全局抽象唯一id
'name' => 'Tinywan',
'email' => 'Tinywan@163.com'
];
$token = Tinywan\Jwt\JwtToken::generateToken($user);
var_dump(json_encode($token));
輸出(json格式)
{
"token_type": "Bearer",
"expires_in": 36000,
"access_token": "eyJ0eXAiOiJAUR-Gqtnk9LUPO8IDrLK7tjCwQZ7CI...",
"refresh_token": "eyJ0eXAiOiJIEGkKprvcccccQvsTJaOyNy8yweZc..."
}
參數(shù)描述
參數(shù) | 類型 | 描述 | 示例值 |
---|---|---|---|
token_type | string | Token 類型 | Bearer |
expires_in | int | 憑證有效時間,單位:秒 | 36000 |
access_token | string | 訪問憑證 | XXXXXXXXXXXXXXXXXXXX |
refresh_token | string | 刷新憑證(訪問憑證過期使用 ) | XXXXXXXXXXXXXXXXXXXX |
已支持方法
1、獲取當(dāng)前
uid
Tinywan\Jwt\JwtToken::getCurrentId();
2、獲取所有擴(kuò)展字段
Tinywan\Jwt\JwtToken::getExtend();
3、獲取自定義字段
Tinywan\Jwt\JwtToken::getExtendVal('email');
4、刷新令牌(通過刷新令牌獲取訪問令牌)
Tinywan\Jwt\JwtToken::refreshToken();
5、獲取令牌有效期剩余時長(單位:秒)
Tinywan\Jwt\JwtToken::getTokenExp();
6、單設(shè)備登錄。默認(rèn)是關(guān)閉,開啟請修改配置文件
config/plugin/tinywan/jwt
'is_single_device' => true,
7、獲取當(dāng)前用戶信息(模型)。需要插件大于版本
>=1.2.4
Tinywan\Jwt\JwtToken::getUser();
注意:該配置項目
'user_model'
為一個匿名函數(shù),匿名函數(shù)參數(shù)$uid
為當(dāng)前登錄用戶id,默認(rèn)返回空數(shù)組,可以根據(jù)自己項目ORM定制化自己的返回模型
ThinkORM 配置
'user_model' => function($uid) {
// 返回一個數(shù)組
return \think\facade\Db::table('resty_user')
->field('id,username,create_time')
->where('id',$uid)
->find();
}
LaravelORM 配置
'user_model' => function($uid) {
// 返回一個對象
return \support\Db::table('resty_user')
->where('id', $uid)
->select('id','email','mobile','create_time')
->first();
}
8、令牌清理
Tinywan\Jwt\JwtToken::clear();
注:只有配置項 is_single_device
為true
才會生效
9、自定義終端
client
。需要插件大于版本>=v1.8.2
// 生成WEB令牌
$user = [
'id' => 2022,
'name' => 'Tinywan',
'client' => JwtToken::TOKEN_CLIENT_WEB
];
$token = JwtToken::generateToken($user);
// 生成移動端令牌
$user = [
'id' => 2022,
'name' => 'Tinywan',
'client' => JwtToken::TOKEN_CLIENT_MOBILE
];
$token = JwtToken::generateToken($user);
默認(rèn)是WEB
端
- 自定義訪問令牌和刷新令牌過期時間
$extend = [
'id' => 2024,
'name' => 'Tinywan',
'access_exp' => 600, // 10 分鐘
'refresh_exp' => 7200, // 2 小時
];
$token = Tinywan\Jwt\JwtToken::generateToken($extend);
11、支持
GET
方式獲取令牌。需要插件大于版本>=1.9.0
/** 是否支持 get 請求獲取令牌 */
'is_support_get_token' => true,
/** GET 請求獲取令牌請求key */
'is_support_get_token_key' => 'authorization',
12、自定義訪問令牌和刷新令牌過期時間
$extend = [
'id' => 2024,
'access_exp' => 7200, // 2 小時
];
$token = Tinywan\Jwt\JwtToken::generateToken($extend);
13、令牌過期錯誤碼
- 訪問令牌
- 身份驗證令牌無效:
401011
- 身份驗證令牌尚未生效:
401012
- 身份驗證會話已過期,請重新登錄?。?code>401013
- 獲取的擴(kuò)展字段不存在:
401014
- 訪問令牌未知錯誤:
401015
- 身份驗證令牌無效:
- 刷新令牌
- 刷新令牌無效:
401021
- 刷新令牌尚未生效:
401022
- 刷新令牌會話已過期,請再次登錄?。?code>401023
- 刷新令牌獲取的擴(kuò)展字段不存在:
401024
- 刷新令牌未知錯誤:
401025
- 刷新令牌無效:
簽名算法
JWT 最常見的幾種簽名算法(JWA):HS256(HMAC-SHA256)
、RS256(RSA-SHA256)
還有 ES256(ECDSA-SHA256)
JWT 算法列表如下
+--------------+-------------------------------+--------------------+
| "alg" Param | Digital Signature or MAC | Implementation |
| Value | Algorithm | Requirements |
+--------------+-------------------------------+--------------------+
| HS256 | HMAC using SHA-256 | Required |
| HS384 | HMAC using SHA-384 | Optional |
| HS512 | HMAC using SHA-512 | Optional |
| RS256 | RSASSA-PKCS1-v1_5 using | Recommended |
| | SHA-256 | |
| RS384 | RSASSA-PKCS1-v1_5 using | Optional |
| | SHA-384 | |
| RS512 | RSASSA-PKCS1-v1_5 using | Optional |
| | SHA-512 | |
| ES256 | ECDSA using P-256 and SHA-256 | Recommended+ |
| ES384 | ECDSA using P-384 and SHA-384 | Optional |
| ES512 | ECDSA using P-521 and SHA-512 | Optional |
| PS256 | RSASSA-PSS using SHA-256 and | Optional |
| | MGF1 with SHA-256 | |
| PS384 | RSASSA-PSS using SHA-384 and | Optional |
| | MGF1 with SHA-384 | |
| PS512 | RSASSA-PSS using SHA-512 and | Optional |
| | MGF1 with SHA-512 | |
| none | No digital signature or MAC | Optional |
| | performed | |
+--------------+-------------------------------+--------------------+
The use of "+" in the Implementation Requirements column indicates
that the requirement strength is likely to be increased in a future
version of the specification.
可以看到被標(biāo)記為 Recommended 的只有 RS256 和 ES256。
對稱加密算法
插件安裝默認(rèn)使用
HS256
對稱加密算法。
HS256 使用同一個「secret_key」
進(jìn)行簽名與驗證。一旦 secret_key
泄漏,就毫無安全性可言了。因此 HS256 只適合集中式認(rèn)證,簽名和驗證都必須由可信方進(jìn)行。
非對稱加密算法
RS256 系列是使用 RSA 私鑰進(jìn)行簽名,使用 RSA 公鑰進(jìn)行驗證。
公鑰即使泄漏也毫無影響,只要確保私鑰安全就行。RS256 可以將驗證委托給其他應(yīng)用,只要將公鑰給他們就行。
以下為RS系列算法生成命令,僅供參考
RS512
ssh-keygen -t rsa -b 4096 -E SHA512 -m PEM -P "" -f RS512.key
openssl rsa -in RS512.key -pubout -outform PEM -out RS512.key.pub
RS512
ssh-keygen -t rsa -b 4096 -E SHA354 -m PEM -P "" -f RS384.key
openssl rsa -in RS384.key -pubout -outform PEM -out RS384.key.pub
RS256
ssh-keygen -t rsa -b 4096 -E SHA256 -m PEM -P "" -f RS256.key
openssl rsa -in RS256.key -pubout -outform PEM -out RS256.key.pub
具體算法配置請參考
config/plugin/tinywan/jwt/app.php
配置文件
?? 視頻地址
不懂的同學(xué)可以了解一下視頻,會有詳細(xì)的說明哦
- 如何使用 JWT 認(rèn)證插件:https://www.bilibili.com/video/BV1HS4y1F7Jx
- 如何使用 JWT 認(rèn)證插件(算法篇):https://www.bilibili.com/video/BV14L4y1g7sY