jar : maven
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
java 代码实现
package com.zmt.payment.util;
import com.alibaba.druid.support.json.JSONUtils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;
/**
* @CLASSNAME :JwtUtils
* @Description :Tokens 生成工具
* @Author :Mr.薛
* @Data :2018/12/20 0020 15:44
* @Version :V1.0
* @Status : 编写
**/
public class JwtUtils {
/**
* 解析JWT
* @param jsonWebToken
* @param base64Security
* @return
*/
public static Claims parseJWT(String jsonWebToken, String base64Security) {
try {
Claims claims = Jwts.parser()
.setSigningKey(DatatypeConverter.parseBase64Binary(base64Security))
.parseClaimsJws(jsonWebToken).getBody();
return claims;
} catch (Exception ex) {
return null;
}
}
/**
* 创建JWT
* @param no
* @param userId
* @param issuer
* @param TTLMillis
* @param base64Security
* @return
*/
/*token的过期时间用秒来计算*/
public static String createJWT(String no, String userId,String issuer, long TTLMillis, String base64Security) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
//生成签名密钥
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(base64Security);
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
//添加构成JWT的参数
/* Payload
Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:
iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID
比如下面这个 Payload ,用到了 iss 发行人,还有 exp 过期时间这两个标准字段。另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。
{
"iss": "ninghao.net",
"exp": "1438955445",
"name": "wanghao",
"admin": true
}*/
JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT")
.claim("no", no)
.setSubject(userId)
.setIssuer(issuer)
.signWith(signatureAlgorithm, signingKey);
//添加Token过期时间
if (TTLMillis >= 0) {
long expMillis = nowMillis + TTLMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp).setNotBefore(now);
}
//生成JWT
return builder.compact();
}
public static void main(String[] args) {
/*测试数据*/
long time = 180;/*过期时间3分钟*/
System.out.println(System.currentTimeMillis());
String auth = createJWT(time+"s","userId","issuer",time,"base64Security");
System.out.println("auth:"+auth);
Claims m = parseJWT(auth,"base64Security");
System.out.println(JSONUtils.toJSONString(m));
}
}
在数据的验证这里如果是http接口的话最好通过头文件讲token绑定,作为数据传输的第一步验证,接口类数据的过期时间最好不要超过1分钟,用户登录的过期时间同步授权时间,用户注销之后释放token
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)