1. Cookieと比較したトークンの利点
1.クロスドメインアクセスをサポートし、トークンをリクエストヘッダーに配置します。Cookieはクロスドメインアクセスをサポートしません。
2.ステートレス。サーバーはトークンを保存する必要はありません。トークン情報が正しいことを確認するだけでよく、セッションはサーバーに保存する必要があります。通常、サーバーの対応するセッションを見つけるためにCookieのセッションIDを使用します。
3.特別な認証スキーム(従来のユーザー名とパスワードによるログイン)にバインドする必要はありません。トークンを生成する必要があるのは、私たちの期待される設定に従っているだけです。
4.モバイル端末(Android、iOS、アプレットなど)により適しています。このようなネイティブプラットフォームはCookieをサポートしていません。たとえば、WeChatアプレットでは、各リクエストはセッションです。もちろん、手動で毎回アクセスすることができます。 Cookieを追加します。詳細については、別のブロガーを確認してください。
5. CSRFのクロスサイト偽造攻撃を回避します。または、Cookieに依存しないためです。
2番目に、JWTベースのトークン認証は
JWTを実装します:JSON Web Token、実際、トークンは3つの部分からなる文字列です:ヘッダー、ペイロード、署名
1.依存関係を導入する
<依存関係> <groupId> com.auth0 </ groupId> <artifactId> java-jwt </ artifactId> <version> 3.8.2 </ version> </依存関係>
2.キーと存続時間を設定する
//有効期限を設定します プライベート静的最終ロングEXPIRE_DATE = 30 * 60 * 100000; //トークンキー プライベート静的最終文字列TOKEN_SECRET = "ZCEQIUBFKSJBFJH2020BQWE";
3.署名メソッドを実装する
public static String token(String username、String password){ 文字列トークン= ""; {を試す //有効期限 日付日付=新しい日付(System.currentTimeMillis()+ EXPIRE_DATE); //鍵と暗号化アルゴリズム アルゴリズムalgorithm = Algorithm.HMAC256(TOKEN_SECRET); //ヘッダー情報を設定します Map <String、Object> header = new HashMap <>(); header.put( "typ"、 "JWT"); header.put( "alg"、 "HS256"); //ユーザー名とパスワード情報を持ち、署名を生成します トークン= JWT.create() .withHeader(header) .withClaim( "ユーザー名"、ユーザー名) .withClaim( "password"、password).withExpiresAt(date) .sign(algorithm); }キャッチ(例外e){ e.printStackTrace(); nullを返します。 } トークンを返す; }
4.トークンを確認する
public static boolean verify(String token){ / ** * @descトークンを検証し、trueを返します * @create 2019/1/18/018 9:39 * @params [トークン]検証される文字列 ** / {を試す アルゴリズムalgorithm = Algorithm.HMAC256(TOKEN_SECRET); JWTVerifier verifier = JWT.require(algorithm).build(); DecodedJWT jwt = verifier.verify(token); trueを返します。 }キャッチ(例外e){ e.printStackTrace(); falseを返します。 } }
5.テスト
1)、生成されたトークンを使用して直接検証し、成功する
public static void main(String [] args){ String username = "zhangsan"; 文字列password = "123"; 文字列token = token(username、password); System.out.println(token); ブールb = verify(token); System.out.println(b); }
3.完全なトークンツールコード
package xxx.utils; //パッケージ インポートcom.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; import java.util.Date; import java.util.HashMap; import java.util.Map; / ** * @descはトークンを使用して、ユーザーがログインしているかどうかを確認します * @author zm ** / パブリッククラスTokenUtils { //有効期限を設定します プライベート静的最終ロングEXPIRE_DATE = 30 * 60 * 100000; //トークンキー プライベート静的最終文字列TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE"; public static String token(String username、String password){ 文字列トークン= ""; {を試す //有効期限 日付日付=新しい日付(System.currentTimeMillis()+ EXPIRE_DATE); //鍵と暗号化アルゴリズム アルゴリズムalgorithm = Algorithm.HMAC256(TOKEN_SECRET); //ヘッダー情報を設定します Map <String、Object> header = new HashMap <>(); header.put( "typ"、 "JWT"); header.put( "alg"、 "HS256"); //ユーザー名とパスワード情報を持ち、署名を生成します トークン= JWT.create() .withHeader(header) .withClaim( "ユーザー名"、ユーザー名) .withClaim( "password"、password).withExpiresAt(date) .sign(algorithm); }キャッチ(例外e){ e.printStackTrace(); nullを返します。 } トークンを返す; } public static boolean verify(String token){ / ** * @descトークンを検証し、trueを返します * @params [トークン]検証される文字列 ** / {を試す アルゴリズムalgorithm = Algorithm.HMAC256(TOKEN_SECRET); JWTVerifier verifier = JWT.require(algorithm).build(); DecodedJWT jwt = verifier.verify(token); trueを返します。 }キャッチ(例外e){ e.printStackTrace(); falseを返します。 } } public static void main(String [] args){ String username = "zhangsan"; 文字列password = "123"; 文字列token = token(username、password); System.out.println(token); ブール値b = verify( "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd22yZCI6IjEyMyIsImV4cCI6MTU3ODE5NzQxMywidXNlQHIDQUYGQQYGQQUYUQUJHYHQUYUQUYUQUYUQUIUJUYHQUYUQUIUJUYUQUIUJUYUQUIHJHYUQUIUJUYUQUIUJUIUJHYHQUYUQUIUJUYUQUIUJUQUYUQUIUJUQUIUJUYUQUIUJUYUQUIUYUQUYUQUIUJUQUZUQUIUJUYUQH System.out.println(b); } }