zoukankan      html  css  js  c++  java
  • Json Web Token (JWT)

    Json web token (JWT),它是基于 RFC 7519 标准定义的一种可以安全传输的的JSON对象,由于使用了数字签名,所以是可信任和安全的。

    JWT令牌由三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz
    • Header
      头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)
      一个例子如下:
      下边是Header部分的内容
    { 
      "alg": "HS256", 
      "typ": "JWT" 
    } 
      将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。
    • Payload
      第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,
      比如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。
      此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。
      最后将第二部分负载使用 Base64Url 编码,得到一个字符串就是 JWT 令牌的第二部分。
      一个例子:
    { 
        "sub": "1234567890", 
        "name": "456", 
        "admin": true 
    }
    • Signature
      第三部分是签名,此部分用于防止 jwt 内容被篡改
      这个部分使用 base64url 将前两部分进行编码,编码后使用点(.)连接组成字符串,最后在 header 中声明签名算法进行签名。
      一个例子:
    HMACSHA256( 
        base64UrlEncode(header) + "." + 
        base64UrlEncode(payload), 
        secret)
      base64UrlEncode(header):jwt令牌的第一部分。
      base64UrlEncode(payload):jwt令牌的第二部分。
      secret:签名所使用的密钥。
     

    JWT实现认证和授权的原理

    • 用户调用登录接口,登录成功后获取到JWT的token;
    • 之后用户每次调用接口都在http的header中添加一个叫Authorization的头,值为JWT的token;
    • 后台程序通过对Authorization头中信息的解码及数字签名校验来获取其中的用户信息,从而实现认证和授权

    Token 的生成

    /**
     * 根据用户信息生成token
     */
    public String generateToken(UserDetails userDetails) {
        Map<String, Object> claims = new HashMap<>();
        claims.put(CLAIM_KEY_USERNAME, userDetails.getUsername());
        claims.put(CLAIM_KEY_CREATED, new Date());
        return generateToken(claims);
    }
    /**
    * 根据负责生成JWT的token
    */
    private String generateToken(Map<String, Object> claims) {
        return Jwts.builder()
            .setClaims(claims)//payload
            .setExpiration(generateExpirationDate())//过期时间
            .signWith(SignatureAlgorithm.HS512, secret)//加密算法
            .compact();
    }
    

      

  • 相关阅读:
    H5 20-属性选择器上
    H5 19-序选择器下
    H5 18-序选择器
    算法基础部分整理-《图解算法》
    iOS 内存管理之属性关键字
    多线程 ---基础定义部分
    Mongodb基本命令总结
    MySQL四种隔离级别和MVCC
    python同步原语--线程锁
    python进程间通信--信号Signal
  • 原文地址:https://www.cnblogs.com/hellojava404/p/13160615.html
Copyright © 2011-2022 走看看