詳解thinkphp6.0.7怎麼使用JWT
下面thinkphp框架教學專欄將介紹關於thinkphp6.0.7中怎麼使用JWT,希望對需要的朋友有幫助!
thinkphp6.0.7中使用JWT超詳細解說(含程式碼)
JWT是什麼
JWT是json web token縮寫。它將用戶資訊加密到token裡,伺服器不保存任何用戶資訊。伺服器透過使用已儲存的金鑰驗證token的正確性,只要正確即通過驗證。基於token的身份驗證可以取代傳統的cookie session身份驗證方法。
基於session的登入認證
在傳統的使用者登入認證中,因為http是無狀態的,所以都是採用session方式。使用者登入成功,服務端會保證一個session,當然會給客戶端一個sessionId,客戶端會把sessionId保存在cookie中,每次請求都會攜帶這個sessionId。
cookie session這種模式通常是保存在記憶體中,而且服務從單服務到多服務會面臨的session共享問題,隨著用戶量的增多,開銷就會越大。而JWT不是這樣的,只需要服務端產生token,客戶端保存這個token,每次請求攜帶這個token,服務端認證解析就可。
JWT由三個部分組成:header.payload.signature
header部分:
{ "alg": "HS256", "typ": "JWT" }
对应base64UrlEncode编码为:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 说明:该字段为json格式。alg字段指定了生成signature的算法,默认值为 HS256,typ默认值为JWT
payload部分:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
对应base64UrlEncode编码为:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ 说明:该字段为json格式,表明用户身份的数据,可以自己自定义字段,很灵活。sub 面向的用户,name 姓名 ,iat 签发时间。例如可自定义示例如下:
{ "iss": "admin", //该JWT的签发者 "sub": "www.admin.com", //面向的用户 “aud”: "zhangsan", //接收jwt的一方 "iat": 1535967430, //签发时间 "exp": 1535974630, //过期时间 "nbf": 1535967430, //该时间之前不接收处理该Token "jti": "9f10e796726e332cec401c569969e13e" //该Token唯一标识 }
signature部分:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), 123456 )
对应的签名为:keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU 最终得到的JWT的Token为(header.payload.signature):eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU 说明:对header和payload进行base64UrlEncode编码后进行拼接。通过key(这里是123456)进行HS256算法签名。
JWT使用流程
初次登录:用户初次登录,输入用户名密码 密码验证:服务器从数据库取出用户名和密码进行验证 生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT 返还JWT:服务器的HTTP RESPONSE中将JWT返还 带JWT的请求:以后客户端发起请求,HTTP REQUEST HEADER中的Authorizatio字段都要有值,为JWT 服务器验证JWT
jwt版本
##php中jwt有多個版本:我選擇的是最新版本。別問為什麼,你買電子產品都是買新不買舊呢。看圖可以發現4.1.0的版本支援更多參數。具體參數下面會解釋
安裝jwt
2、從github下載點我跳到github位址:
https://github.com/lcobucci/jwt
依賴#
PHP 5.5+ OpenSSL扩展
名稱解釋
iss (issuer) issuer 請求實體,可以是發起請求的使用者的訊息,也可是jwt的簽發者
sub (Subject) 設定主題,類似於發郵件時的主題
aud (audience) 接收jwt的一方
exp (expire) token過期時間
nbf (not before) 目前時間在nbf設定時間之前,該token無法使用
iat (issued at) token建立時間
jti (JWT ID) 對目前token設定唯一標示
PHP如何實現JWT
本人使用的是PHP 7.3.4,不廢話,直接上程式碼,新建jwt.php,複製貼上如下:<?php /** * PHP实现jwt */ class Jwt { //头部 private static $header=array( 'alg'=>'HS256', //生成signature的算法 'typ'=>'JWT' //类型 ); //使用HMAC生成信息摘要时所使用的密钥 private static $key='123456'; /** * 获取jwt token * @param array $payload jwt载荷 格式如下非必须 * [ * 'iss'=>'jwt_admin', //该JWT的签发者 * 'iat'=>time(), //签发时间 * 'exp'=>time()+7200, //过期时间 * 'nbf'=>time()+60, //该时间之前不接收处理该Token * 'sub'=>'www.admin.com', //面向的用户 * 'jti'=>md5(uniqid('JWT').time()) //该Token唯一标识 * ] * @return bool|string */ public static function getToken(array $payload) { if(is_array($payload)) { $base64header=self::base64UrlEncode(json_encode(self::$header,JSON_UNESCAPED_UNICODE)); $base64payload=self::base64UrlEncode(json_encode($payload,JSON_UNESCAPED_UNICODE)); $token=$base64header.'.'.$base64payload.'.'.self::signature($base64header.'.'.$base64payload,self::$key,self::$header['alg']); return $token; }else{ return false; } } /** * 验证token是否有效,默认验证exp,nbf,iat时间 * @param string $Token 需要验证的token * @return bool|string */ public static function verifyToken(string $Token) { $tokens = explode('.', $Token); if (count($tokens) != 3) return false; list($base64header, $base64payload, $sign) = $tokens; //获取jwt算法 $base64decodeheader = json_decode(self::base64UrlDecode($base64header), JSON_OBJECT_AS_ARRAY); if (empty($base64decodeheader['alg'])) return false; //签名验证 if (self::signature($base64header . '.' . $base64payload, self::$key, $base64decodeheader['alg']) !== $sign) return false; $payload = json_decode(self::base64UrlDecode($base64payload), JSON_OBJECT_AS_ARRAY); //签发时间大于当前服务器时间验证失败 if (isset($payload['iat']) && $payload['iat'] > time()) return false; //过期时间小宇当前服务器时间验证失败 if (isset($payload['exp']) && $payload['exp'] time()) return false; return $payload; } /** * base64UrlEncode https://jwt.io/ 中base64UrlEncode编码实现 * @param string $input 需要编码的字符串 * @return string */ private static function base64UrlEncode(string $input) { return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); } /** * base64UrlEncode https://jwt.io/ 中base64UrlEncode解码实现 * @param string $input 需要解码的字符串 * @return bool|string */ private static function base64UrlDecode(string $input) { $remainder = strlen($input) % 4; if ($remainder) { $addlen = 4 - $remainder; $input .= str_repeat('=', $addlen); } return base64_decode(strtr($input, '-_', '+/')); } /** * HMACSHA256签名 https://jwt.io/ 中HMACSHA256签名实现 * @param string $input 为base64UrlEncode(header).".".base64UrlEncode(payload) * @param string $key * @param string $alg 算法方式 * @return mixed */ private static function signature(string $input, string $key, string $alg = 'HS256') { $alg_config=array( 'HS256'=>'sha256' ); return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true)); } } //***********测试和官网是否匹配begin**************************** $payload=array('sub'=>'1234567890','name'=>'John Doe','iat'=>1516239022); $jwt=new Jwt; $token=$jwt->getToken($payload); echo "<pre class="brush:php;toolbar:false">"; echo $token; //对token进行验证签名 $getPayload=$jwt->verifyToken($token); echo "<br><br>"; var_dump($getPayload); echo "<br><br>"; //测试和官网是否匹配end //自己使用测试begin $payload_test=array('iss'=>'admin','iat'=>time(),'exp'=>time()+7200,'nbf'=>time(),'sub'=>'www.admin.com','jti'=>md5(uniqid('JWT').time()));; $token_test=Jwt::getToken($payload_test); echo "<pre class="brush:php;toolbar:false">"; echo $token_test; //对token进行验证签名 $getPayload_test=Jwt::verifyToken($token_test); echo "<br><br>"; var_dump($getPayload_test); echo "<br><br>"; //自己使用时候end
以上是詳解thinkphp6.0.7怎麼使用JWT的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

隨著網路的發展,越來越多的網站和應用需要提供API介面來進行資料互動。在這種情況下,API身份驗證和加密成為了非常重要的問題。而JWT和JWE作為一種流行的身份驗證和加密機制,在PHP的應用也越來越廣泛。那麼,本文將介紹如何在PHP中使用JWT和JWE進行API身份驗證和加密。 JWT的基本概念JWT代表JSONWe

JWT(JSONWebToken)是一種輕量級的認證和授權機制,它使用JSON物件作為安全令牌,可以在多個系統之間安全地傳輸使用者身分資訊。而ThinkPHP6是一種基於PHP語言的高效、靈活的MVC框架,它提供了許多有用的工具和功能,其中就包括JWT認證機制。在本文中,我們將介紹如何使用ThinkPHP6進行JWT認證,以確保Web應用程式的安全性與可靠

PHP中的安全JWT令牌產生與驗證技術解析隨著網路應用的發展,使用者身份驗證與授權變得越來越重要。 JsonWebToken(JWT)是一種用於在網路應用中安全傳輸資訊的開放標準(RFC7519)。在PHP開發中,使用JWT令牌來實現使用者身份驗證和授權已成為一種常見的做法。本文將介紹PHP中的安全JWT令牌產生與驗證技術。一、JWT基礎知識在了解如何生成與

PHP中的OAuth:創建一個JWT授權伺服器隨著行動應用和前後端分離的趨勢的興起,OAuth成為了現代Web應用中不可或缺的一部分。 OAuth是一種授權協議,透過提供標準化的流程和機制,用於保護使用者的資源免受未經授權的存取。在本文中,我們將學習如何使用PHP建立一個基於JWT(JSONWebTokens)的OAuth授權伺服器。 JWT是一種用於在網路中

Vue.js是一種流行的JavaScript框架,用於建立動態網路應用程式。實現使用者登入驗證是開發網頁應用程式的必要部分之一。本文將介紹使用Vue.js、API、JWT和axios實作登入驗證的完整指南。創建Vue.js應用程式首先,我們需要建立一個新的Vue.js應用程式。我們可以使用VueCLI或手動建立一個Vue.js應用程式。安裝axiosax

本篇文章為大家帶來了關於JWT的相關知識,其中主要介紹了什麼是JWT? JWT的原理以及用法是什麼?有興趣的朋友,下面一起來看看吧,希望對大家有幫助。

如何使用JWT在PHP應用中實現身份驗證和授權引言:隨著互聯網的快速發展,身份驗證和授權在Web應用程式中變得日益重要。 JSONWebToken(JWT)是一種流行的認證和授權機制,它在PHP應用中廣泛應用。本文將介紹如何使用JWT在PHP應用中實現身份驗證和授權,並提供程式碼範例,幫助讀者更好地理解JWT的使用方法。一、JWT簡介JSONWebTo

Golang開發:實現基於JWT的使用者身分驗證隨著網路的快速發展,使用者身分驗證成為了Web應用中至關重要的一部分。傳統的基於Cookie的身份驗證方式已逐漸被基於JWT(JSONWebToken)的身份驗證方式所取代。 JWT是一種輕量級的身份驗證標準,它允許服務端產生一個加密的令牌,並將該令牌發送給客戶端,客戶端發送請求的時候將令牌放入Authori
