You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenApi 3能否自动发送OAuth2.0访问令牌?Spring Boot 3集成问题咨询

Spring Boot 3 + Keycloak + OpenApi 3:解决POST 403并实现Swagger自动携带令牌

POST请求403的核心原因

GET请求能正常访问大概率是因为你的GET接口配置了匿名权限,而POST接口要求认证,但Swagger默认不会自动携带令牌,因此返回403。要实现Swagger自动从Keycloak获取令牌并添加到请求头,需配置OAuth2自动授权流程。

1. 配置OpenApi的OAuth2认证规则

创建或修改OpenApi配置类,将Keycloak的授权地址、令牌地址及客户端信息配置进去,让Swagger知晓令牌的获取渠道:

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.security.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenApiConfig {

    // 替换为你的Keycloak实际地址和Realm名称
    private static final String KEYCLOAK_AUTH_URL = "http://你的Keycloak地址/realms/你的Realm名/protocol/openid-connect/auth";
    private static final String KEYCLOAK_TOKEN_URL = "http://你的Keycloak地址/realms/你的Realm名/protocol/openid-connect/token";
    private static final String CLIENT_ID = "swagger-client"; // Keycloak后台创建的客户端ID
    private static final String CLIENT_SECRET = "你的客户端密钥"; // 仅当客户端为confidential类型时需要填写

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .components(new Components()
                        .addSecuritySchemes("keycloak-oauth", new SecurityScheme()
                                .type(SecurityScheme.Type.OAUTH2)
                                .flows(new OAuthFlows()
                                        .authorizationCode(new OAuthFlow()
                                                .authorizationUrl(KEYCLOAK_AUTH_URL)
                                                .tokenUrl(KEYCLOAK_TOKEN_URL)
                                                .scopes(new Scopes()
                                                        // 添加接口所需的权限范围,比如read、write
                                                        .addString("read", "读取权限")
                                                        .addString("write", "写入权限"))
                                                .clientId(CLIENT_ID)
                                                .clientSecret(CLIENT_SECRET)))
                        )
                )
                .addSecurityItem(new SecurityRequirement().addList("keycloak-oauth"));
    }
}

2. 配置Swagger UI自动授权参数

在application.yml中添加Swagger UI的配置,使其支持自动跳转到Keycloak登录页,获取令牌后自动携带在请求头:

springdoc:
  swagger-ui:
    oauth:
      client-id: swagger-client
      client-secret: 你的客户端密钥 # 仅confidential类型客户端需要
      realm: 你的Realm名
      app-name: 项目Swagger UI
      use-pkce-with-authorization-code-flow: true # 使用authorization_code流程时,开启PKCE提升安全性
    authorization-url: http://你的Keycloak地址/realms/你的Realm名/protocol/openid-connect/auth
    token-url: http://你的Keycloak地址/realms/你的Realm名/protocol/openid-connect/token
    try-it-out-enabled: true
    request-headers:
      - name: Authorization
        description: Bearer令牌
        defaultValue: Bearer {token}

3. 修正Keycloak客户端配置

前往Keycloak后台,找到你的Swagger客户端,调整以下配置:

  • 客户端类型:前后端分离场景选public,服务器端场景选confidential
  • 有效重定向URI:添加Swagger的回调地址,一般为http://你的应用地址/swagger-ui/oauth2-redirect.html
  • 授权类型:勾选Authorization Code和Refresh Token
  • 权限范围:确保客户端拥有接口所需的read、write等权限范围

验证效果

启动应用后,访问Swagger UI(默认地址为http://localhost:端口/swagger-ui.html),点击右上角的Authorize按钮,将跳转到Keycloak登录页面。登录成功后,Swagger会自动获取访问令牌,后续所有请求(包括POST)都会自动在请求头中携带Authorization: Bearer {token},403问题即可解决。


内容的提问来源于stack exchange,提问作者Octavia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:35:35