zoukankan      html  css  js  c++  java
  • 如何生成token(JWT的Token)

    主要代码

    1         //JWT 默认过期时间,3600L,单位秒
    2         Long expireSecond = 3600L;
    3         //盐值 
    4         String newSalt = 6665         String token = JwtUtil.generateToken(user.getUsername(), newSalt,     
    6         Duration.ofSeconds(expireSecond));        

    JwtUtil.generateToken方法

     1  /**
     2      * 生成JWT Token
     3      *
     4      * @param username       用户名
     5      * @param salt           盐值
     6      * @param expireDuration 过期时间和单位
     7      * @return token
     8      */
     9     public static String generateToken(String username, String salt, Duration expireDuration) {
    10         try {
    11             if (StringUtils.isBlank(username)) {
    12                 log.error("username不能为空");
    13                 return null;
    14             }
    15             log.debug("username:{}", username);
    16 
    17             // 如果盐值为空,则使用默认值:666666
    18             if (StringUtils.isBlank(salt)) {
    19                 salt = "666666;
    20             }
    21 
    22             // 过期时间,单位:秒
    23             Long expireSecond;
    24             // 默认过期时间为1小时 3600L 单位秒
    25             if (expireDuration == null) {
    26                 expireSecond = "3600L";
    27             } else {
    28                 expireSecond = expireDuration.getSeconds();
    29             }
    30             Date expireDate = DateUtils.addSeconds(new Date(), expireSecond.intValue());
    31 
    32             // 生成token
    33             Algorithm algorithm = Algorithm.HMAC256(salt);
    34             String token = JWT.create()
    35                     .withClaim(CommonConstant.JWT_USERNAME, username)
    36                     // jwt唯一id
    37                     .withJWTId(UUIDUtil.getUuid())
    38                     // 签发人
    39                     .withIssuer("")
    40                     // 主题
    41                     .withSubject("")
    42                     // 签发的目标
    43                     .withAudience("")
    44                     // 签名时间
    45                     .withIssuedAt(new Date())
    46                     // token过期时间
    47                     .withExpiresAt(expireDate)
    48                     // 签名
    49                     .sign(algorithm);
    50             return token;
    51         } catch (Exception e) {
    52             log.error("generateToken exception", e);
    53         }
    54         return null;
    55     }

    一些概念

    JSON Web Token(JWT),是目前最流行的跨域认证解决方案。

    JWT的原理

    服务器认证以后,生成一个JSON格式的对象返回给客户端。之后客户端与服务端通信的时候,都要发回这个JSON对象。服务器完全根据这个对象认证用户身份。

    JWT的组成

    JWT 由三部分组成,它们之间圆点(.)连接。这个三部分分别是:

    Header

    Payload

    Signature

    一个典型的JWT看起来是这个样子的: xxxxx.yyyyy.zzzzz

    Header

    header典型的由两部分组成:token的类型比如JWT、算法名称比如HMAC SHA256。

    Payload

    载荷,它包含声明(要求)。声明是关于实体和其他数据的声明。声明有三种类型:registered、public和private。

    • Registered claims : 这里有一组预定义的声明,它们不是强制的,但是推荐。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。
    • Public claims : 可以随意定义。
    • Private claims : 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。
    { "iss": "Online JWT Builder", 
    
      "iat": 1416797419, 
    
      "exp": 1448333419, 
    
      "aud": "www.example.com", 
    
      "sub": "jrocket@example.com", 
    
      "GivenName": "Johnny", 
    
      "Surname": "Rocket", 
    
      "Email": "jrocket@example.com", 
    
      "Role": [ "Manager", "Project Administrator" ] 
    
    }

    iss: 该JWT的签发者,是否使用是可选的

    sub: 该JWT所面向的用户,是否使用是可选的

    aud: 接收该JWT的一方,是否使用是可选的

    exp(expires): 什么时候过期,这里是一个Unix时间戳,是否使用是可选的

    iat(issued at): 在什么时候签发的(UNIX时间),是否使用是可选的

    其他还有:nbf (Not Before):如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟,是否使用是可选的

    将上面的JSON对象进行[base64编码]可以得到下面的字符串。这个字符串我们将它称作JWT的Payload(载荷)。

    eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9

    注意,不要在JWT的payload或header中放置敏感信息,除非它们是加密的。

    Signature

    将上面Header、Payload编码后的字符串都用.依次连接起来后用一个密钥,就形成了签名。

    具体如下图所示:

    可学习的相关博客(学习更深的知识)

    1.Java Token的原理和生成使用机制

    2.使用JWT实现Token认证

    3.基于JWT的Token登录认证(一)

  • 相关阅读:
    来一个炫酷的导航条
    jQuery实现瀑布流
    js计时事件
    js浏览器对象的属性和方法
    js对象(一)
    CSS3常用选择器(三)
    软工实践个人总结
    第05组 每周小结 (3/3)
    第05组 每周小结 (2/3)
    第05组 每周小结 (1/3)
  • 原文地址:https://www.cnblogs.com/chensisi/p/13372310.html
Copyright © 2011-2022 走看看