84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1183 orang belajar
32909 orang belajar
Selepas kompilasi teliti oleh editor PHP Banana, kami memperkenalkan kepada anda rekod penuh popular proses simulasi pembangunan sebenar - simulasi sebenar pengesahan log masuk JWT. JWT (JSON Web Token) ialah standard terbuka untuk pengesahan Ia menghasilkan token (Token) selepas pengguna berjaya log masuk, dan pengguna membawa token ini dalam permintaan seterusnya untuk pengesahan identiti. Artikel ini akan memberikan analisis mendalam tentang proses pelaksanaan pengesahan log masuk JWT dan menyediakan rakaman demonstrasi praktikal yang komprehensif Dalam proses tersebut, kami akan membawa anda memahami prinsip JWT dan cara menerapkannya dalam pembangunan sebenar. Sama ada anda seorang pemula atau pembangun berpengalaman, anda boleh memperoleh pengetahuan dan pengalaman praktikal yang berharga daripada artikel ini.
?
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
Mac, SHA256
, RSA
<?php // 全局中间件定义文件 return [ // ...其他中间件 // JWT验证 \app\middleware\Auth::class ];
Payload/ Payload
🎜🎜Payload</code The > bahagian juga merupakan objek <code>🎜js🎜ON
, digunakan untuk menyimpan data sebenar yang perlu dihantar. JWT
menentukan tujuh medan lalai untuk dipilih. 🎜🎜Selain medan lalai, anda boleh menambah mana-mana medan yang anda mahu Secara amnya, selepas pengguna berjaya log masuk, maklumat pengguna akan disimpan di sini🎜🎜iss: issuer 🎜exp: masa tamat tempoh🎜sub: Topik. 🎜aud: Pengguna 🎜nbf: Tidak tersedia sebelum ini 🎜iat: Masa keluaran 🎜jti: ID JWT digunakan untuk mengenal pasti JWT ini 🎜🎜
<?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); } }
JWT
pengesahan log masuk untuk simulasi sebenar🎜🎜 🎜Pasang sambungan JWT 🎜🎜🎜🎜🎜🎜 kaedah penjanaan dan penyahsulitan🎜🎜🎜rrreee🎜? 🎜Selepas pengguna log masuk, jana pengenalan JWT🎜🎜🎜rrreee🎜 🎜Middleware mengesahkan sama ada pengguna telah log masuk phpmiddleware🎜🎜🎜🎜 🎜🎜🎜rrreee🎜Selepas mendaftar middleware, Tingkatkan logik pengesahan dalam middleware pengesahan kebenaran🎜<?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。
Atas ialah kandungan terperinci Rekod penuh proses simulasi sebenar pengesahan log masuk JWT. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!