php JWT在web端中的使用方法教程

2022-09-29 04:36:08 字數 2987 閱讀 6856

解釋一下jwt

jwt就是乙個字串,經過加密處理與校驗處理的字串,由三個部分組成。基於token的身份驗證可以替代傳統的cookie+session身份驗證方法。三個部分分別如下:

header.payload.signature

header部分組成

header 格式為:

這就是乙個json串,兩個欄位都是必須的,alg欄位指定了生成signature的演算法,預設值為 hs256,可以自己指定其他的加密演算法,如rsa.經過base64encode就可以得到 header.

payload 部分組成

playload 基本組成部分:

簡單點:

$payload=[

'iss' => $issuer, //簽發者

'iat' => $_server['request_time'], //什麼時候簽發的

'exp' => $_server['request_time'] + 7200 //過期時間

'uid'=>1111

];複雜點:官方說法,三個部分組成(reserved claims,public claims,private claims)

$token = [

#非必須。issuer 請求實體,可以是發起請求的使用者的資訊,也可是jwt的簽發者。

"iss" => "",

#非必須。issued at。 token建立時間,unix時間戳格式

"iat" => $_server['request_time'],

#非必須。expire 指定token的生命週期。unix時間戳格式

"exp" => $_server['request_time'] + 7200,

#非必須。接收該jwt的一方。

"aud" => "",

#非必須。該jwt所面向的使用者

"sub" => "[email protected]",

# 非必須。not before。如果當前時間在nbf裡的時間之前,則token不被接受;一般都會留一些餘地,比如幾分鐘。

"nbf" => 1357000000,

# 非必須。jwt id。針對當前token的唯一標識

"jti" => '222we',

# 自定義字段

"givenn" => "jonny",

# 自定義字段

"name" => "rocket",

# 自定義字段

"email" => "[email protected]",

];payload 也是乙個json資料,是表明使用者身份的資料,可以自己自定義字段,很靈活。你也可以簡單的使用,比如簡單的方式。經過json_encode和base64_encode就可得到payload

signature組成部分

將 header和 payload使用header中指定的加密演算法加密,當然加密過程還需要自定秘鑰,自己選乙個字串就可以了。

官網例項:

hmacsha256(

base64urlencode(header) + "." +

base64urlencode(payload),

secret)

自己使用:

phppublic static function encode(array $payload, stmevehlfring $key, string $alg = 'sha256')

public static function signature(string $input, string $key, string $alg)

這三個部分使用.連線起來就是高大上的jwt,然後就可以使用了.

jwt使用流程

官方使用流程說明:

程式設計客棧

翻譯一下:

jwt 驗證過程

因為自己寫的,沒有使用框架,所以還是得簡單記錄一下驗證過程

客戶端在請求頭中帶有jwt資訊,後端獲取$_server[http_authorization]:

不過注意一點,我這個authorization沒有加bearer,官方使用中就使用了bearer,你也可以自己使用:

authorization: bearer

php 驗證偽**:

<?php public static function decode(string $jwt, string $key)

public static function urlsafeb64decode(string $input)

return base64_decode(strtr($input, '-_', '+/')); }

public static function urlsafeb64encode(string $input)

jwt 在使用中的注意事項

使用了 jwt 我們一般都會考慮兩點:

1. 簽名是否正確?

2. token是否到期?

這兩塊可以通過校驗幾個欄位來處理

1. 建立 token 吊銷機制,將 token 寫入資料庫,

2. 無效 token 因未入資料庫,所以確信傳入的 token 是有效的。

3. 對有效的 token 進行簽名驗證,獲取到 token 後重新生成簽名進行校驗 token 的簽名部分( c 位的值)是否一致。

4. 確認是否 token 超時可以通過 exp(expire 指定token的生命週期。unix時間戳格式) 和 nbf(not before。如果當前時間在nbf裡的時間之前,則token不被接受。unix時間戳格式。) 宣告,獲取到 token 後,對時間進行判斷。

5. 為了防止replay attack,可加上 iss(issuer 請求實體,可以是發起請求的使用者的資訊,也可是jwt的簽發者。),jti (jwt id。針對當前token的唯一標識) 和 iat(issued at。 token建立時間,unix時間戳格式) 宣告,然後獲取到 token 後,對宣告資訊進行匹配。

參考文章:

總結本文標題: php jwt在web端中的使用方法教程

本文位址:

在web端使用Linq查詢

老版本 引入老版本的js 根據組織id查詢出部門 var selectde jslinq depeart where function item orderby function item select function item 新版本 src script libs linq.min.js sc...

Spring在web中的使用

1.spring 如何在 web 應用中使用 1 需要額外加入的 jar 包 spring web 4.0.0.release.jar spring webmvc 4.0.0.release.jar 2 spring 的配置檔案,沒有什麼不同 3 如何建立 ioc 容器 非 web 應用在 main...

ZedGraph在Web中的使用

sql 實現分組統計查詢 按月 小時分組 中介紹了按月和小時為單位怎樣實現分組查詢,在本文中會實現將上文查詢的結果以圖表的形式顯示在頁面上。在頁面上顯示圖示有很多種解決方案,office 的owc 組建 自己寫 或者是第三方的控制項。本文中將使用 zedgraph 控制項來實現。選擇 zedgrap...