JWTログイン認証の実際のシミュレーションプロセスの全記録
Apr 03, 2024 pm 01:22 PMphpエディタBananaによる丁寧なコンパイルを経て、人気の実際の開発シミュレーションプロセスの完全記録であるJWTログイン認証実際のシミュレーションを紹介します。 JWT (JSON Web Token) は認証のオープン標準であり、ユーザーがログインに成功した後にトークン (Token) を生成し、ユーザーはその後の ID 認証リクエストでこのトークンを使用します。この記事では、JWT ログイン認証の実装プロセスを詳細に分析し、包括的な実践的なデモンストレーションを記録することで、JWT の原理と実際の開発への適用方法を理解していただきます。初心者でも経験豊富な開発者でも、この記事から貴重な知識と実践的な経験を得ることができます。
トークン認証プロセス
- 最も人気のあるクロスドメイン認証ソリューションとして、JWT (JSON WEB Token) は深く愛されています開発者のお気に入りの主なプロセスは次のとおりです。
- クライアントはログインするためにアカウントとパスワードのリクエストを送信します。
- サーバーはリクエストを受信し、アカウントが正しいかどうかを確認します。パスワードが渡されました
- 検証が成功した後、サーバーは一意のトークンを生成し、クライアントに返します。 ##クライアントはトークンを受信し、Cookie または localStroge に保存します。
- その後、すべてのクライアントがサーバーにリクエストを送信すると、Cookie またはヘッダーを通じてトークンが送信されます。
- ##サーバーはトークンの有効性を検証し、応答データのみを返します。リクエストを通過した後
- トークン認証の利点
クロスドメイン アクセスのサポート: Cookie はクロスドメイン アクセスを許可しません。これはトークンには存在しません。送信されるユーザー認証情報が通過する場合のメカニズム。
Http- ヘッダー送信
- ステートレス: トークン自体にセッション情報が含まれているため、トークン メカニズムはサーバー側にセッション情報を保存する必要はありません。すべてのログイン ユーザーであり、状態情報をクライアントの Cookie またはローカル メディアに保存するだけで済みます 幅広い適用性: クライアントが http プロトコルをサポートしている限り、トークン認証を使用できます。
- CSRF を考慮する必要がない: Cookie に依存しなくなったため、トークン認証を使用するときに CSRF が発生しないため、CSRF 防御を考慮する必要がありません
- JWT 構造
JWT は実際には
string- であり、ヘッダー、ペイロード、署名の 3 つの部分で構成されます。真ん中のドット . を使用して 3 つの部分に分けます。 JWT 内には改行がないことに注意してください。
?
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': '飞兔小哥' ] }ログイン後にコピー
?
- 署名部分は、ヘッダーとペイロード データの上記 2 つの部分のデータ署名です データが改ざんされていないことを確認するには、キーを指定する必要があります。このキーは通常、ユーザーだけが知っており、サーバーに保存されます。
- 署名を生成するコードは、一般に次のとおりです。
- JWT の基本的な使用法
// 其中secret 是密钥 String signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
server
から返された JWT を受け取ります。これは Cookie または localStorage に保存できます。- その後、クライアントはサーバーと通信するたびに、この JWT を取得する必要があります。ドメインを越えることができないように、リクエストを送信するために JWT を Cookie に保存します。
- より良いアプローチは、HTTP リクエストのヘッダー情報の Authorization フィールドにこれを含めることです。
- 実際の戦闘: JWT ログイン認証を使用します
fetch('license/login', { headers: { 'Authorization': 'X-TOKEN' + token } })
PHP
6IntegrationJWT<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 id="附-为什么使用jwt而不使用session">附:为什么使用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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









この記事では、PHP が行を CSV にフォーマットし、ファイル ポインタを書き込む方法について詳しく説明します。非常に実践的だと思いますので、参考として共有します。この記事を読んで何かを得ることができれば幸いです。行を CSV にフォーマットし、ファイル ポインターに書き込む ステップ 1: ファイル ポインターを開く $file=fopen("path/to/file.csv","w"); ステップ 2: fputcsv( ) 関数を使用して行を CSV 文字列に変換するCSV文字列に変換します。この関数は次のパラメータを受け入れます。 $file: ファイル ポインタ $fields: 配列としての CSV フィールド $delimiter: フィールド区切り文字 (オプション) $enclosure: フィールド引用符 (

この記事では、PHP での現在の umask の変更について詳しく説明します。編集者が非常に実用的であると考えたので、参考として共有します。この記事を読んで何かを得ることができれば幸いです。現在の umask を変更する PHP の概要 umask は、新しく作成されたファイルとディレクトリのデフォルトのファイル権限を設定するために使用される PHP 関数です。引数を 1 つ受け取ります。これは、ブロックの許可を表す 8 進数です。たとえば、新しく作成されたファイルへの書き込み権限を禁止するには、002 を使用します。 umask を変更する方法 PHP で現在の umask を変更するには 2 つの方法があります。 umask() 関数を使用する: umask() 関数は現在の umask を直接変更します。その構文は次のとおりです。

この記事では、ファイルの MD5 ハッシュを計算する PHP について詳しく説明します。編集者が非常に実用的であると考えたので、参考として共有します。この記事を読んで何かを得ることができれば幸いです。 PHP はファイルの MD5 ハッシュを計算します MD5 (MessageDigest5) は、任意の長さのメッセージを固定長の 128 ビットのハッシュ値に変換する一方向暗号化アルゴリズムです。ファイルの整合性の確保、データの信頼性の検証、デジタル署名の作成に広く使用されています。 PHP でのファイルの MD5 ハッシュの計算 PHP には、ファイルの MD5 ハッシュを計算するための複数の方法が用意されています: md5_file() 関数を使用します。 md5_file() 関数は、ファイルの MD5 ハッシュ値を直接計算し、32 文字の値を返します。

この記事では、PHP がどのようにしてキー値を反転した後に配列を返すのかについて詳しく説明します。編集者が非常に実用的であると考えたので、参考として共有します。この記事を読んで何かを得ることができれば幸いです。 PHP キー値フリップ 配列キー値フリップは、配列内のキーと値を交換して、元のキーを値として、元の値をキーとして持つ新しい配列を生成する配列に対する操作です。実装方法 PHP では、次の方法で配列のキーと値の反転を実行できます。 array_flip() 関数: array_flip() 関数は、キーと値の反転操作に特に使用されます。引数として配列を受け取り、キーと値が交換された新しい配列を返します。 $original_array=[

この記事では、PHP が配列内に指定されたキーが存在するかどうかを判断する方法について詳しく説明します。編集者が非常に実用的であると考えたので、参考として共有します。この記事を読んで何かを得ることができれば幸いです。 PHP は、指定されたキーが配列内に存在するかどうかを判断します。 PHP では、指定されたキーが配列内に存在するかどうかを判断する方法が数多くあります。 1. isset() 関数を使用します: isset($array["key"]) この関数ブール値を返します。指定されたキーが存在する場合は true、存在しない場合は false。 2. array_key_exists() 関数を使用します: array_key_exists("key",$arr)

この記事では、前回の Mysql 操作で PHP から返されたエラー メッセージの数値エンコードについて詳しく説明します。編集者が非常に実用的であると考えたので、参考として共有します。この記事を読んで何かを得ることができれば幸いです. . PHP を使用して MySQL エラー情報を返す 数値エンコーディング はじめに mysql クエリを処理するときにエラーが発生する場合があります。これらのエラーを効果的に処理するには、エラー メッセージの数値エンコーディングを理解することが重要です。この記事では、php を使用して Mysql エラー メッセージの数値エンコーディングを取得する方法を説明します。エラー情報の数値エンコードを取得する方法 1. mysqli_errno() mysqli_errno() 関数は、現在の MySQL 接続の最新のエラー番号を返します。構文は次のとおりです: $erro

この記事では、PHP での円周率の求め方について詳しく解説しますが、編集者が非常に実践的だと考えたので、参考としてシェアさせていただきます。 PHP による円周率の求め方入門 円周率と円の直径の比である円周率 (π) は無理数であり、有限の桁数では表現できません。 php では、組み込み関数 M_PI を使用して pi の近似値を取得できます。 M_PI 関数 M_PI 関数は、小数点以下 14 桁までの正確な pi の近似値を返します。これは PHP の定数であるため、使用するためにパラメーターを使用する必要はありません。構文出力 3.14159265358979 代替方法 M_PI 関数に加えて、いくつかの代替方法があります。

フロントエンド開発とバックエンド開発は、完全な Web アプリケーションを構築するために不可欠な 2 つの側面であり、両者には明らかな違いがありますが、密接に関連しています。この記事では、フロントエンド開発とバックエンド開発の違いと関連性を分析します。まず、フロントエンド開発とバックエンド開発の具体的な定義とタスクを見てみましょう。フロントエンド開発は主に、ユーザー インターフェイスとユーザー インタラクション部分、つまりユーザーがブラウザーで何を見て操作するかを構築する責任があります。フロントエンド開発者は通常、HTML、CSS、JavaScript などのテクノロジーを使用して、Web ページのデザインと機能を実装します。
