JWTトークンクロスドメイン認証

JSONウェブトークン(略称JWT)は、最も人気のあるクロスドメイン認証ソリューションです。

セッションのログイン認証方式:セッション中にクライアントからのユーザ情報の転送、ユーザー名とパスワード、SESSION_IDは、クッキー認証サーバ情報記憶を配置します。

クッキーから取ら訪問他のページは、自動的にセッション_した後、その後、セッションからの認証情報を取ります。

他のソリューション、認証情報は、クライアントが格納され、クライアントに返されます。次の訪問他のページでは、クライアントからサーバに戻って認証情報を渡す必要があります。

JWTは、このようなプログラムの代表、クライアントに保存された認証情報です。

                                                      JWT原則

JWTの原理は、サーバーの認証後、ある、JSON形式でオブジェクトを生成し、以下のように、クライアントに送り返されます。

{
「ユーザー名」:「ADMIN」、
「ロール」:「スーパー管理者」、
「有効期限」:「2019年7月13日午前0時00分○○秒」
}

その後、クライアントとサーバー間の通信時間は、JSONオブジェクトを送り返す必要があります。サーバーは、完全にオブジェクト識別されたユーザに依存しています。

オブジェクトを生成するとき、データの改ざんからユーザーを防止するために、サーバは、署名(この後の詳細)を追加します。

サーバーは、もはや、つまり、任意のセッションデータを保持しないステートレスサーバーとなり、したがって、比較的簡単に拡張を達成するために。                       

                                               JWTいくつかの機能

(1)JWTのデフォルトは暗号化されていませんが、また、暗号化することができます。オリジナルのトークンを生成した後、それは一度キーで再暗号化することができます。

(2)暗号化なしの場合JWTには、秘密データは、JWTを書き込むことができません。

(3)JWTだけでなく、認証に使用することができ、また、情報を交換するために使用することができます。JWTの有効活用は、サーバーの数は、データベースを削減することができる照会します。

(4)JWT最大の欠点は、サーバがセッション状態を保存していないため、トークンは当然に廃止、またはトークンの権限を変更することができない、ということです。これは、サーバーが追加のロジックを展開する場合を除き、満期日まで有効のままになり、一度JWT発行、です。

(5)JWT自体が開示されたときに、誰もがトークンのすべての権限を取得することができ、認証情報が含まれています。盗難を減らすために、JWTの妥当性が比較的短く設定する必要があります。より重要な権利のいくつかのために、再び使用中のユーザを認証する必要があります。

(6)不正を低減するために、HTTPプロトコルを使用してJWTコードは、HTTPSプロトコルを使用するように、送信されるべきではありません。

 

達成するための機能:

作曲作曲搭載使用JWT機能コンポーネントはlcobucci / JWT 3.3を必要とします

                                                              使いやすいJWTパッケージ:

 

<?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は];
         $メソッド ='ベアラ「;
         // 中に存在し得るベアラ識別トークンを削除
        戻り TRIMstr_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を; 
    } 
}

 

おすすめ

転載: www.cnblogs.com/shenchanglu/p/11289938.html