如何在Spring Cloud API Gateway中实现基础认证并兼容自定义JWT与OAuth?
API Gateway层安全管控及多token兼容实现方案
1. 网关先调用认证服务再转发的逻辑实现
完全可以采用同步聚合调用的方式实现该需求,所有安全校验逻辑全部收敛在网关层,无需改造下游受保护的资源服务,基于Spring Cloud Gateway的实现步骤如下:
- 自定义优先级最高的全局
GlobalFilter,确保该过滤器在路由转发逻辑之前执行 - 过滤器中先提取客户端请求携带的身份凭证(如用户名密码、旧版token等参数)
- 同步调用自定义认证服务的token颁发接口,传入合法凭证后获取标准bearer token
- 执行token校验:可直接调用认证服务的校验接口,也可将JWT签名的公钥预存在网关本地完成本地校验,降低跨服务调用开销
- 校验通过后,将有效bearer token写入请求头的
Authorization字段,格式为Bearer <token值>,再将请求转发到下游资源服务 - 若token获取失败或校验不通过,网关直接返回401/403状态码,终止请求转发
注意同步调用认证服务时需要配置合理的超时、熔断和重试机制,避免认证服务故障导致网关链路阻塞;也可以将有效token缓存到网关本地,缓存过期时间和JWT本身的有效期保持一致,减少重复调用认证服务的频率。
2. 兼容旧版自定义JWT与新增OAuth2支持的方案
Spring Cloud Gateway原生的OAuth2全局过滤器支持自定义扩展,可通过扩展token解析逻辑实现双token体系的兼容,具体实现方案如下:
- 首先引入基础依赖:
spring-cloud-starter-gateway、spring-boot-starter-oauth2-resource-server - 自定义
ReactiveJwtDecoderBean,在该Bean的解码逻辑中实现双分支校验:- 先解析JWT的基础头信息,通过
iss(签发者)字段或者自定义的特殊claim标识,区分当前token是旧版自定义认证服务生成的JWT,还是新版OAuth2授权服务器生成的JWT - 若为旧版自定义JWT:可直接调用现有认证服务的校验接口完成校验,也可将旧版JWT的签名密钥/公钥配置在网关中,直接完成本地签名校验、有效期校验、权限字段校验
- 若为新版OAuth2 JWT:走Spring Security默认的OAuth2 JWT校验逻辑,对接新版OAuth2授权服务器的JWK Set接口完成校验即可
- 先解析JWT的基础头信息,通过
- 若你的旧版token为不透明的自定义token(非JWT格式),则自定义
ReactiveAuthenticationManager实现类,在类中调用旧认证服务的校验接口完成身份验证即可 - 所有token校验通过后,统一将权限信息写入请求上下文,转发时统一携带规范的Authorization头,下游资源服务无需感知token的来源和类型
该方案可同时支持客户端传入旧版自定义token、新版OAuth2 token两种请求模式,所有兼容逻辑全部在网关层完成,下游资源服务无需做任何改造。
内容的提问来源于stack exchange,提问作者Sushmita Goswami
相关产品推荐
相关产品推荐

