Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標準((RFC 7519),該token被設計為緊湊且安全的,特別適用於分佈式站點的單點登錄(SSO)場景。
JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。

HMAC-SHA256(SecretKey, Base64UrlEncode(JWT-Header)+'.'+Base64UrlEncode(JWT-Payload))base64(header).base64(payload).signature作為JWT token返回客戶端。composer require tinywan/jwt use Tinywan Jwt JwtToken ;
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' email ' => ' [email protected] '
];
$ token = JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));輸出(json格式)
{
"token_type" : " Bearer " ,
"expires_in" : 36000 ,
"access_token" : " eyJ0eXAiOiJAUR-Gqtnk9LUPO8IDrLK7tjCwQZ7CI... " ,
"refresh_token" : " eyJ0eXAiOiJIEGkKprvcccccQvsTJaOyNy8yweZc... "
}響應參數
| 參數 | 類型 | 描述 | 示例值 |
|---|---|---|---|
| token_type | string | Token 類型 | Bearer |
| expires_in | int | 憑證有效時間,單位:秒 | 36000 |
| access_token | string | 訪問憑證 | XXXXXXXXXXXXXXXXXXXX |
| refresh_token | string | 刷新憑證(訪問憑證過期使用) | XXXXXXXXXXXXXXXXXXXX |
1、獲取當前id
$ id = Tinywan Jwt JwtToken:: getCurrentId ();2、獲取所有字段
$ email = Tinywan Jwt JwtToken:: getExtend ();3、獲取自定義字段
$ email = Tinywan Jwt JwtToken:: getExtendVal ( ' email ' );4、刷新令牌(通過刷新令牌獲取訪問令牌)
$ refreshToken = Tinywan Jwt JwtToken:: refreshToken ();5、獲令牌有效期剩餘時長
$ exp = Tinywan Jwt JwtToken:: getTokenExp (); 6、單設備登錄。默認是關閉,開啟請修改配置文件config/plugin/tinywan/jwt
' is_single_device ' => true,單設備登錄支持定義客戶端
client字段,自定義客戶端單點登錄(默認為WEB,即網頁端),如:MOBILE、APP、WEB、ADMIN、API、OTHER等等
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => ' MOBILE ' ,
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));7、獲取當前用戶信息(模型)
$ user = Tinywan Jwt JwtToken:: getUser ();該配置項目'user_model'為一個匿名函數,默認返回空數組,可以根據自己項目ORM定制化自己的返回模型
ThinkORM配置
' user_model ' => function ( $ uid ) {
// 返回一个数组
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、令牌清理
$ res = Tinywan Jwt JwtToken:: clear ();只有配置項
is_single_device為true才會生效。可選參數:MOBILE、APP、WEB、ADMIN、API、OTHER等等
9、自定義終端client
// 生成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 );默認是WEB端
10、自定義訪問令牌和刷新令牌過期時間
$ extend = [
' id ' => 2024 ,
' access_exp ' => 7200 , // 2 小时
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ extend );11、令牌過期錯誤碼
401011401012401013401014401015401021401022401023401024401025 JWT 最常見的幾種簽名算法(JWA): HS256(HMAC-SHA256) 、 RS256(RSA-SHA256)還有ES256(ECDSA-SHA256)
+--------------+-------------------------------+--------------------+
| " 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.可以看到被標記為Recommended 的只有RS256 和ES256。
插件安裝默認使用
HS256對稱加密算法。
HS256 使用同一個「secret_key」進行簽名與驗證。一旦secret_key洩漏,就毫無安全性可言了。因此HS256 只適合集中式認證,簽名和驗證都必須由可信方進行。
RS256 系列是使用RSA 私鑰進行簽名,使用RSA 公鑰進行驗證。
公鑰即使洩漏也毫無影響,只要確保私鑰安全就行。 RS256 可以將驗證委託給其他應用,只要將公鑰給他們就行。
以下為RS系列算法生成命令,僅供參考
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.pubssh-keygen -t rsa -b 4096 -E SHA354 -m PEM -P "" -f RS384 .key
openssl rsa -in RS384 .key -pubout -outform PEM -out RS384 .key.pubssh-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不懂的同學可以了解一下視頻,會有詳細的說明哦
https://www.w3cschool.cn/fastapi/fastapi-cmia3lcw.html
有許多方法可以處理安全性、身份認證和授權等問題。而且這通常是一個複雜而「困難」的話題。在許多框架和系統中,僅處理安全性和身份認證就會花費大量的精力和代碼(在許多情況下,可能佔編寫的所有代碼的50% 或更多)。
Jwt 可幫助你以標準的方式輕鬆、快速地處理安全性,而無需研究和學習所有的安全規範。
假設您在某個域中擁有後端API。並且您在另一個域或同一域的不同路徑(或移動應用程序)中有一個前端。並且您希望有一種方法讓前端使用用戶名和密碼與後端進行身份驗證。我們可以使用OAuth2通過JWT來構建它。
username和password ,然後點擊Enter。username和password我們的API在一個特定的URL(以申報tokenUrl="token" )。Authorization一個值為Bearer加上令牌的標頭。如果令牌包含foobar ,則Authorization標頭的內容將為: Bearer foobar 。注意:中间是有个空格。