JWTトークンの利点:
1、JWTベースのJSON、非常に簡単に解決します。
2、あなたは、トークンの豊富なコンテンツで展開するのは簡単カスタマイズすることができます。
図3は、非対称暗号化アルゴリズムおよびデジタル署名技術により、JWTは、改ざんの安全性を防ぎます。
4、リソースサービスは、JWTが認証を完了するために、認証サービスを依存していない使用しています。
短所:
1、JWTトークン長期保存には大きなスペースを占めています。
トークンの構造:
(。):Xxxxx.yyyyy.zzzzz JWTトークンは、3つの部分、中間の使用によって分離された各部分、等で構成され
ヘッダ
ヘッドは、トークンタイプ(すなわちJWT)及び使用されるハッシュアルゴリズム(例えば、HMAC SHA256またはRSA)を含みます
例は次のとおりです。
以下は、ヘッダーの内容の一部です。
{
"ALG":"HS256"、
"標準":"JWT"
}
第1の部分を与えるために、符号化Base64Urlを使用してコンテンツの上部には、文字列トークンJWTあります。
ペイロード
ISS(発行者)(ユーザー)、EXP(満了タイムスタンプ)、サブ:第2の部分は負荷である、コンテンツはまたような既製フィールドJWTオファーを格納することができる情報を格納するための有効な場所であるJSONオブジェクトでありますなど、また、カスタムフィールドをすることができます。
このセクションでは、オリジナルのコンテンツを復元デコードすることができますので、このセクションでは、機密情報を保存することは推奨されません。
最後に、文字列の第2の部分を与えるために、使用される負荷Base64Urlエンコーディングの第二の部分は、JWTトークンです。
例:
{
"サブ":"1234567890"、
"名前":"456"、
"管理":真
}
署名
第3の部分は、署名、改ざんからコンテンツを防ぐために、このセクションJWTあります。
このセクションでは、最初の2つの部分は、文字列を形成するように接続され符号化されたドット(。)を使用して符号化base64url使用して、ヘッダ署名アルゴリズムは、署名に使用された最後の宣言しました。
例:
HMACSHA256(
base64UrlEncode(ヘッダ)+ "" +
base64UrlEncode(ペイロード)、
秘密)
base64UrlEncode(ヘッダ):第一の部分JWTトークン。
base64UrlEncode(ペイロード):トークンのJWT第二の部分。
秘密:署名するために使用されるキー。
プロセスを使用します。
1.(コンピュータが、ここで公開鍵と秘密鍵を含め、通常のJava環境を実行できるようにするために)キーを生成
キーツール-genkeypair -alias changgou -keyalg RSA -keypass changgou -keystore changgou.jks -storepass changgou
クエリの証明書情報:
keytool -list -keystore changgou.jks
キーから2.エクスポートした公開鍵
OpenSSLの暗号化と復号化は、使用OpenSSLが公開鍵情報をエクスポートするためのキットです。
opensslの(次のデフォルトのすべての方法)をインストールし、ダウンロード:
データディレクトリにインストールWin64OpenSSL-1_1_1b.exe
PATH環境変数のOpenSSL設定、
ファイルchanggou.jksは、次のコマンドを実行したディレクトリにCMD:白い部分は、公開鍵であります
keytool -list -rfc --keystore changgou.jks | opensslのX509 -inform PEM -pubkey
テキストファイルは、public.keyに公開鍵のトップコピー、手動で1つのラインにマージするために覚えておく必要があり、それは、認可および認証の下に置くことができるプロジェクトがどこに置く必要があるプロジェクトのリソースファイルのディレクトリを、実装する必要があります。
リンク:https://pan.baidu.com/s/1gZZT0hglb3XPIKIgJrYTPg
抽出コード:zrv6は
ああ、操作がより便利に、このオープンBaiduのネットワークディスク電話アプリケーションの内容をコピー
3.1インポート認証サービス
1)教材をchanggou_user_auth
以下に示すように工学は、プロジェクトに導入しました:
2)スタートユーレカ、認証サービスを開始
テストクラス3.2認定サービスを作成します。
パブリック クラスCreateJwtTestは{ / ** * *トークンのテストを作成します * / @Test 公共 無効testCreateToken(){ // 証明書ファイルのパス 文字列key_location = "changgou.jks" ; // 秘密鍵ストアのパスワード 文字列Key_password = "changgouを" 。 // キーパスワードの 文字列keypwd =「changgouは」; // キーエイリアス 文字列の別名=「changgou」; // アクセス証明書パス ClassPathResourceリソース= 新新ClassPathResource(key_location); // 秘密鍵ファクトリを作成 KeyStoreKeyFactory keyStoreKeyFactory = 新しいKeyStoreKeyFactory(リソース、key_password.toCharArray()); // 读取秘钥对(公钥、私钥) キーペア鍵ペア= keyStoreKeyFactory.getKeyPair(別名、keypwd.toCharArray())。 // 获取私钥 RSAPrivateKey rsaPrivate = (RSAPrivateKey)keyPair.getPrivate(); // 定义ペイロード 地図<文字列、オブジェクト> tokenMap = 新しい HashMapの<> (); tokenMap.put( "ID"、 "1" )。 tokenMap.put( "名前"、 "itheima" ); tokenMap.put( "役割"、 "ROLE_VIP、ROLE_USER" ); JWTのJWT = JwtHelper.encode(JSON.toJSONString(tokenMap)、新しいRsaSigner(rsaPrivate))。 // 取出令牌 =エンコードストリングjwt.getEncoded()。 System.out.println(エンコード)。 } }
JWTを解析し、公開キートークンに基づいて4
上記のトークンを作成した後、我々は解析が公開鍵を使用する必要がトークンJWTを、解析することが、我々は以前に保存して公開キートークンの文字列変数を生成し、その後、公開鍵で復号化は、public.keyコピーすることができます。
テストクラスchanggou-ユーザーのOAuth com.changgou.token.ParseJwtTestを作成し、以下のように、解析トークン検証データを得ます:
パブリック クラスParseJwtTest { / ** * *検証トークン * / @Test 公共 無効testParseToken(){ // トークン 文字列トークン=「eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6IlJPTEVfVklQLFJPTEVfVVNFUiIsIm5hbWUiOiJpdGhlaW1hIiwiaWQiOiIxIn0.IR9Qu9ZqYZ2gU2qgAziyT38UhEeL4Oi69ko-dzC_P9- Vjz40hwZDqxl8wZ-W2WAw1eWGIHV1EYDjg0-eilogJZ5UikyWw1bewXCpvlM-ZRtYQQqHFTlfDiVcFetyTayaskwa-x_BVS4pTWAskiaIKbKR4KcME2E5o1rEek-3YPkqAiZ6WP1UOmpaCJDaaFSdninqG0gzSCuGvLuG40x0Ngpfk7mPOecsIi5cbJElpdYUsCr9oXc53ROyfvYpHjzV7c2D5eIZu3leUPXRvvVAPJFEcSBiisxUSEeiGpmuQhaFZd1g -yJ1WQrixFvehMeLX2XU6W1nlL5ARTpQf_Jjiw " ; // 公衆 文字列の公開=「----- BEGIN PUBLIC KEY ----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz + oyAmt47whAaRkRu / 8kePM + X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB / RsN38PVnhcP8ZfxGUH26kX0RK + tlrxcrG + HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEmoLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y / r4obiOL1mS5bEa / iNKotQNnvIAKtjBM4RlIDWMa6dmz + lHtLtqDD2LF1qwoiSIHI75LQZ / CNYaHCfZSxtOydpNKq8eb1 / PGiLNolD4La2zf0 / 1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv9QIDAQAB ----- END PUBLIC KEY -----」; // 校验JWT JWT JWT = JwtHelper.decodeAndVerify(トークン、新しいRsaVerifier(公開))。 // 获取JWT原始内容 文字列=クレーム)(jwt.getClaimsします。 System.out.println(特許請求の範囲) // JWT令牌 =エンコードされた文字列jwt.getEncoded()。 System.out.println(エンコード)。 } }