84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
phpエディタBananaによる丁寧なコンパイルを経て、人気の実際の開発シミュレーションプロセスの完全記録であるJWTログイン認証実際のシミュレーションを紹介します。 JWT (JSON Web Token) は認証のオープン標準であり、ユーザーがログインに成功した後にトークン (Token) を生成し、ユーザーはその後の ID 認証リクエストでこのトークンを使用します。この記事では、JWT ログイン認証の実装プロセスを詳細に分析し、包括的な実践的なデモンストレーションを記録することで、JWT の原理と実際の開発への適用方法を理解していただきます。初心者でも経験豊富な開発者でも、この記事から貴重な知識と実践的な経験を得ることができます。
クロスドメイン アクセスのサポート: Cookie はクロスドメイン アクセスを許可しません。これはトークンには存在しません。送信されるユーザー認証情報が通過する場合のメカニズム。
Http?
Header/header
header
は 2 つの部分で構成されます:トークンのタイプJWT
および
アルゴリズムname:
HMac,<strong class="keylink">SHA256</strong>,
RSA <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">{
"alg": "HS256",
"typ": "JWT"
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
?
##Payload 部分も
jsON です
オブジェクト。転送する必要がある実際のデータを保存するために使用されます。 JWT<strong class="keylink"> 選択する 7 つのデフォルト フィールドを指定します。 </strong>
デフォルトのフィールドに加えて、必要なフィールドを追加できます。通常、ユーザーが正常にログインすると、ユーザー情報はここに保存されます
exp: 有効期限
sub: トピックaud: ユーザー署名/署名nbf: 以前は利用できません
iat: 公開時刻
jti: この JWT を識別するために使用される JWT ID{ "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 } })
IntegrationJWT<strong class="keylink"> 実際のシミュレーションのためのログイン認証</strong>
? JWT 拡張機能のインストール
composer require firebase/php-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; } }
<?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
##
<?php // 全局中间件定义文件 return [ // ...其他中间件 // JWT验证 \app\middleware\Auth::class ];
<div class="lsjlt"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><?php
declare (strict_types=1);
namespace app\middleware;
use app\ResponseCode;
use app\services\JwtService;
class Auth
{
private $router_white_list = [&#39;login&#39;];
public function handle($request, \Closure $next)
{
if (!in_array($request->pathinfo(), $this->router_white_list)) {
$token = $request->header(&#39;token&#39;);
try {
// jwt 验证
$jwt = (new JwtService())->chekToken($token);
} catch (\Throwable $e) {
return json([
&#39;code&#39; => ResponseCode::ERROR,
&#39;msg&#39; => &#39;Token验证失败&#39;
]);
}
$request->user = $jwt->user;
}
return $next($request);
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div><h2>附:为什么使用jwt而不使用session</h2>
<ul>
<li>session是将客户端数据储存在服务器的内存,当客服端的数据过多,服务器的内存开销大;</li>
<li>session的数据储存在某台服务器,在<strong class="keylink">分布式</strong>的<strong class="keylink">项目</strong>中无法做到共享;</li>
<li>jwt的<strong class="keylink">安全</strong>性更好。</li>
</ul>
<p>总而言之,如果使用了分布式,切只能在session和jwt里面选的时候,就一定要选jwt。</p>
以上がJWTログイン認証の実際のシミュレーションプロセスの全記録の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。