跨域身份验证解决方案--JWT之快速入门

简介

JSON Web Token(JWT) 是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。在Java中可以通过JJWT实现JWT创建和验证。

一、token的创建:

  • (1)创建maven工程,引入依赖
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
  • 创建测试方法 createJwtTest,用于生成 token
 @Test
 public void createJwtTest(){
     JwtBuilder builder= Jwts.builder().setId("111")
             .setSubject("coderyang")
             .setIssuedAt(new Date())
             .signWith(SignatureAlgorithm.HS256,"jwttest");
     System.out.println( builder.compact() );
 }

解释:通过Jwts工具类可以设置 token 相关信息:
1.setId() 可以用登录用户的 userId 入参(不一定是userId)
2.setSubject(),可以用登录用户的用户名入参(不一定是用户名)
3.setIssuedAt()token 签发时间,一般取当前时间
4.signWith() 入参两个参数,前一个是设置加密方式后一个是设置加密私钥

  • (3)测试运行,输出如下:
    生成token

二、token的解析:

上面已经创建了 token ,在 web 应用中这个操作是由服务端进行然后发给客户端,客户端在下次向服务端发送请求时需要携带这个 token(这就好像是拿着一张门票一样),那服务端接到这个 token 应该解析出其中的信息(例如用户id,用户名等),根据这些信息查询数据库返回相应的结果。

  • 创建测试方法 parseJwtTest,用于解析 token
@Test
public void parseJwtTest(){
    String token="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMTEiLCJzdWIiOiJjb2RlcnlhbmciLCJpYXQiOjE1ODIyNTEzODZ9.fQr0pPDq9OiBLKbHQMd_67eUNHwdrcerQMdeXtcQzi4";
    Claims claims =
            Jwts.parser().setSigningKey("jwttest").parseClaimsJws(token).getBody();
    System.out.println("id:"+claims.getId());
    System.out.println("subject:"+claims.getSubject());
    System.out.println("IssuedAt:"+claims.getIssuedAt());
}

解释:还是通过 Jwts 工具类去解析 token
1.setSigningKey() 方法是设置我们之前在创建 token 的时候设置的私钥,需要和之前的保持一致,不然解析会出错。
2.parseClaimsJws() 方法是入参需要解析的 token,这里我们取上一步生成的
3.getBody() 方法返回 Claims 类型的对象,里面包含了我们设置的所有信息
4.然后调用相应的get方法就可以获取到 token 里携带的信息。

  • (3)测试运行,输出如下:
    解析token

三、自定义claims

我们刚才的例子只是存储了 idsubject 两个信息,如果你想存储更多的信息(例如角色)可以自定义 claims

  • (1)创建测试方法 createJwtTest2,用于生成 token
@Test
public void createJwtTest2(){
    //为了方便测试,我们将过期时间设置为1分钟
    long now = System.currentTimeMillis();//当前时间
    long exp = now + 1000*60;//过期时间为1分钟
    JwtBuilder builder= Jwts.builder().setId("111")
            .setSubject("coderyang")
            .setIssuedAt(new Date())
            .signWith(SignatureAlgorithm.HS256,"jwttest")
            .setExpiration(new Date(exp))
            .claim("roles","admin"); //自定义claims存储数据
    System.out.println( builder.compact() );
}

解释:相比之前的方法,这里添加了 token 过期时间和一个自定义的数据roles,其值为admin

  • (2)测试运行,输出如下:
    生成token
  • (3)创建测试方法 parseJwtTest2,用于解析 token
@Test
  public void parseJwtTest2() {
    String token =
        "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMTEiLCJzdWIiOiJjb2RlcnlhbmciLCJpYXQiOjE1ODIyNTM3MDYsImV4cCI6MTU4MjI1Mzc2Niwicm9sZXMiOiJhZG1pbiJ9.81FnRhl5OG0Lug3gdb_4PsdCgZnhwiUXSpoBng2B44o";
    Claims claims = Jwts.parser().setSigningKey("jwttest").parseClaimsJws(token).getBody();
    System.out.println("id:" + claims.getId());
    System.out.println("subject:" + claims.getSubject());
    System.out.println("IssuedAt:" + claims.getIssuedAt());
    System.out.println("expiration" + claims.getExpiration());
    System.out.println("roles:" + claims.get("roles"));
  }
  • (4)测试运行,输出如下:
    解析token
发布了35 篇原创文章 · 获赞 52 · 访问量 1290

猜你喜欢

转载自blog.csdn.net/weixin_40242806/article/details/104422623