セッションのログイン認証方式:セッション中にクライアントからのユーザ情報の転送、ユーザー名とパスワード、SESSION_IDは、クッキー認証サーバ情報記憶を配置します。
クッキーから取ら訪問他のページは、自動的にセッション_した後、その後、セッションからの認証情報を取ります。
他のソリューション、認証情報は、クライアントが格納され、クライアントに返されます。次の訪問他のページでは、クライアントからサーバに戻って認証情報を渡す必要があります。
JWTは、このようなプログラムの代表、クライアントに保存された認証情報です。
JWT原則
JWTの原理は、サーバーの認証後、ある、JSON形式でオブジェクトを生成し、以下のように、クライアントに送り返されます。
{
「ユーザー名」:「ADMIN」、
「ロール」:「スーパー管理者」、
「有効期限」:「2019年7月13日午前0時00分○○秒」
}
オブジェクトを生成するとき、データの改ざんからユーザーを防止するために、サーバは、署名(この後の詳細)を追加します。
サーバーは、もはや、つまり、任意のセッションデータを保持しないステートレスサーバーとなり、したがって、比較的簡単に拡張を達成するために。
(2)暗号化なしの場合JWTには、秘密データは、JWTを書き込むことができません。
(3)JWTだけでなく、認証に使用することができ、また、情報を交換するために使用することができます。JWTの有効活用は、サーバーの数は、データベースを削減することができる照会します。
(4)JWT最大の欠点は、サーバがセッション状態を保存していないため、トークンは当然に廃止、またはトークンの権限を変更することができない、ということです。これは、サーバーが追加のロジックを展開する場合を除き、満期日まで有効のままになり、一度JWT発行、です。
(5)JWT自体が開示されたときに、誰もがトークンのすべての権限を取得することができ、認証情報が含まれています。盗難を減らすために、JWTの妥当性が比較的短く設定する必要があります。より重要な権利のいくつかのために、再び使用中のユーザを認証する必要があります。
(6)不正を低減するために、HTTPプロトコルを使用してJWTコードは、HTTPSプロトコルを使用するように、送信されるべきではありません。
<?PHPの 名前空間ツール\ JWT、 使用Lcobucci \ JWT \ Builderを、 使用Lcobucci \ JWT \パーサを、 使用Lcobucci \ JWT \署名者\ HMAC \ SHA256を、 使用Lcobucci \ JWT \ ValidationDataを; / * * 。* PhpStormによって作成 *ユーザー:ASUS *日:2019年4月5日 *時間:13時02 * / クラストークン { プライベート 静的 $ _config、 = [ '観客' => 'http://www.pyg.com'、// 受信者 「のid 「=>」3f2g57a92aa」、// 固有の識別トークンの単純な例がある 記号『=>』 pinyougou 『』は 、// 署名鍵 '発行者' => 'http://adminapi.pyg.com'、// 発行者 => 3600 * 24 '期限切れ' @ 有効 ]; // トークン生成 パブリック 静的 関数(に入手トークン$ USER_IDを){ // 署名オブジェクト $署名者 = 新しい新しいSHA256(); //は、現在のタイムスタンプの取得 $時間 = 時間を(); // 発行者、受信者、固有の識別、時間の問題、即時の効果で、有効期限、ユーザーID、署名の設定 $トークンを = (新新ビルダ()) - > issuedBy(自己:: $の_config、 [ '発行者]) - > canOnlyBeUsedBy(自己:: $の_config、[ '観客' ]) - > identifiedBy(自己:: $の_config [ 'ID']、真) - > issuedAt($時間) - > canOnlyBeUsedAfter($時間 -1 ) - > expiresAt($時間 +自己:: $ _config [ '有効期限が切れ' ]) - >( 'user_idを'、との$ USER_ID ) - >記号($署名者、自己:: $の_config [ '記号' ]) - > 入手トークン(); リターン(文字列)$トークン。 } // トークンからトークン要求情報を取得し 、パブリック 静的 関数getRequestToken() { IF(空($ _SERVER [ 'HTTP_AUTHORIZATIONは' ])){ リターン falseに; } $ヘッダー = $ _SERVERに [ 'HTTP_AUTHORIZATIONは]; $メソッド ='ベアラ「; // 中に存在し得るベアラ識別トークンを削除 戻り TRIM(str_ireplace($法、」」、$ヘッダ)); } // トークンからユーザIDを取得する(チェックサムを含むトークン) 公共の 静的な 機能 getUserId($トークン = ヌル) { $ user_idは = ヌル; $トークン = 空($トークン)自己:: getRequestToken():? $トークン; IF(!空($トークン)){ // 注文のキャンセルトークン判定した場合、コードプラス の$ delete_token =キャッシュ( 'delete_token'):? []; 場合(in_array($トークン、$のdelete_token )){ // トークンが除去された(キャンセル) リターン $ user_idは、 } $トークン =(新しい新しいパーサ()) - >パース((文字列)$トークン); // 認証トークン $データ = 新新ValidationData(); $データ - > setIssuer(自己:: $の_config、 [ '発行者']); // 認証発行 $データ - > setAudience(自己:: $の_config、 ['観客']); // 受信者を確認する $データを - > SETID(自己:: $の_config、 [' ID " ]); // 認証トークン識別 IF(!$トークン - >検証($データ)){ // トークンの検証が失敗し 返す $ user_idのを; } // 署名検証 $署名者 = 新しい新しいSHA256(); IF!($トークン - >を確認します($署名者、セルフ:: $の_config、 [ 'ログイン'を])){ // 署名の検証が失敗し 返す $ user_idのを; } // ユーザーIDからトークンを取得 $ user_idを = $トークン - > getClaim( 'user_idの' ); } 戻り の$ USER_IDを; } }