美文网首页个人学习
身份验证之JWT

身份验证之JWT

作者: Coding测试 | 来源:发表于2020-03-17 19:27 被阅读0次

    什么是(JWT)JSON Web Token ?

    • 官网介绍
      JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地将信息作为JSON对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公用/专用密钥对对JWT进行签名...pilipala...看不进去了。
    • 下面就来简单的总结下JWT
      • 简单来说:JWT是一个JSON信息传输的开放标准,它可以使用密钥对信息进行数字签名,以确保信息是可验证和可信任的。
      • JWT基于token的鉴权机制
        基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
        JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。除了用户id之外,还可以存储其他的和用户相关的信息,例如用户角色,用户性别等。


      • 请求流程
        1、用户使用用户名密码来请求服务器
        2、服务器进行验证用户的信息
        3、服务器通过验证发送给用户一个token
        4、客户端存储token,并在每次请求时附送上这个token值
        5、服务端验证token值,并返回数据
      • JWT的结构:WT由三部分构成:header(头部)、payload(载荷)和signature(签名)。 以紧凑的形式由这三部分组成,由“.“分隔。[格式:aaaaa.bbbbb.ccccc]
    • 下面就来剖析下这一大串的字符
      • header:通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA等等。
        eg:
    {  "alg": "HS256", "typ": "JWT" }
    
    • 显而易见,这是一个json数据,然后这货会被Base64编码形成JWT的第一部分,也就是aaaaa.bbbbb.ccccc中的aaaaaa
      eg:
    {
      "iss": "www.baidu.com",
      "sub": "you",
      "aud": "me",
      "name": "456",
      "admin": true,
      "iat": 1584091337,
      "exp": 1784091337,
    }
    
    • 上面同样会被Base64编码,然后形成JWT的第二部分,也就是aaaaa.bbbbb.ccccc中的bbbbb
    • signature
      这是JWT的第三部分,叫做签名,此部分用于防止JWT内容被篡改。将上面的两个编码后的字符串都用英文句号.连接在一起(头部在前),就形成了[aaaaa.bbbbb]
      然后再使用header中声明签名算法进行签名。 如果要使用HMAC SHA256算法,则将通过以下方式创建签名
    HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
    
    • 当然,在加密的时候,我们还需要提供一个密钥(secret),我们可以自己随意指定。这样就形成了JWT的第三部分,也就是aaaaa.bbbbb.ccccc中的ccccc
      最后,我们把这三个部分拼在一起,就形成了一个完整的JWT
      如果我们想试验一下的话,可以在JWT的官网进行debugger。贴一下官网: https://jwt.io/

    • 附JSON Web Token认证流程


    • JWT使用场景

      • 授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用
        项目中JWT生成规则示例:
     @Test
    public void getToken() {
            //client-id  
            String clientId = "";
            //client-secret  
            String clientSecret = "";
            //系统地址
            String url = "https://xxx.com";
            //接口地址
            String api = "/api/xxx";
    
            Map<String, Object> requestMap = new HashMap<>();
            long timestamp = System.currentTimeMillis();
            String rand = UUID.randomUUID().toString();
    
            String sigin = this.tokenSignature(timestamp + "", rand, clientId, clientSecret);
            requestMap.put("timestamp", timestamp);
            requestMap.put("rand", rand);
            requestMap.put("clientId", clientId);
            requestMap.put("signature", sigin);
            url = url + api;
            String resultStr = HxHttpClient.postJson(url, requestMap);
            System.out.println(resultStr);
        }
    
    • 信息交换:JSON Web Token是在各方之间安全地传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确定发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否遭到篡改。

    相关文章

      网友评论

        本文标题:身份验证之JWT

        本文链接:https://www.haomeiwen.com/subject/nlszehtx.html