java jwt_「java」使用jwt进行认证授权

93863f9a6d6e0b21c6439051eef23b2a.png

传统的web应用使用session来维护用户与服务器之间的状态,用户提交用户名密码到服务器,服务器生成会话id,并将验证通过的用户信息存到session中(内存or数据库),会话id会写出到cookie。

用户登录之后的操作,都会附带包含sessionId的cookie,服务器根据用户端传来的sessionId获取用户信息,会话的有效期,包括用户登出等操作都依赖对session的操作,如下图:

04434c5ac9ccb488abeb29d814313e8e.png

基于session的认证用户信息存在了服务端内存中,在分布式环境中session是需要同步的。出现了基于token的认证方式,其实本质和session没什么区别。用户提交登录信息后,服务端验证通过后颁发令牌。

下图是以redis为例,将token和用户信息保存到redis,客户端再次访问服务端时,会携带token,服务端通过token获取用户信息。会话的有效期,用户的登出只需要操作redis中的token即可,如下图:

9c64dcdad0141ccc362e945685950477.png

当然了,token本身也是可以包含一些用户非敏感信息减少查库,包含数字签名以防数据篡改,下面看下jwt(json web token)。

从名称可以看出jwt还是一个token,它有自己的规范,由标头.有效载荷.签名

组成。头用来描述散列算法,然后是用户数据,最后是一个数字签名。

bfdba574ec406ab923f1fbc380886e21.png

先来看下jwt的java实现。

com.auth0

java-jwt

3.10.2

使用jwt通常只需要两个步骤,1通过jwt来生成token,2验证token。

public class JwtUtil {

private static final String SECRET = "t1o2k3e4n5_s9e8c7r6e5t";

private static final String ISSUER = "star_jwt";

public static String genJwt(Map claims) {

try {

Algorithm algorithm = Algorithm.HMAC256(SECRET);JWTCreator.Builder

builder = JWT.create().withIssuer(ISSUER)

.withExpiresAt(DateUtils.addMinutes(new Date(),30));

claims.forEach(builder::withClaim);

return builder.sign(algorithm);

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public static Map verifyToken(String token) {

Map ret = Maps.newHashMap();

try {Algorithm algorithm = Algorithm.HMAC256(SECRET);

JWTVerifier verifier = JWT.require(algorithm).withIssuer(ISSUER).build();

DecodedJWT jwt = verifier.verify(token);

Map map = jwt.getClaims();

map.forEach((k,v)->ret.put(k,v.asString()));

ret.put("exp",map.get("exp").asDate().toString()); } catch (Exception e) {

return ret;

}以上就是一个jwt的简单示例,客户端携带token请求时,服务端可以校验jwt的签名及有效时间,校验通过则放行,否则拒绝请求。

优点:

可以看到使用jwt自身就可以完成认证,可以减少资源连接,也可以避免跨域认证请求,自带信息也可以用于数据传递。

缺点:

可以看到一旦生成token,就无法回收,token的管理(刷新有效期&登出)需要其它补偿机制(如使用redis管理token);默认有效载荷只是经过base64编码,只是为了方便传输,并未加密(也可以自行加密),敏感数据不应该放到jwt中。

【完】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值