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
相关产品推荐
相关产品推荐

