什么是JWT
JWT就是java web token,JWT的主要作用是被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
流程:
1.用户通过账号密码访问服务器
2.服务器验证账号密码
2.服务器生成Token,并发送给浏览器
3.储存Token,并且每次请求都附加上Token
4.服务器验证Token,并返回数据
JWT的组成:
JWT分为三个部分:header,payload, signature
header包括:什么类型,加密算法;
palyload: 载荷就是存放信息的地方。包含:标准中的注册声明,公共的声明,私有的声明
例如:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
然后再进行base64位加密。
signature:是一个签证信息。这一部分是header和playload,在进行一次secret(加盐)加密;
如何使用:
一般在请求头上加Authorization。
fetch('api/user/1', {
headers: {
'Authorization': 'Bearer ' + token
}
})
示例:
1.引入依赖
<!--引入jwt-->
<dependencies>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
</dependencies>
</project>
2.生成token和验证token
public class test {
@Test
public void contextLoads() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND,60);
String token = JWT.create()
.withClaim("username", "gtt") //设置自定义用户名
.withExpiresAt(calendar.getTime()) //设置过期时间
.sign(Algorithm.HMAC256("gttt!@#$%^&*"));//设置签名 gttt!@#$%^&*为签名的第三部分secret
System.out.println(token);
}
@Test
public void test(){
JWTVerifier verifier = JWT.require(Algorithm.HMAC256("gttt!@#$%^&*")).build();
DecodedJWT decodedJWT =verifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE1MTM0NTMsInVzZXJuYW1lIjoiZ3R0In0.Z71gA4Xh5VnPaUGXNV7NKBAuks_SD55wzI5noLZAG6w");//这个是上面生成的。
System.out.println("用户名:"+decodedJWT.getClaim("username"));
System.out.println("过期时间:"+decodedJWT.getExpiresAt());
}
}
3.封装工具类
public class JWTUtils {
private static String TOKEN = "gtt2312";
/**
* 生成token
* @param map //传入payload
* @return 返回token
*/
public static String getToken(Map<String,String> map){
JWTCreator.Builder builder = JWT.create();
map.forEach((k,v)->{
builder.withClaim(k,v);
});
Calendar instance = Calendar.getInstance();
instance.add(Calendar.HOUR,7*24);//设置过期时间
builder.withExpiresAt(instance.getTime());
return builder.sign(Algorithm.HMAC256(TOKEN)).toString();
}
/**
* 验证token
* @param token
* @return
*/
public static void verify(String token){
JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
}
/**
* 获取token中payload
* @param token
* @return
*/
public static DecodedJWT getToken(String token){
return JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
}
}
4.controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/login")
public Map<String,Object> login(User user){
Map<String,Object> result = new HashMap<>();
log.info("用户名:[{}]",user.getUsername());
log.info("密码:[{}]",user.getPassword());
try {
//登录
User loginUser = userService.login(user);
//判断login是否为空
//添加payload载荷
Map<String, String> map = new HashMap<>();
map.put("username",loginUser.getUsername());
map.put("password",loginUser.getPassword());
//生成token
String token = JWTUtils.getToken(map);
//向前端返回code状态码msg信息和token
result.put("code",200);
result.put("msg","登陆成功!");
result.put("token",token);
} catch (Exception e) {
e.printStackTrace();
result.put("code",502);
result.put("msg",e.getMessage());
}
return result;
}
}