Maison >développement back-end >tutoriel php >Qu'est-ce que JWT ? Une brève compréhension de JWT
Le contenu de cet article porte sur qu'est-ce que JWT ? Une simple compréhension de JWT a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer, j'espère que cela vous sera utile.
Je n'ai jamais bien regardé jwt jusqu'à ce que je doive faire une vérification Web il y a deux jours. Un ami m'a recommandé jwt. Ce n’est qu’à ce moment-là que j’ai découvert que jwt était largement utilisé par tout le monde. Il semble que je suis un peu à l'écart. Haha, profite du monde pour bien regarder ça.
JWT (JSON Web Token), comme son nom l'indique, est un token pouvant être transmis sur le Web. Ce token est formaté au format JSON. Il s'agit d'une norme open source (RFC 7519) qui définit une manière compacte et autonome de transmettre en toute sécurité des informations au format JSON entre différentes entités.Étant donné que de nombreux projets ont désormais une séparation front-end et back-end, un mode API reposant. Par conséquent, le mode de session traditionnel ne peut pas répondre aux exigences d'authentification. À ce stade, le rôle de jwt arrive. On peut dire que l'authentification API reposante est un bon scénario d'application de jwt.
Ce qui suit est une petite démo
<?php require_once 'src/JWT.php'; header('Content-type:application/json'); //定义Key const KEY = 'dasjdkashdwqe1213dsfsn;p'; $user = [ 'uid'=>'dadsa-12312-vsd1s1-fsds', 'account'=>'daisc', 'password'=>'123456' ]; $redis = redis(); $action = $_GET['action']; switch ($action) { case 'login': login(); break; case 'info': info(); break; } //登陆,写入验证token function login() { global $user; $account = $_GET['account']; $pwd = $_GET['password']; $res = []; if($account==$user['account']&&$pwd==$user['password']) { unset($user['password']); $time = time(); $token = [ 'iss'=>'http://test.cc',//签发者 'iat'=>$time, 'exp'=>$time+60, 'data'=>$user ]; $jwt = \Firebase\JWT\JWT::encode($token,KEY); $res['code'] = 200; $res['message'] = '登录成功'; $res['jwt'] = $jwt; } else { $res['message']= '用户名或密码错误'; $res['code'] = 401; } exit(json_encode($res)); } function info() { $jwt = $_SERVER['HTTP_AUTHORIZATION'] ?? false; $res['code'] = 200; if($jwt) { $jwt = str_replace('Bearer ','',$jwt); if(empty($jwt)) { $res['code'] = 401; $res['msg'] = 'You do not have permission to access.'; exit(json_encode($res)); } try{ $token = (array) \Firebase\JWT\JWT::decode($jwt,KEY, ['HS256']); if($token['exp']<time()) { $res['code'] = 401; $res['msg'] = '登录超时,请重新登录'; } $res['data']= $token['data']; }catch (\Exception $E) { $res['code'] = 401; $res['msg'] = '登录超时,请重新登录.'; } } else { $res['code'] = 401; $res['msg'] = 'You do not have permission to access.'; } exit(json_encode($res)); } //连接redis function redis() { $redis = new Redis(); $redis->connect('127.0.0.1'); return $redis; }
Ce dmeo utilise jwt pour effectuer une authentification simple. Un package de chiffrement php-jwt est utilisé https://github.com/firebase/php-jwt
La KEY est la clé privée définie, qui est la partie signe dans jwt.
La partie en-tête du package php-jwt a été complétée pour nous. Le code de cryptage est le suivant
*/ public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null) { $header = array('typ' => 'JWT', 'alg' => $alg); if ($keyId !== null) { $header['kid'] = $keyId; } if ( isset($head) && is_array($head) ) { $header = array_merge($head, $header); } $segments = array(); $segments[] = static::urlsafeB64Encode(static::jsonEncode($header)); $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload)); $signing_input = implode('.', $segments); $signature = static::sign($signing_input, $key, $alg); $segments[] = static::urlsafeB64Encode($signature); return implode('.', $segments); }
On peut voir que la méthode de cryptage par défaut est HS256. C'est aussi la raison pour laquelle jwt est sûr. A ce stade, le cryptage HS256 est encore très sécurisé.
Ce package prend également en charge le cryptage des certificats.
Ce package a terminé le processus de cryptage et de décryptage pour nous. Il nous suffit donc de définir la partie poyload dans jwt. C'est la partie symbolique de la démo. Si le cryptage réussit, une chaîne JWT cryptée sera obtenue. Le frontal devra transporter cette chaîne JWT comme authentification la prochaine fois lors de la demande de l'API.
Ajouter une autorisation dans l'en-tête. Lors de la vérification côté serveur, cette valeur est obtenue pour vérifier la validité de la réponse.
Voici quelques configurations courantes de poyload
$token = [ #非必须。issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者。 "iss" => "http://example.org", #非必须。issued at。 token创建时间,unix时间戳格式 "iat" => $_SERVER['REQUEST_TIME'], #非必须。expire 指定token的生命周期。unix时间戳格式 "exp" => $_SERVER['REQUEST_TIME'] + 7200, #非必须。接收该JWT的一方。 "aud" => "http://example.com", #非必须。该JWT所面向的用户 "sub" => "jrocket@example.com", # 非必须。not before。如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟。 "nbf" => 1357000000, # 非必须。JWT ID。针对当前token的唯一标识 "jti" => '222we', # 自定义字段 "GivenName" => "Jonny", # 自定义字段 "name" => "Rocket", # 自定义字段 "Email" => "jrocket@example.com", ];
Les configurations qu'il contient peuvent être configurées librement, ou vous pouvez en ajouter d'autres par vous-même. Ceux-ci sont couramment utilisés par tout le monde en ligne. On peut dire qu'il s'agit d'une sorte d'accord.
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!