經過php小編香蕉精心整理,我們為大家介紹一款熱門的實戰開發模擬過程全紀錄-JWT登入認證實戰模擬。 JWT(JSON Web Token)是一種用於認證的開放標準,它透過在使用者登入成功後產生一個令牌(Token),使用者在後續的請求中攜帶這個令牌來進行身份認證。本文將深入剖析JWT登入認證的實現過程,並提供全面的實戰演示錄音,在這個過程中,我們將帶您了解JWT的原理以及如何在實際開發中應用。無論你是初學者還是有經驗的開發者,都能從本文中獲得有價值的知識和實戰經驗。
服務端驗證token 的有效性,透過才回傳回應的資料
Token 認證優點
? 頭/ header
header
由兩個部分組成: token
的類型JWT
和演算法名稱:H<strong class="keylink">Mac</strong>
、SHA256
、RSA
{ "alg": "HS256", "typ": "JWT" }
? 載荷/ Payload
#Payload
部分也是<strong class="keylink">js</strong>ON
對象,用來存放實際需要傳遞的資料。 JWT
指定七個預設欄位供選擇。
除了預設字段之外,你完全可以添加自己想要的任何字段,一般用戶登入成功後,就將用戶資訊存放在這裡
iss:發行人
exp:到期時間
sub:主題
aud:使用者
nbf:在此之前不可用
iat:發佈時間
jti:JWT ID用於識別該JWT
{ "iss": "xxxxxxx", "sub": "xxxxxxx", "aud": "xxxxxxx", "user": [ 'username': '极客飞兔', 'gender': 1, 'nickname': '飞兔小哥' ] }
// 其中secret 是密钥 String signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
fetch('license/login', { headers: { 'Authorization': 'X-TOKEN' + token } })
這裡使用Think<strong class="keylink">PHP</strong>6
整合JWT
登入認證進行實戰模擬
? 安裝JWT 擴充功能
composer require firebase/php-jwt
? 封裝產生JWT 和解密方法
<?php namespace app\services; use app\Helper; use Firebase\JWT\JWT; use Firebase\JWT\Key; class JwtService { protected $salt; public function __construct() { //从配置信息这种或取唯一字符串,你可以随便写比如md5('token') $this->salt = config('jwt.salt') || "autofelix"; } // jwt生成 public function generateToken($user) { $data = array( "iss" => 'autofelix',//签发者 可以为空 "aud" => 'autofelix', //面象的用户,可以为空 "iat" => Helper::getTimestamp(), //签发时间 "nbf" => Helper::getTimestamp(), //立马生效 "exp" => Helper::getTimestamp() + 7200, //token 过期时间 两小时 "user" => [ // 记录用户信息 'id' => $user->id, 'username' => $user->username, 'truename' => $user->truename, 'phone' => $user->phone, 'email' => $user->email, 'role_id' => $user->role_id ] ); $jwt = JWT::encode($data, md5($this->salt), 'HS256'); return $jwt; } // jwt解密 public function chekToken($token) { JWT::$leeway = 60; //当前时间减去60,把时间留点余地 $decoded = JWT::decode($token, new Key(md5($this->salt), 'HS256')); return $decoded; } }
? 使用者登入後,產生JWT 識別碼
<?php declare (strict_types=1); namespace app\controller; use think\Request; use app\ResponseCode; use app\Helper; use app\model\User as UserModel; use app\services\JwtService; class License { public function login(Request $request) { $data = $request->only(['username', 'passWord', 'code']); // ....进行验证的相关逻辑... $user = UserModel::where('username', $data['username'])->find(); // 验证通过生成 JWT, 返回给前端保存 $token = (new JwtService())->generateToken($user); return json([ 'code' => ResponseCode::SUCCESS, 'message' => '登录成功', 'data' => [ 'token' => $token ] ]); } }
? 中間件驗證使用者是否登入
#在middleware.php
註冊中介軟體
<?php // 全局中间件定义文件 return [ // ...其他中间件 // JWT验证 \app\middleware\Auth::class ];
註冊中間件後,在權限驗證中介軟體中完善驗證邏輯
<?php declare (strict_types=1); namespace app\middleware; use app\ResponseCode; use app\services\JwtService; class Auth { private $router_white_list = ['login']; public function handle($request, \Closure $next) { if (!in_array($request->pathinfo(), $this->router_white_list)) { $token = $request->header('token'); try { // jwt 验证 $jwt = (new JwtService())->chekToken($token); } catch (\Throwable $e) { return json([ 'code' => ResponseCode::ERROR, 'msg' => 'Token验证失败' ]); } $request->user = $jwt->user; } return $next($request); } }
总而言之,如果使用了分布式,切只能在session和jwt里面选的时候,就一定要选jwt。
以上是JWT登入認證實戰模擬流程全紀錄的詳細內容。更多資訊請關注PHP中文網其他相關文章!