17.登录注销功能
分类: springboot vue 专栏: 【带小白做项目】SpringBoot+Vue后台管理系统 标签: 登录注销
2024-12-20 10:43:25 42浏览
jwt
简单介绍
- 什么是jwt
JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止被篡改。
- JWT令牌的优点
1、jwt基于json,非常方便解析。
2、可以在令牌中自定义丰富的内容,易扩展。
3、通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。
4、资源服务使用JWT可不依赖认证服务即可完成授权。
- 令牌结构
JWT令牌由三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz
- Header
头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)
一个例子如下:
下边是Header部分的内容
{
"alg": "HS256",
"typ": "JWT"
}
将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。
- Payload
第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比
如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段,比如用户角色。
此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。
最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。
一个例子:
{
"sub": "1234567890",
"name": "456",
"admin": true
}
- Signature
第三部分是签名,此部分用于防止jwt内容被篡改。
这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中声明
签名算法进行签名。
一个例子:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
base64UrlEncode(header):jwt令牌的第一部分。
base64UrlEncode(payload):jwt令牌的第二部分。
secret:签名所使用的密钥。
依赖
<!--JWT 依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
工具类
public class JwtUtils {
/**
* 生成token字符串 xxx.yyy.zzzz
* @param username
* @return
*/
public static String getToken(String username){
return Jwts.builder().setHeaderParam("typ", "JWT")
//过期时间 一个小时后此token就失效了
.setExpiration(new Date(System.currentTimeMillis()+3600000))
.setSubject(username)
.signWith(SignatureAlgorithm.HS256, "jf3q-jwt").compact();
}
public static String getUserName(String token){
String username = null;
try {
username = Jwts.parser().setSigningKey("jf3q-jwt").parseClaimsJws(token).getBody().getSubject();
} catch (ExpiredJwtException e) {
throw new RuntimeException("token已经过期");
} catch (UnsupportedJwtException e) {
throw new RuntimeException("不支持的token");
} catch (MalformedJwtException e) {
throw new RuntimeException("token令牌格式不对");
} catch (SignatureException e) {
throw new RuntimeException("token签名问题");
} catch (IllegalArgumentException e) {
throw new RuntimeException("参数不合法-密钥不对");
}
return username;
}
}
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论
您可能感兴趣的博客