zoukankan      html  css  js  c++  java
  • jwt 的使用

    jwt 是什么 ?   json web token  的 简称,是一种无状态的 认证机制

    原理:客户端 向服务器端请求一个 jwt 生成的 token ,这个token 带有 一些信息,下次 客户端请求 接口的时候带上这个 token,服务器端  检查这个 token,以此 判断用户的请求是否合法。所以 jwt是做认证的,不要理解成加密的了。

    jwt生成的 token 组成:  头部.负载.签名 

    头部: 是 base64 编码的 包含有签名算法的 json 字符串

      比如  header 为 {"alg":"HS512"} 加密以后就是 eyJhbGciOiJIUzUxMiJ9

    负载: 有承载的数据 和 时间的  json 字符串  被 base64 转码以后得到的 数据

      比如: playload 为  {"sub":"18508280881,100","exp":1532672451} 对应着 eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI2NzI0NTF9

    签名:签名是验证  jwt token 是否合法的  签名= 头指定的算法( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )

      secret   是 一个 只有服务器 知道的 秘钥;

    上面的 完整token:eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI2NzI0NTF9.sJaL2dpYAQdi3ZloDjIHzuIUetHEupMVD5dnnNjWdHFOrLZXgZi2C68FG1O5UGZ0_JMNW8rqYDECw9ligoc1RQ

     secret 是:abc=

    Java 代码例子如下

    package com.sbl.pay.subaccount;
    
    
    import java.util.Calendar;
    import java.util.Date;
    
    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.JwtBuilder;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    
    /**
     * jwt工具
     * @author ZHANGYUKUN
     *
     */
    public class JWTUtil {
    
        public static void main(String[] args) {
            String secretKey = "abc=";
            
            
            System.out.println( JWTUtil.createToken( "zyk" ,secretKey) );
            System.out.println(  JWTUtil.checkToken( secretKey , JWTUtil.createToken("zyk" ,secretKey)  ) );
    
        }
        
        /**
         * 验证 token 
         * @param secretKey
         * @param tokenValue
         * @return 成功 返回 解密后的内容,否者抛出异常
         */
        public static String checkToken(String secretKey,String tokenValue) {
            Claims claims = Jwts.parser().setSigningKey( secretKey ).parseClaimsJws(tokenValue).getBody();
            return claims.getSubject();
        }
    
        /**
         * 生成 token 
         * @param content 负载的内容
         * @param secretKey 秘钥
         * @return token
         */
        public static String createToken(String content,String secretKey) {
            JwtBuilder builder = Jwts.builder().setSubject( content );
            String userToken = builder.signWith(SignatureAlgorithm.HS512,  secretKey ).compact();
            return userToken;
        }
        
        /**
         * 生成 token 
         * @param content 负载的内容
         * @param secretey 秘钥
         * @param expiresTime 过期时间(秒)
         * @return token
         */
        public static String createToken(String content,String secretKey,int  expiresTime) {
        	Calendar calendar = Calendar.getInstance();
        	calendar.add(Calendar.SECOND , expiresTime );
            
            JwtBuilder builder = Jwts.builder().setSubject( content ).setExpiration( calendar.getTime() );
            String userToken = builder.signWith(SignatureAlgorithm.HS512,  secretKey ).compact();
            return userToken;
        }
    
    
    }
    

      

    结果

    eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI1OTA1MzZ9.ckV39Ev9_SQxwABeSfVfcuCndwEyOZUbkUXdPeZIjBVTo4UlSXYFamjmRqp8w7yDrJ_KDQrey4LshAMCy0MGlg
    18508280881,100
    

      

     总结 jwt的 用途是做认证,并且这种认证是无状态的和restful 天生一对, jwt 也有明显的缺点 如果 jwt 生成的 token被获取,那么 在token过期的这短时间内 可以一直被利用。 但是这个不是jwt 关心 的重点,可以通过 https 来保证数据传输的安全,可以通过 后端别的机制认证 token 是否过期(不仅仅依赖 token 里面 的 过期时间 )

    采坑了:

    如果验证在别人那里,被人给你的secretKey 是没有加密的。那么 你 用 base64转码以后再  生成token。 secretKey = Base64.getEncoder().encodeToString( secretKey.getBytes() ); 。否者这边对的,两边一对接就出错。

  • 相关阅读:
    烦人的警告 Deprecated: convertStrings was not specified when starting the JVM
    Python 推送RabbitMQ
    JavaScript-json数组排序
    CSS-返回顶部代码
    CSS-页面滑屏滚动原理
    CSS-图像映射
    CSS-下拉导航条
    CSS-background-position百分比
    CSS- 横向和纵向时间轴
    JavaScript-闭包深入浅出
  • 原文地址:https://www.cnblogs.com/cxygg/p/9371654.html
Copyright © 2011-2022 走看看