java全栈Java 杂谈首页投稿(暂停使用,暂停投稿)

JWT 在java中的运用

2017-06-01  本文已影响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实现

    <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("校验失败");
            }
    }

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

上一篇下一篇

猜你喜欢

热点阅读