分布式应用下登录检验解决方案 JWT 生成token

JWT是一种开放标准,用于在各方之间安全地传递信息。它由头部、负载和签名三部分组成,常用于生成用户认证的token。JWT可以通过特定算法加密,包含用户的基本信息,如id和昵称,但不应包含敏感数据。文章中提供了生成和校验JWT的Java代码示例,涉及jjwt库的使用。
摘要由CSDN通过智能技术生成

什么是JWT:

  • JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名
  • 简单来说: 就是通过一定规范来生成token,然后可以通过解密算法逆向解密token,这样就可以获取用户信息

  • 优点

    • 生产的token可以包含基本信息,比如id、用户昵称、头像等信息,避免再次查库
    • 存储在客户端,不占用服务端的内存资源
  • 缺点

    • token是经过base64编码,所以可以解码,因此token加密前的对象不应该包含敏感信息,如用户权限,密码等
    • 如果没有服务端存储,则不能做登录失效处理,除非服务端改秘钥
  • JWT格式组成 头部、负载、签名

    • header+payload+signature

      • 头部:主要是描述签名算法
      • 负载:主要描述是加密对象的信息,如用户的id等,也可以加些规范里面的东西,如iss签发者,exp 过期时间,sub 面向的用户
      • 签名:主要是把前面两部分进行加密,防止别人拿到token进行base解密后篡改token
  • 关于jwt客户端存储

    • 可以存储在cookie,localstorage和sessionStorage里面

登录校验Json Web Token实战之封装通用方法

加入相关依赖

 <!-- JWT相关 -->
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.7.0</version>
    </dependency>

封装生产token方法:

  /**
     * 根据用户信息,生成令牌
     * @param user
     * @return
     */
    public static String geneJsonWebToken(User user){
        
        Long EXPIRE=1000*60*60*24*7;
        String SECRET="secret123";
        String TOKEN_PREFIX="token_trefix";        

        String token = Jwts.builder().setSubject(SUBJECT)
                .claim("head_img",user.getHeadImg())
                .claim("id",user.getId())
                .claim("name",user.getName())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))  //过期时间
                .signWith(SignatureAlgorithm.HS256,SECRET).compact();
                                //加密方法         加密密匙
        token = TOKEN_PREFIX + token;

        return token;
    }

    或者
    //生成token
    public String getToken(CdMember cdMember){
        Long EXPIRE=1000*60*60*24*7;
        String SECRET="secret123";
        String TOKEN_PREFIX="token_trefix";     
        User user = new User();
        user.setUsername(cdMember.getNickname());
        user.setMemberId(cdMember.getMemberId());
        String userJson = JSON.toJSONString(user);//序列化user
        JwtBuilder jwtBuilder = Jwts.builder(); //获得JWT构造器
        Map<String,Object> map=new Hashtable<>();
        map.put("kay",userJson);
        String token = jwtBuilder.setSubject("23123123") //设置用户数据
                .setIssuedAt(new Date()) //设置jwt生成时间
                .setId("1") //设置id为token id
                .setClaims(map) //通过map传值
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) //设置token有效期
                .signWith(SignatureAlgorithm.HS256, SECRET) //设置token加密方式和密码
                .compact(); //生成token字符串
        return token;
    }

封装校验token方法:

   /**
     * 校验token的方法
     * @param token
     * @return
     */
    public static Claims checkJWT(String token){
        String SECRET="secret123";
        String TOKEN_PREFIX="token_trefix";
        try{

            final  Claims claims = Jwts.parser().setSigningKey(SECRET)
                    .parseClaimsJws(token.replace(TOKEN_PREFIX,"")).getBody();
                                                   //前缀 
            return claims;

        }catch (Exception e){
            return null;
        }

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值