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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:32:27