使用 Java JJWT 实现 Token 放行流程

在现代的 web 应用中,认证和授权是重要的内容。JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境中以一种紧凑和自包含的方式安全地传递信息。JJWT 是一个流行的 Java 库,用于生成和验证 JWT。本文将详细介绍如何使用 JJWT 库在 Java 中实现 JWT 的放行功能。

整体流程

我们可以将 JWT 的放行流程分为以下几个步骤:

步骤 描述
1 添加 JJWT 依赖
2 创建 JWT 生成器
3 生成 JWT
4 创建 JWT 验证器
5 验证 JWT
6 放行用户请求

步骤详解

1. 添加 JJWT 依赖

首先,我们需要在项目中添加 JJWT 依赖。如果你使用 Maven,添加以下内容到 pom.xml 文件中:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

2. 创建 JWT 生成器

我们需要一个方法来生成 JWT。下面是一个简单的示例:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class TokenProvider {
    private String secretKey = "mySecretKey"; // 请使用更强的密钥

    // 生成 JWT 方法
    public String createToken(String username) {
        return Jwts.builder()
                .setSubject(username) // 设置主题(用户凭证)
                .signWith(SignatureAlgorithm.HS256, secretKey) // 使用 HMAC SHA256 签名
                .compact(); // 生成 JWT
    }
}

代码解释

  • secretKey: 用于签名 JWT 的密钥,应存储安全,防止泄露。
  • createToken: 接受用户名并生成 JWT。

3. 生成 JWT

可以通过简单的主程序(main 方法)来测试 JWT 的生成:

public class Main {
    public static void main(String[] args) {
        TokenProvider tokenProvider = new TokenProvider();
        String token = tokenProvider.createToken("user123");
        System.out.println("Generated Token: " + token);
    }
}

4. 创建 JWT 验证器

在收到请求时,我们需要验证 token 的有效性:

public class TokenVerifier {
    private String secretKey = "mySecretKey";

    // 验证 JWT 方法
    public String verifyToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(secretKey) // 设置签名密钥
                    .parseClaimsJws(token) // 解析 token
                    .getBody().getSubject(); // 返回主体
        } catch (Exception e) {
            return null; // 验证失败
        }
    }
}

代码解释

  • verifyToken: 接受 JWT token 并返回与之关联的用户名,如果验证失败则返回 null。

5. 验证 JWT

使用 TokenVerifier 类来进行验证:

public class Main {
    public static void main(String[] args) {
        TokenProvider tokenProvider = new TokenProvider();
        TokenVerifier tokenVerifier = new TokenVerifier();

        String token = tokenProvider.createToken("user123");
        String verifiedUsername = tokenVerifier.verifyToken(token);
        
        if (verifiedUsername != null) {
            System.out.println("Token is valid for user: " + verifiedUsername);
        } else {
            System.out.println("Invalid token!");
        }
    }
}

6. 放行用户请求

最后,我们需要在网络请求中使用这些逻辑。在 Spring Boot 中,这通常体现在过滤器中。下面是一个简单的过滤器示范:

import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class JwtAuthenticationFilter extends OncePerRequestFilter {
    private TokenVerifier tokenVerifier = new TokenVerifier();

    @Override
    protected void doFilterInternal(HttpServletRequest request, 
                                    HttpServletResponse response, 
                                    FilterChain filterChain)
            throws ServletException, java.io.IOException {

        String token = request.getHeader("Authorization");
        if (token != null && tokenVerifier.verifyToken(token) != null) {
            // 放行请求
            filterChain.doFilter(request, response);
            return;
        }
        
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
    }
}

Mermaid序列图

下面是用 Mermaid 语法生成的序列图,描述了用户如何通过 JWT 实现放行。

sequenceDiagram
    participant User
    participant Server
    User->>Server: 发送请求,包含Token
    Server->>Server: 验证Token
    alt 验证通过
        Server->>User: 响应数据
    else 验证失败
        Server->>User: 返回未授权状态
    end

Mermaid类图

下面是用 Mermaid 语法生成的类图,描述了 JWT 生成和验证的类结构。

classDiagram
    class TokenProvider {
        +String createToken(String username)
    }

    class TokenVerifier {
        +String verifyToken(String token)
    }

    class JwtAuthenticationFilter {
        +doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
    }

    TokenProvider --> TokenVerifier
    JwtAuthenticationFilter --> TokenVerifier

结尾

通过本文,我们详细讨论了如何在 Java 中使用 JJWT 库实现 JWT 的生成与验证,最终达到对用户请求的放行。掌握这些步骤后,你将能够为你的应用程序实现一个安全的身份验证机制。结合这些技能和你在开发中的实践经验,一定会对你进一步的学习和实践大有裨益。希望这篇文章对你有帮助!