如何在Quarkus中实现多提供商OIDC认证?
Quarkus OIDC多身份提供商实现方案
1. 配置多个OIDC客户端
Quarkus支持通过命名OIDC客户端实现多提供商支持,只需在application.properties中为每个提供商配置独立的OIDC参数,使用quarkus.oidc.[客户端名称].作为前缀。
示例配置:
# Google OIDC 配置 quarkus.oidc.google.auth-server-url=https://accounts.google.com/.well-known/openid-configuration quarkus.oidc.google.client-id=你的Google客户端ID quarkus.oidc.google.client-secret=你的Google客户端密钥 quarkus.oidc.google.scopes=openid,email,profile # Facebook OIDC 配置 quarkus.oidc.facebook.auth-server-url=https://www.facebook.com/.well-known/openid-configuration quarkus.oidc.facebook.client-id=你的Facebook客户端ID quarkus.oidc.facebook.client-secret=你的Facebook客户端密钥 quarkus.oidc.facebook.scopes=openid,email,public_profile # 全局安全规则:所有路径需认证 quarkus.http.auth.permission.authenticated.paths=/* quarkus.http.auth.permission.authenticated.policy=authenticated
2. 构建登录选择页面
创建一个简单的页面,让用户选择登录提供商,每个选项链接到对应OIDC客户端的授权端点(Quarkus自动映射/oauth2/authorization/[客户端名称]路径到对应客户端的授权流程)。
示例HTML页面(可放在src/main/resources/META-INF/resources/login.html):
<!DOCTYPE html> <html> <head> <title>选择登录方式</title> </head> <body> <h1>登录</h1> <div> <a href="/oauth2/authorization/google">使用Google登录</a> </div> <div style="margin-top: 10px;"> <a href="/oauth2/authorization/facebook">使用Facebook登录</a> </div> </body> </html>
3. 处理回调与用户信息
Quarkus会自动处理每个OIDC客户端的回调请求(默认路径为/oauth2/code/[客户端名称]),无需额外编写回调逻辑。你可以通过SecurityIdentity获取已认证用户的信息,不同提供商的Claim字段可能略有差异,需按需适配。
示例REST端点获取用户信息:
import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import io.quarkus.security.identity.SecurityIdentity; @Path("/api/user") @Produces(MediaType.APPLICATION_JSON) public class UserResource { @Inject SecurityIdentity identity; @GET public UserProfile getProfile() { // 从Principal名称中提取提供商标识(格式为[客户端名称]:[用户ID]) String provider = identity.getPrincipal().getName().split(":")[0]; String email = identity.getClaim("email"); String displayName = identity.getClaim("name"); return new UserProfile(provider, email, displayName); } public static class UserProfile { public String provider; public String email; public String displayName; public UserProfile(String provider, String email, String displayName) { this.provider = provider; this.email = email; this.displayName = displayName; } } }
4. 关键注意事项
- 每个提供商的后台需配置正确的回调URL:例如Google需配置
http://localhost:8080/oauth2/code/google,Facebook对应http://localhost:8080/oauth2/code/facebook(生产环境需替换为实际域名)。 - 确保每个OIDC客户端的
scopes配置正确,需包含openid(OIDC核心要求),以及你需要的用户信息字段(如email、profile)。 - 若需自定义认证成功后的跳转路径,可通过
quarkus.oidc.[客户端名称].redirect-path配置。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

