首页 智能穿戴

微服务网关集成 JWT 认证:统一鉴权的深度实战指南

分类:智能穿戴
字数: (0220)
阅读: (2965)
内容摘要:微服务网关集成 JWT 认证:统一鉴权的深度实战指南,

在微服务架构中,服务数量众多,每个服务都需要进行身份验证和授权,如果每个服务都独立实现一套认证逻辑,将会导致代码冗余、维护困难、安全风险增加。本文将深入探讨如何利用 Gateway 集成 JWT 身份认证,实现微服务的统一认证鉴权,解决上述痛点。

JWT (JSON Web Token) 认证原理

JWT 是一种基于 JSON 的开放标准(RFC 7519),用于在客户端和服务器之间安全地传输信息。一个 JWT 包含了三个部分:Header(头部)、Payload(负载)、Signature(签名)。

  • Header(头部): 通常包含了 JWT 的类型(typ)和签名算法(alg),例如:

    微服务网关集成 JWT 认证:统一鉴权的深度实战指南
    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload(负载): 包含了声明(claims),声明是关于实体(用户)和其他数据的声明。有三种类型的声明:注册声明、公共声明、私有声明。例如:

    {
      "sub": "user123",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Signature(签名): 是通过 Header、Payload 和一个密钥,使用 Header 中指定的算法进行加密生成的。签名用于验证 JWT 的完整性,确保 JWT 没有被篡改。

    微服务网关集成 JWT 认证:统一鉴权的深度实战指南

JWT 的工作流程

  1. 客户端使用用户名和密码向认证服务器进行身份验证。
  2. 认证服务器验证成功后,会生成一个 JWT,并将其返回给客户端。
  3. 客户端将 JWT 存储在本地(例如,localStorage 或 cookie 中)。
  4. 客户端在后续的请求中,将 JWT 放在请求头中(通常是 Authorization 头部,使用 Bearer 方案)。
  5. Gateway 接收到请求后,会验证 JWT 的有效性。如果 JWT 有效,则将请求转发到相应的微服务;否则,返回未经授权的错误。

Gateway 集成 JWT 认证方案

以下以 Spring Cloud Gateway 为例,介绍如何集成 JWT 认证。

1. 添加依赖

首先,需要在 Gateway 项目中添加 JWT 相关的依赖,例如:

微服务网关集成 JWT 认证:统一鉴权的深度实战指南
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-api</artifactId>
  <version>0.11.5</version>
</dependency>
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-impl</artifactId>
  <version>0.11.5</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-jackson</artifactId>
  <version>0.11.5</version>
  <scope>runtime</scope>
</dependency>

2. 创建 JWT 验证过滤器

创建一个 Gateway 过滤器,用于验证 JWT 的有效性。该过滤器需要从请求头中获取 JWT,然后验证其签名、过期时间等。

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class JwtAuthenticationFilter implements GatewayFilter {

    private final String secret = "your-secret-key"; // 替换为你的密钥

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();

        if (!request.getHeaders().containsKey("Authorization")) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        String authHeader = request.getHeaders().get("Authorization").get(0);
        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        String token = authHeader.substring(7); // 去掉 "Bearer " 前缀

        try {
            Claims claims = Jwts.parserBuilder()
                    .setSigningKey(secret.getBytes())
                    .build()
                    .parseClaimsJws(token)
                    .getBody();

            // 可以将用户信息添加到请求头中,以便微服务使用
            exchange.getRequest().mutate().header("X-User-Id", claims.getSubject()).build();
        } catch (Exception e) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        return chain.filter(exchange);
    }
}

3. 配置路由

在 Gateway 的配置文件中,配置需要进行 JWT 认证的路由。可以使用 pathpath_route 谓词来匹配需要保护的 API 接口,并添加 JWT 验证过滤器。

微服务网关集成 JWT 认证:统一鉴权的深度实战指南
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - JwtAuthenticationFilter # 应用 JWT 验证过滤器

4. 认证服务

认证服务负责验证用户身份,并生成 JWT。可以使用 Spring Security 或其他认证框架来实现认证服务。认证成功后,将 JWT 返回给客户端。

实战避坑经验

  • 密钥安全: JWT 的密钥必须妥善保管,不能泄露。建议将密钥存储在安全的地方,例如,配置中心或密钥管理服务。
  • 过期时间: JWT 的过期时间应该设置得合理,不宜过长,以减少安全风险。可以根据实际业务需求,设置合适的过期时间。
  • 刷新令牌: 为了避免用户频繁登录,可以使用刷新令牌(Refresh Token)机制。当 JWT 过期时,可以使用刷新令牌来获取新的 JWT。
  • Payload 大小: JWT 的 Payload 不宜过大,因为 JWT 会在每次请求中都发送,过大的 Payload 会增加网络负担。可以将一些不常用的用户信息存储在微服务中,通过用户 ID 来获取。
  • 防止 JWT 重放攻击: 可以使用 JTI(JWT ID)声明来防止 JWT 重放攻击。每次生成 JWT 时,都生成一个唯一的 JTI,并将其存储在数据库或缓存中。在验证 JWT 时,检查 JTI 是否已经存在,如果存在,则拒绝该 JWT。
  • 使用 HTTPS: 为了防止 JWT 在传输过程中被窃取,应该使用 HTTPS 协议。

通过以上步骤,可以实现 Gateway 集成 JWT 身份认证,从而为微服务提供统一的认证鉴权服务。同时,合理配置 Nginx 等反向代理服务器,例如设置 proxy_connect_timeoutproxy_read_timeoutproxy_send_timeout 等参数,能够有效应对高并发场景,保障服务的稳定性和可用性。可以使用宝塔面板简化服务器管理。

希望本文能够帮助你更好地理解和应用 JWT 认证技术,构建更安全、可靠的微服务系统。

微服务网关集成 JWT 认证:统一鉴权的深度实战指南

转载请注明出处: 脱发程序员

本文的链接地址: http://m.acea2.store/article/27371.html

本文最后 发布于2026-04-06 06:05:37,已经过了21天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 北京炸酱面 5 天前
    这篇关于网关集成 JWT 的文章很及时,最近正好在研究这块,学到了很多。