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>