Nach sorgfältiger Zusammenstellung durch den PHP-Editor Banana stellen wir Ihnen eine beliebte vollständige Aufzeichnung des tatsächlichen Entwicklungssimulationsprozesses vor – die tatsächliche Simulation der JWT-Anmeldeauthentifizierung. JWT (JSON Web Token) ist ein offener Standard für die Authentifizierung. Er generiert ein Token (Token), nachdem sich der Benutzer erfolgreich angemeldet hat, und der Benutzer trägt dieses Token in nachfolgenden Anfragen zur Identitätsauthentifizierung mit. Dieser Artikel bietet eine detaillierte Analyse des Implementierungsprozesses der JWT-Anmeldeauthentifizierung und eine umfassende praktische Demonstrationsaufzeichnung. Dabei bringen wir Ihnen das Verständnis der Prinzipien von JWT und deren Anwendung in der tatsächlichen Entwicklung näher. Egal, ob Sie Einsteiger oder erfahrener Entwickler sind, in diesem Artikel können Sie wertvolles Wissen und praktische Erfahrungen sammeln.
header
besteht aus zwei Teilen: token
Typ JWT
und Name: H<br>Mac
SHA256
, RSA
{
"alg": "HS256",
"typ": "JWT"
}
header
由两部分组成: token
的类型 JWT
和算法名称:H<strong class="keylink">Mac</strong>
、SHA256
、RSA
{ "iss": "xxxxxxx", "sub": "xxxxxxx", "aud": "xxxxxxx", "user": [ 'username': '极客飞兔', 'gender': 1, 'nickname': '飞兔小哥' ] }
? 载荷 / Payload
Payload
部分也是一个 <strong class="keylink">js</strong>ON
对象,用来存放实际需要传递的数据。JWT
指定七个默认字段供选择。
除了默认字段之外,你完全可以添加自己想要的任何字段,一般用户登录成功后,就将用户信息存放在这里
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT
// 其中secret 是密钥 String signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
fetch('license/login', { headers: { 'Authorization': 'X-TOKEN' + token } })
composer require firebase/php-jwt
这里使用 Think<strong class="keylink">PHP</strong>6
整合 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 ] ]); } }
? 用户登录后,生成 JWT 标识
<?php // 全局中间件定义文件 return [ // ...其他中间件 // JWT验证 \app\middleware\Auth::class ];
? 中间件验证用户是否登录
在 Zusätzlich zu den Standardfeldern können Sie beliebige Felder hinzufügen. Nachdem sich ein Benutzer erfolgreich angemeldet hat, werden die Benutzerinformationen im Allgemeinen hier gespeichert 总而言之,如果使用了分布式,切只能在session和jwt里面选的时候,就一定要选jwt。 Das obige ist der detaillierte Inhalt vonVollständige Aufzeichnung des tatsächlichen Simulationsprozesses der JWT-Anmeldeauthentifizierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!middleware.php
Payload</code Der > Teil ist auch ein <code></strong>js</p>ON
-Objekt, das zum Speichern der tatsächlichen Daten verwendet wird, die übertragen werden müssen. JWT
gibt sieben Standardfelder zur Auswahl an. 🎜iss: Aussteller 🎜exp: Ablaufzeit🎜sub: Topic 🎜aud: Benutzer 🎜nbf: Vorher nicht verfügbar 🎜iat: Veröffentlichungszeit 🎜jti: JWT-ID zur Identifizierung dieses 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
integriert die JWT
-Anmeldeauthentifizierung für eine praktische Simulation🎜🎜? 🎜JWT-Erweiterung installieren🎜🎜🎜rrreee🎜? Generierungs- und Entschlüsselungsmethode🎜🎜🎜rrreee🎜 🎜Nachdem sich der Benutzer angemeldet hat, eine JWT-Identifikation generieren🎜🎜🎜rrreee🎜? 🎜Middleware überprüft, ob der Benutzer angemeldet ist🎜🎜🎜Registrieren Sie die 🎜Middleware in middleware.php
🎜🎜🎜rrreee🎜Verbessern Sie nach der Registrierung der Middleware die Überprüfungslogik in der Berechtigungsüberprüfungs-Middleware🎜<?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