JWT 在java中的运用

作者: 蓝山牧童 | 来源:发表于2017-06-01 14:20 被阅读1691次

    **摘要: ** JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。常规的用户识别基于Session+Cookie。这种方式解决了http无状态协议的用户识别的问题。JWT是Auth0提出的通过对JSON进行加密签名来实现授权验证的方案。

    一、jwt组成

    一个JWT实际上就是一个字符串,它由三部分组成,头部(header)、载荷(Claims)与签名

    base64编码之后的jwt看起来是一串字符串,由3个 .分隔,分别对应:

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnlKjmiLciLCJpc3MiOiLnrb7lj5HogIUiLCJleHAiOjE0OTYyOTY0MTEsInVzZXJpZCI6MTIzNH0.YCduQ8f_IfEef-Uw5noRl_mXU1G15bkc2Zx3m67n6gE
    将上面的字符串分别base64解密后
    Header
    { "typ":"JWT", "alg":"HS256" }

    Claims
    { "sub":"用户", "iss":"签发者", "exp":1496296411, "userid":1234 }

    签名
    ``'nC|GS�g�f]MFזsfqn�`

    Claims中字段说明,这几个字段都是JWT标准定义的

    iss: 该JWT的签发者
    sub: 该JWT所面向的用户
    aud: 接收该JWT的一方
    exp(expires): 什么时候过期,这里是一个Unix时间戳
    iat(issued at): 在什么时候签发的

    还可以自己添加所需的字段,比如后面userid。

    二、JWT运用

    在使用过程中,服务端通过用户登录验证之后,将base64(Header)+.+base64(Claim)信息加密后得到第三段签名,然后将三部分返回给客户端,在后续请求中,服务端只需要对用户请求中包含的JWT进行解码,即可验证是否可以授权用户获取相应信息。

    通过上面的说明可以看出,jwt可以省去读取session的步骤,减轻服务端压力。服务端只需要通过秘钥验证客户端携带的jwt来验证是否是已登录客户。

    三、JWT 的java实现

    • 首先在pom.xml引入java-jwt的依赖
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.2.0</version>
        </dependency>
    
        /**创建JWT*/
        public static String createJwt() throws IllegalArgumentException, UnsupportedEncodingException{
            Algorithm al = Algorithm.HMAC256("secretkey");
            String token = JWT.create()
                    .withIssuer("签发者")
                    .withSubject("用户")
                    .withClaim("userid", 1234)
                    .withExpiresAt(new Date(System.currentTimeMillis()+360000))
                    .sign(al);
            
            return token;
            
        }
        /**验证jwt*/
        public static void verifyJwt(String token) {
                try {
                    Algorithm algorithm = Algorithm.HMAC256("secretkey");
                    JWTVerifier verifier = JWT.require(algorithm)
                        .build(); 
                    DecodedJWT jwt = verifier.verify(token);
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (JWTVerificationException e) {
                    e.printStackTrace();
                    System.out.println("校验失败");
                }
        }
    

    如果验证失败则抛出异常。

    相关文章

      网友评论

        本文标题:JWT 在java中的运用

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