zoukankan      html  css  js  c++  java
  • 踩坑之路---JWT验证

    • 使用JWT验证客户的携带的token
    • 客户端在请求接口时,需要在request的head中携带一个token令牌
    • 服务器拿到这个token解析获取用户资源,这里的资源是非重要的用户信息


    目前我的理解,用于校验的几种方式

    1. 拦截器
    2. SpringSecurity验证(目前没有弄懂)
    3. shiro拦截验证

    拦截器
    配置好拦截器后,过滤掉无需验证的接口,其他的接口在请求的时候,获取其token然后解析是否是正确的客户端资源
    SrpingSecurity
    SpringSecurity就麻烦多了...此处省略1000字
    Shiro自定义认证
    shiro在自定义realm中有两个方法,一个是认证,一个是授权,在其认证的方法内验证其token

    重点

    上面说的只是个流程,最主要的是jwt怎么做token的编码和解码的
            long expire = 680090;
            String  = "123";
    这里有两个需要注意的地方,就是设置过期时间和盐

    过期时间是验证token的有效时间,在自己手动设置过期时间内是有效的,超过此时间,jwt就无法解析其token了
     其次是盐,这是个字符串常量,也可以动态生成盐,放入数据库中在验证的时候获取解析,这里需要将其词符串设置成Base64编码,不然会解析错误..(大坑)这里使用的是apache的codec来编码字符串,也可使用java自带的Base64工具编码

    生成token

        

     /**
         * 生成jwt token
         */
        public String generateToken(long userId) {
            Date nowDate = new Date();
            //过期时间
            Date expireDate = new Date(nowDate.getTime() + expire * 1000);
    
            SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
            //生成加密密钥
            return Jwts.builder()
                    .setHeaderParam("typ", "JWT")
                    .setSubjectsecret(userId+"")
                    .setIssuedAt(nowDate)
                    .setExpiration(expireDate)
                    .signWith(signatureAlgorithm, new String(org.apache.commons.codec.binary.Base64.encodeBase64(secret.getBytes())))
                    .compact();
        }

    ps: 在这里传入的是用户id,这在解码后通过getSubject()方法可以获取到,如果需要传入用户的多个信息也可以设置成

         .claim("info",userInfo)
         .claim("id",userId)
    获取

        @Test
        public void jwt(){
            String s = generateToken(1,"小明");
            System.out.println(s);
            Claims claimByToken = getClaimByToken(s);
            System.out.println(claimByToken.get("info")+"--"+claimByToken.get("id"));
        }
        resut:            eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpbmZvIjoi5bCP5piOIiwiaWQiOjEsImlhdCI6MTU0NDg4NTQyOCwiZXhwIjoxNTQ1NTY1NTE4fQ.4SvjebEFd4lixC1jHgyMpQrlPoQz8DI0BTFYsGY0GsPKx_dc7GfDLR2qd_mi46mLpDvJ0HCatfEmhb7w7y9xrA
    
        小明--1

    解析token

     /**
         * 解析token
         *
         * @param token
         * @return
         */
        public  Claims getClaimByToken(String token) {
            String secret = "123";
            try {
                SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
                return Jwts.parser()
                        .setSigningKey(new String(org.apache.commons.codec.binary.Base64.encodeBase64("123".getBytes())))
                        .parseClaimsJws(token)
                        .getBody();
            }catch (Exception e){
                System.out.println("jwt 解密失败");
                return null;
            }
        }
    

     

    ps:目前解决了基本问题,shiro+jwt 就很NICE-__- 

    至于SpringSecurity:还是要多多学习了.....

    平凡是我的一个标签
  • 相关阅读:
    算法导论4线性时间与暴力寻找最大子数组
    算法导论4.1DivideAndConquer寻找最大子数组
    算法导论2.3算法设计分治法合并排序
    算法导论第二章算法入门2.1 插入排序
    eclipse 从已经存在代码建工程
    centos6.3 eclipse cdt
    Cant open file /data/svn/dev/db/txn-current-lock: Permission denied的解决方法
    git命令的安装与github简单使用
    CentOS-6.3安装配置SVN
    github使用_转
  • 原文地址:https://www.cnblogs.com/guyanzy/p/10507844.html
Copyright © 2011-2022 走看看