java中生成Token(JWT)
欢迎关注蚕豆公众号,不定时分享技术。同时欢迎加入蚕豆技术群哦,扫描公众号点击关于作者加群~~~~
今天给大家分享一篇java中生成token的实例
平白无奇-博客方式1:
什么是JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源.
平白无奇-博客方式2:
token鉴权机制
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
流程上是这样的:
1.用户使用用户名密码来请求服务器
2.服务器进行验证用户的信息
3.服务器通过验证发送给用户一个token
4.客户端存储token,并在每次请求时附送上这个token值
5.服务端验证token值,并返回数据
平白无奇-博客方式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 这个类其实就是定义的一些常量。再说白点其实就是一个固定的key值吧。如下图:都是对应我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>