Javaでトークンを生成する(超実用的)

Javaでトークン(JWT)を生成する

今日は、Javaでトークンを生成する例を紹介します


ここに画像の説明を挿入

プレーンとプレーン-ブログの方法1:

JWTとは

Json Webトークン(JWT)は、Webアプリケーション環境間でクレームを転送するために実装されたJSONベースのオープンスタンダード((RFC 7519)です。トークンはコンパクトで安全になるように設計されており、特に単一サイトの分散サイトに適しています。サインオン(SSO)シナリオ:JWTステートメントは通常、リソースサーバーからリソースを取得するために、IDプロバイダーとサービスプロバイダーの間で認証されたユーザーID情報を渡すために使用されます。


イノセント-ブログウェイ2:

トークン認証メカニズム

トークンベースの認証メカニズムはhttpプロトコルに似ており、ステートレスであり、サーバー側でユーザー認証情報やセッション情報を保持する必要はありません。つまり、トークン認証メカニズムに基づくアプリケーションは、ユーザーがログインするサーバーを考慮する必要がないため、アプリケーションの拡張に便利です。

プロセスは次のようになります。

1.ユーザーはユーザー名とパスワードを使用してサーバーを要求します
2.サーバーはユーザーの情報を検証します
3.サーバーは検証後にトークンをユーザーに送信します
4.クライアントはトークンを保存し、各要求にトークン値を添付します
5。サーバーはトークン値を確認し、データを返します


プレーンとプレーン-ブログウェイ3:

これ以上ナンセンスとは言いませんが、コードは深くて浅く、直接使用することは可能ですが、実際に理解するにはまだ長い時間がかかります。同じ忍耐力も必要です。JWTについては、私の記事、主に次のサンプルコードを通して漠然と見ることができますが、覚えておくことができます。

コード!

/**
     * 生成token
     * @param userToken
     * @param expire
     * @return
     * @throws Exception
     */
    public static String generateToken(UserToken userToken, int expire) throws Exception {
    
    
        JwtClaims claims = new JwtClaims();
        claims.setSubject(userToken.getUsername());
        claims.setClaim(CommonConstants.CONTEXT_USER_ID,userToken.getUserId());
        claims.setClaim(CommonConstants.CONTEXT_NAME, userToken.getName());
        claims.setClaim(CommonConstants.CONTEXT_DEPT_ID, userToken.getDeptId());
        claims.setClaim(CommonConstants.CONTEXT_APPLICATION_ID, userToken.getApplicationId());
        claims.setExpirationTimeMinutesInTheFuture(expire == 0 ? 60*24 : expire);

        Key key = new HmacKey(CommonConstants.JWT_PRIVATE_KEY.getBytes("UTF-8"));

        JsonWebSignature jws = new JsonWebSignature();
        jws.setPayload(claims.toJson());
        jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256);
        jws.setKey(key);
        jws.setDoKeyValidation(false); // relaxes the key length requirement

        //签名
        String token = jws.getCompactSerialization();
        return token;
    }

    /**
     * 解析token
     * @param token
     * @return
     * @throws Exception
     */
    public static UserToken getInfoFromToken(String token) throws Exception {
    
    

        if (token == null) {
    
    
            return null;
        }

        Key key = new HmacKey(CommonConstants.JWT_PRIVATE_KEY.getBytes("UTF-8"));

        JwtConsumer jwtConsumer = new JwtConsumerBuilder()
                .setRequireExpirationTime()
                .setAllowedClockSkewInSeconds(30)
                .setRequireSubject()
                .setVerificationKey(key)
                .setRelaxVerificationKeyValidation() // relaxes key length requirement
                .build();

        JwtClaims processedClaims = jwtConsumer.processToClaims(token);

        return new UserToken(
                processedClaims.getSubject(),
                processedClaims.getClaimValue(CommonConstants.CONTEXT_USER_ID).toString(),
                processedClaims.getClaimValue(CommonConstants.CONTEXT_NAME).toString(),
                processedClaims.getClaimValue(CommonConstants.CONTEXT_DEPT_ID).toString(),
                processedClaims.getClaimValue(CommonConstants.CONTEXT_APPLICATION_ID).toString());
    }

    public static void main(String[] agars) throws Exception {
    
    
        UserToken userToken=new UserToken("admin","1","超级管理员名称","1","111111");
        String token = generateToken(userToken, 0);
        System.out.println(token);
        UserToken infoFromToken = getInfoFromToken(token);
        System.out.println(infoFromToken);

    }

説明1:コード内のUserTokenはエンティティクラスです。誰もがあなた自身のビジネスに依存しています。私はそれにいくつかのユーザー情報を保存します。

private static final long serialVersionUID = 1L;

    public UserToken(String username, String userId, String name) {
    
    
        this.userId = userId;
        this.username = username;
        this.name = name;
    }

    public UserToken(String username, String userId, String name, String deptId,String applicationId) {
    
    
        this.userId = userId;
        this.username = username;
        this.name = name;
        this.deptId = deptId;
        this.applicationId = applicationId;
    }

    /**
     * 用户id
     */
    private String userId;
    /**
     * 用户登录名
     */
    private String username;
    /**
     * 用户真实姓名
     */
    private String name;

    /**
     * 归属机构ID
     */
    private String deptId;

    /**
     * 应用ID
     */
    private String applicationId;

    public String getUserId() {
    
    
        return userId;
    }

    public void setUserId(String userId) {
    
    
        this.userId = userId;
    }

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getDeptId() {
    
    
        return deptId;
    }

    public void setDeptId(String deptId) {
    
    
        this.deptId = deptId;
    }

    public String getApplicationId() {
    
    
        return applicationId;
    }

    public void setApplicationId(String applicationId) {
    
    
        this.applicationId = applicationId;
    }

    @Override
    public String toString() {
    
    
        return "UserToken{" +
                "userId=" + userId +
                ", username='" + username + '\'' +
                ", name='" + name + '\'' +
                ", deptId='" + deptId + '\'' +
                ", applicationId='" + applicationId + '\'' +
                '}';
    }

説明2:コードにはCommonConstantsクラスもあります。これは、実際にはいくつかの定数が定義されています。また、白い点は実際には固定のキー値です。次の図に示すように、すべてが私のuserTokenのフィールドに対応しています。誰もが自分のビジネスに応じて決定します。

ここに画像の説明を挿入

すみません、頼るのを忘れました!!!

<dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.bitbucket.b_c</groupId>
            <artifactId>jose4j</artifactId>
            <version>0.6.4</version>
        </dependency>

これでこの記事は終わりです。記録の寿命、記録技術、便利で実用的であり、他のブロガーを助けることを望んでいます。バイバイ

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_46379371/article/details/113243629