Maison > Article > développement back-end > Enregistrement complet du processus de simulation réel de l'authentification de connexion JWT
Après une compilation minutieuse par l'éditeur PHP Banana, nous vous présentons un enregistrement complet populaire du processus de simulation de développement réel - simulation réelle d'authentification de connexion JWT. JWT (JSON Web Token) est une norme ouverte d'authentification. Il génère un jeton (Token) une fois que l'utilisateur s'est connecté avec succès, et l'utilisateur transporte ce jeton dans les demandes ultérieures d'authentification d'identité. Cet article fournira une analyse approfondie du processus de mise en œuvre de l'authentification de connexion JWT et fournira un enregistrement de démonstration pratique complet. Au cours du processus, nous vous ferons comprendre les principes de JWT et comment l'appliquer dans le développement réel. Que vous soyez débutant ou développeur expérimenté, vous pouvez acquérir de précieuses connaissances et une expérience pratique grâce à cet article.
En-tête/en-tête
en-tête
se compose de deux parties : jeton
type JWT
et algorithmeheader
由两部分组成: 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
Nom : H<strong class="keylink">Mac</strong>
, SHA256
, RSA
<?php // 全局中间件定义文件 return [ // ...其他中间件 // JWT验证 \app\middleware\Auth::class ];
Charge utile/ Charge utile🎜🎜🎜
Charge utile
Le > ? part est également un objet 🎜js🎜ON
, utilisé pour stocker les données réelles qui doivent être transférées. JWT
spécifie sept champs par défaut parmi lesquels choisir. 🎜🎜En plus des champs par défaut, vous pouvez ajouter tous les champs de votre choix. Généralement, une fois qu'un utilisateur s'est connecté avec succès, les informations utilisateur seront stockées ici🎜🎜iss : émetteur 🎜exp : délai d'expiration🎜sub : Sujet. 🎜aud : Utilisateur 🎜nbf : Non disponible avant cela 🎜iat : Heure de sortie 🎜jti : ID JWT utilisé pour identifier ce JWT 🎜🎜
<?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); } }🎜🎜 🎜Signature/Signature 🎜🎜🎜La partie signature est juste au-dessus des données signature des parties d'en-tête et de charge utile 🎜🎜Afin de garantir que les données ne sont pas falsifiées, vous devez spécifier une clé, et cette clé n'est généralement connue que de vous et est stockée sur le serveur 🎜🎜Le code pour générer le la signature est généralement la suivante :🎜🎜🎜rrreee🎜JWT Utilisation de base🎜🎜🎜Le client reçoit le JWT renvoyé par le serveur🎜, qui peut être stocké dans un cookie ou dans localStorage🎜🎜Le client doit ensuite l'apporter à chaque communication avec le serveur JWT🎜🎜Enregistrez JWT dans Cookie pour envoyer la requête, afin qu'elle ne puisse pas traverser le domaine🎜🎜Une meilleure façon est de le mettre dans le champ Autorisation des informations d'en-tête de la requête HTTP🎜🎜🎜rrreee🎜Combat pratique : Utiliser Authentification de connexion JWT🎜🎜Utiliser
Think🎜PHP🎜6
intègre l'authentification de connexion JWT
pour une simulation pratique🎜🎜 🎜Installer l'extension JWT🎜🎜🎜rrreee🎜 🎜Encapsuler le JWT ? méthode de génération et de décryptage🎜🎜🎜rrreee🎜 ? 🎜Une fois l'utilisateur connecté, générer une identification JWT🎜🎜🎜rrreee🎜 🎜Le middleware vérifie si l'utilisateur est connecté🎜🎜🎜Enregistrer le 🎜middleware dans middleware.php
🎜🎜🎜rrreee🎜Après avoir enregistré le middleware, améliorez la logique de vérification dans le middleware de vérification des autorisations🎜<?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。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!