


Enregistrement complet du processus de simulation réel de l'authentification de connexion JWT
Apr 03, 2024 pm 01:22 PMAprè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.
Processus d'authentification par jeton
- En tant que solution d'authentification inter-domaines la plus populaire, JWT (JSON WEB Token) est profondément apprécié par les développeurs. Le processus principal est le suivant : Le client envoie le numéro de compte. et mot de passe Demande de connexion
- Le serveur reçoit la demande et vérifie si le mot de passe du compte est réussi
- Après une vérification réussie, le serveur générera un jeton unique et le renverra au client
- Le client reçoit le jeton et le stocke dans un cookie ou Chaque fois que le client envoie une requête au serveur après
- dans localStroge, le jeton sera transporté via le cookie ou l'en-tête
- Le serveur vérifie la validité du jeton et ne renvoie les données de réponse qu'après l'avoir transmis
- Prise en charge de l'accès entre domaines : les cookies ne permettent pas l'accès entre domaines. Cela n'existe pas pour le mécanisme de jeton. Le principe est que les informations d'authentification de l'utilisateur transmises sont transmises via
- Http. en-tête. Sans état : le mécanisme du jeton n'a pas besoin d'être stocké côté serveur, car le jeton lui-même contient les informations de tous les utilisateurs connectés, seules les informations d'état doivent être stockées dans le cookie du client ou. médias locaux
- Applicabilité plus large : tant que le client prend en charge le protocole http, l'authentification par jeton peut être utilisée.
- Pas besoin de prendre en compte le CSRF : puisqu'il ne repose plus sur les cookies, aucun CSRF ne se produira lors de l'utilisation de l'authentification par jeton, il n'est donc pas nécessaire de prendre en compte la défense CSRF
- Un JWT est en fait une
- chaîne , il se compose de trois parties : en-tête, charge utile et signature. Utilisez un point au milieu pour le séparer en trois parties. Notez qu'il n'y a pas de saut de ligne à l'intérieur du JWT.
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': '飞兔小哥' ] }
- ? 签名 / Signature
- 签名部分是对上面的 头部、载荷 两部分数据进行的数据签名
- 为了保证数据不被篡改,则需要指定一个密钥,而这个密钥一般只有你知道,并且存放在服务端
- 生成签名的代码一般如下:
// 其中secret 是密钥 String signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWT 基本使用
- 客户端收到服务器返回的 JWT,可以储存在 Cookie 里面, 也可以储存在 localStorage
- 然后 客户端每次与服务器通信,都要带上这个 JWT
- 把 JWT 保存在 Cookie 里面发送请求,这样不能跨域
- 更好的做法是放在 HTTP 请求的头信息 Authorization 字段里面
fetch('license/login', { headers: { 'Authorization': 'X-TOKEN' + token } })
实战:使用 JWT 登录认证
这里使用 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</code Le > ? part est également un objet <code>🎜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); } }
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); } }
附:为什么使用jwt而不使用session
- session是将客户端数据储存在服务器的内存,当客服端的数据过多,服务器的内存开销大;
- session的数据储存在某台服务器,在分布式的项目中无法做到共享;
- jwt的安全性更好。
总而言之,如果使用了分布式,切只能在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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



Cet article expliquera en détail comment PHP formate les lignes en CSV et écrit les pointeurs de fichiers. Je pense que c'est assez pratique, je le partage donc avec vous comme référence. J'espère que vous pourrez gagner quelque chose après avoir lu cet article. Formater les lignes au format CSV et écrire dans le pointeur de fichier Étape 1 : Ouvrir le pointeur de fichier $file=fopen("path/to/file.csv","w"); Étape 2 : Convertir les lignes en chaîne CSV à l'aide de la fonction fputcsv( ) convertit les lignes en chaînes CSV. La fonction accepte les paramètres suivants : $file : pointeur de fichier $fields : champs CSV sous forme de tableau $delimiter : délimiteur de champ (facultatif) $enclosure : guillemets de champ (

Cet article expliquera en détail la modification de l'umask actuel en PHP. L'éditeur pense que c'est assez pratique, je le partage donc avec vous comme référence. J'espère que vous pourrez gagner quelque chose après avoir lu cet article. Présentation de PHP modifiant l'umask actuel umask est une fonction php utilisée pour définir les autorisations de fichier par défaut pour les fichiers et répertoires nouvellement créés. Il accepte un argument, qui est un nombre octal représentant l'autorisation de bloquer. Par exemple, pour empêcher l'autorisation d'écriture sur les fichiers nouvellement créés, vous utiliserez 002. Méthodes pour modifier l'umask Il existe deux manières de modifier l'umask actuel en PHP : En utilisant la fonction umask() : La fonction umask() modifie directement l'umask actuel. Sa syntaxe est : intumas

Cet article expliquera en détail le calcul par PHP du hachage MD5 des fichiers. L'éditeur pense que c'est assez pratique, je le partage donc avec vous comme référence. J'espère que vous pourrez gagner quelque chose après avoir lu cet article. PHP calcule le hachage MD5 d'un fichier. MD5 (MessageDigest5) est un algorithme de chiffrement unidirectionnel qui convertit les messages de longueur arbitraire en une valeur de hachage de 128 bits de longueur fixe. Il est largement utilisé pour garantir l’intégrité des fichiers, vérifier l’authenticité des données et créer des signatures numériques. Calculer le hachage MD5 d'un fichier en PHP PHP propose plusieurs méthodes pour calculer le hachage MD5 d'un fichier : Utilisez la fonction md5_file() La fonction md5_file() calcule directement la valeur de hachage MD5 du fichier et renvoie une valeur de 32 caractères.

Cet article expliquera en détail comment PHP tronque les fichiers à une longueur donnée. L'éditeur pense que c'est assez pratique, je le partage donc avec vous comme référence. J'espère que vous pourrez gagner quelque chose après avoir lu cet article. Introduction à la troncature de fichiers PHP La fonction file_put_contents() en PHP peut être utilisée pour tronquer des fichiers à une longueur spécifiée. La troncature consiste à supprimer une partie de la fin d'un fichier, raccourcissant ainsi la longueur du fichier. Syntaxe file_put_contents($filename,$data,SEEK_SET,$offset);$filename : le chemin du fichier à tronquer. $data : Chaîne vide à écrire dans le fichier. SEEK_SET : désigné comme début du fichier

Cet article expliquera en détail comment PHP renvoie un tableau après avoir inversé la valeur de la clé. L'éditeur pense que c'est assez pratique, je le partage donc avec vous comme référence. J'espère que vous pourrez gagner quelque chose après avoir lu cet article. PHP Key Value Flip Array Key Value Flip est une opération sur un tableau qui échange les clés et les valeurs du tableau pour générer un nouveau tableau avec la clé d'origine comme valeur et la valeur d'origine comme clé. Méthode d'implémentation En PHP, vous pouvez effectuer un retournement clé-valeur d'un tableau via les méthodes suivantes : Fonction array_flip() : La fonction array_flip() est spécialement utilisée pour les opérations de retournement clé-valeur. Il reçoit un tableau en argument et renvoie un nouveau tableau avec les clés et les valeurs échangées. $original_array=[

Cet article expliquera en détail le codage numérique du message d'erreur renvoyé par PHP lors de l'opération Mysql précédente. L'éditeur pense que c'est assez pratique, je le partage donc avec vous comme référence. J'espère que vous pourrez gagner quelque chose après avoir lu cet article. . Utilisation de PHP pour renvoyer les informations d'erreur MySQL Introduction au codage numérique Lors du traitement des requêtes MySQL, vous pouvez rencontrer des erreurs. Afin de gérer efficacement ces erreurs, il est crucial de comprendre le codage numérique des messages d’erreur. Cet article vous guidera dans l'utilisation de php pour obtenir l'encodage numérique des messages d'erreur Mysql. Méthode d'obtention du codage numérique des informations d'erreur 1. mysqli_errno() La fonction mysqli_errno() renvoie le numéro d'erreur le plus récent de la connexion MySQL actuelle. La syntaxe est la suivante : $erro

Cet article expliquera en détail comment PHP détermine si une clé spécifiée existe dans un tableau. L'éditeur pense que c'est très pratique, je le partage donc avec vous comme référence. J'espère que vous pourrez gagner quelque chose après avoir lu cet article. PHP détermine si une clé spécifiée existe dans un tableau : En PHP, il existe de nombreuses façons de déterminer si une clé spécifiée existe dans un tableau : 1. Utilisez la fonction isset() : isset($array["key"]) Cette fonction renvoie une valeur booléenne, vraie si la clé spécifiée existe, fausse sinon. 2. Utilisez la fonction array_key_exists() : array_key_exists("key",$arr

Cet article expliquera en détail comment obtenir pi en PHP. L'éditeur pense que c'est assez pratique, je le partage donc avec vous comme référence. J'espère que vous pourrez gagner quelque chose après avoir lu cet article. Introduction à l'obtention de Pi avec PHP Pi (π) est le rapport entre la circonférence et le diamètre d'un cercle. C'est un nombre irrationnel et ne peut pas être exprimé avec un nombre fini de chiffres. En php, vous pouvez utiliser la fonction intégrée M_PI pour obtenir une valeur approximative de pi. Fonction M_PI La fonction M_PI renvoie une valeur approximative de pi, précise à 14 décimales près. C'est une constante de PHP, vous n'avez donc pas besoin d'utiliser de paramètres pour l'utiliser. Syntaxe de sortie 3.14159265358979 Méthodes alternatives En plus de la fonction M_PI, il existe quelques alternatives
