私はJavaのシリーズを愛する--- [マイクロJWT認証サービスを実装します]

JSONウェブトークン(JWT)は、非常に軽量な仕様です。この仕様は、私たちはJWTは、ユーザとサーバ間のセキュアで信頼性の高い情報を提供し使用することができます。

JWTは、実際には3つの部分、頭部、負荷署名から成る文字列です。

ヘッド(ヘッダー)

ヘッダは、署名に使用されるタイプとアルゴリズムとして、JWTの基本情報を記述するために使用されます。これはまた、JSONオブジェクトとして表現することができます。

{ "TYP":"JWT"、"ALG":"HS256"}

署名アルゴリズムの先頭にHS256アルゴリズムを指定します。私たちは、Base64エンコードhttp://base64.xpcha.com/を次のようにコード化された文字列の後に、:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

ヒント:Base64では、バイナリデータ表現を表現するために64個の印刷可能な文字に基づいています。64に等しい2の6乗、印刷可能な文字に対応する単位ようにすべての6ビット、からです。4つのBase64でユニットに対応する24ビットの3バイト、すなわち3バイトで表現するために4つの印刷可能な文字が必要があります。JDKは非常に便利を提供  BASE64Encoder  と  Base64Decoderを符号化と復号化BASE64に基づいて完成された非常に便利なことができ、それらを使用して、

ロード(playload)

ロードローカルストレージが有効な情報です。名前は、航空機上に担持されたそのような物品に特異的に指し、これらの効果的な情報は、3つの部分から構成され

(1)標準の登録届出書(推奨しますが、使用することは必須ではないが)

ISS:JWTの発行者の
サブ:JWTが配向しているユーザー
AUD:JWT受信側の
EXP:JWT有効期限は、有効期限は時間の問題よりも大きくなければなりません
NBF:前に定義されて何時間、利用できないJWTある
IAT :時間の問題JWT
JTI:JWT独自のアイデンティティ、それは主にワンタイムトークンとして使用されています。

(2)公共の声明

公共の宣言は、必要な情報やその他のビジネスニーズを追加するために、ユーザーに関する一般的な情報を任意の情報を追加することができますが、機密性の高い情報を追加するために、クライアントが解読できるので、部分的には、推奨されません。

(3)民間の文

Privateステートメントは、共通の定義としての文の提供者と消費者であるbase64では、情報の一部はプレーンテキストとして分類することができることを意味し、対称を復号化されているので、一般的に、機密情報を保存することは推奨されません。

これは、請求の習慣を指します。このような構造と名称の前の例と同様に、所与のクレームから管理者に属します。JWTと主張し、これらの規格の規定の違いを主張する請求項JWTは、指定された、JWT JWTは、取得した後、受信者は、確認するために、これらの基準を主張する方法を知っている(知っていないかどうかを検証);および民間の請求はしません検証は、明示しない限り、クレーム、仕事のルールを確認するために、受信者に伝えます。

ペイロードを定義します。

{ "サブ": "1234567890"、 "名前": "ジョン・ドウ"、 "管理者":真}

BASE64は次にJWTの第2の部分を取得するために暗号化されます。

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

ビザ(署名)

第三の部分はJWTビザ情報であり、このビザ情報は、3つの部分からなります:

(BASE64後)ヘッダ

ペイロード(BASE64後)

秘密の

そして塩からなる、次いで秘密の暗号化ヘッダ組成物によって暗号化されたbase64でbase64で暗号化暗号化された接続文字列の後にこの部分のニーズのペイロード・ヘッダを使用して宣言され、第3の部分は、JWTを構成しています。

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

完全な文字列にこれらの三つの部分との接続は、最終JWTを構成します:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

:秘密がサーバ側に保存されている、問題はサーバー側でも、JWTを生成し、秘密はそれはあなたのサーバの秘密鍵であるので、JWTの発行とJWTを認証するために使用され、いずれのシナリオで行くことを明らかにすべきではありません。クライアントが秘密を学習した後は、クライアントが自己署名JWTアップすることができることを意味します。

JJWTの発行と検証トークン

JJWT JWTは、エンドツー作成し、Javaライブラリを検証するプロバイダです。永遠に無料でオープンソース(Apacheライセンス、バージョン2.0)、JJWTは使用して理解しやすいです。これは、センターのための洗練されたインターフェースの建物で設計され、その複雑さのほとんどを隠します。

公式文書:

https://github.com/jwtk/jjwt

JWTのクイックスタート:

 

1トークンを作成します。

 

(1)のpom.xml新しいプロジェクトに依存関係を追加します。

<依存> 
    <groupIdを> io.jsonwebtoken </ groupIdを> 
    <たartifactId> jjwt </たartifactId> 
    <バージョン> 0.9.0 </バージョン> 
</依存関係>

次のように(2)、テストクラスを作成します

パブリック クラスTestJWT {
     // これが私たちのキー、暗号化と復号化では、の使用が必要です
    民間 最終 静的 =「itcast」文字列のキーワードを
    @Test 
    公共 無効testCreateを(){
         ロングにcurrentTimeMillis = にSystem.currentTimeMillis();
         // JWTを作成します 
        ビルダー= JwtBuilder Jwts.builder()
                            .setId(UUID.randomUUID()。のtoString())   // 設定された固有の番号 
                            .setSubject( "新人包囲ライオン")// テーマはJSONデータであってもよいし 
                            .setIssuedAt(新しい新しい日付( ))   //問題の日付を設定しますSetExpiration新新日(にcurrentTimeMillis + 50000))// 有効期限を設定する
                 
クレーム(「役割」、「管理者」)//カスタムクレーム、役割設定
                 ; .signWith(SignatureAlgorithm.HS256、キーワードを)/ / HS256および設定のSecretKey(文字列)を使用して署名アルゴリズムを設定します
// 文字列を構築し、戻り
        のSystem.out.println(builder.compactを()); 

    }

実行結果を印刷します:

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDQxODF9.ThecMfgYjtoys3JX7dpx3hu6pUm0piZ0tXXreFU_u3Y

もう一度実行して、あなたは私たちの負荷が時間が含まれているため、各実行の結果は、同じではありませんでしょう。

トークンを解析2

私たちは、クライアントが(これは同じチケットを保持するようなものです)サーバーにリクエストを送信し、次回はこのトークンを持参する必要があり、操作はWebアプリケーションでサーバが実行して、クライアントに送信され、トークンを作成したばかりしていますサーバが受信したトークンは、(例えばユーザIDのような)トークンの情報を解析し、データベースを照会する情報に基づいて、適切な結果を返すべきです。

 

@Test
     公共 ボイドtestParser(){ 

        文字列compactJwt  = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5ODEwNjZkNS1kOTkwLTQ1NWQtOWJhNy0zNGYyZjlhNjA2ODYiLCJzdWIiOiLpu5HpqaznqIvluo_lkZgiLCJpYXQiOjE1NjU2ODM4MDcsImV4cCI6MTU2NTY4Mzg1NX0.efXeiB1EcXPjRO-ZkE7Xm2gvhY7EUd-uLiUFFZkJ0YE" 
        請求項主張 = 。Jwts.parserを()setSigningKey(キーワード).parseClaimsJws(compactJwt).getBody(); 
        System.out.println(特許請求の範囲)
    }

印刷を実行します。

{JTI = 888、副=白、IAT = 1557904181}

あなたは、エラーが、そのトークンはトークンを検証されるの解析で実行されるでしょう、署名鍵またはトークン改ざんを試してみてください。現在時刻が有効期限を超えて、それはエラーになります。

 

4つのカスタム要求

 

カスタムクレームを定義することができます(たとえば、ロールなど)より多くの情報を格納したい場合は、私たちはただの例は、単純に、idと2件の情報の件名を格納します。

 

テストクラスを作成し、試験方法を設定します。

 

トークンを作成します。上に書かれたコードを、主張は赤くマークされています。

 

 

おすすめ

転載: www.cnblogs.com/hujunwei/p/11346770.html