Javaはトークン生成と検証ログイン機能を実装しています

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);
    }
}

  

 

おすすめ

転載: www.cnblogs.com/achengmu/p/12693260.html