Heim > Artikel > Backend-Entwicklung > Vollständige Aufzeichnung des tatsächlichen Simulationsprozesses der JWT-Anmeldeauthentifizierung
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 ];
? 中间件验证用户是否登录
在 middleware.php
Payload
Der > Teil ist auch ein js
JWT
gibt sieben Standardfelder zur Auswahl an. 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
🎜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); } }🎜🎜? 🎜Signatur/Signatur 🎜🎜🎜Der Signaturteil befindet sich direkt über den Daten Signatur der Header- und Payload-Teile 🎜🎜Um sicherzustellen, dass die Daten nicht manipuliert werden, müssen Sie einen Schlüssel angeben. Dieser Schlüssel ist im Allgemeinen nur Ihnen bekannt und wird auf dem Server gespeichert 🎜🎜Der Code zum Generieren des Die Signatur lautet im Allgemeinen wie folgt: 🎜🎜🎜rrreee🎜JWT Grundlegende Verwendung🎜🎜🎜Der Client erhält das vom Server zurückgegebene JWT🎜, das in einem Cookie oder im lokalen Speicher gespeichert werden kann🎜🎜Dann muss der Client dies bei jeder Kommunikation mitbringen mit dem Server-JWT🎜🎜Speichern Sie JWT in Cookie, um die Anfrage zu senden, damit sie nicht domänenübergreifend sein kann🎜🎜Eine bessere Möglichkeit besteht darin, es in das Autorisierungsfeld der Header-Informationen der HTTP-Anfrage einzufügen🎜🎜🎜rrreee🎜Praktischer Kampf: Verwenden JWT-Anmeldeauthentifizierung🎜🎜Verwenden Sie
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); } }
总而言之,如果使用了分布式,切只能在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!