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

Quarkus OIDC集成Google一键登录:JsonWebToken与SecurityIdentity异常

解决Quarkus OIDC与Google One Tap登录集成问题

问题根源

Quarkus OIDC默认采用授权码流程,需要由Quarkus主动发起认证请求并生成state等控制参数,再接收Google返回的授权码完成认证。但Google One Tap是前端直接向Google获取ID Token后,将其POST到后端,该请求缺少Quarkus OIDC预期的授权码、state等参数,因此OIDC机制不会触发认证流程,导致JsonWebToken为NullJsonWebToken、SecurityIdentity为匿名身份。

解决方案:手动验证Google ID Token

既然One Tap返回的是ID Token而非授权码,我们需要跳过Quarkus默认的授权码流程,手动验证该ID Token并完成身份认证。

1. 调整后端代码,手动验证ID Token

注入Quarkus提供的OidcTokenValidator,获取前端传来的credential参数(Google One Tap返回的ID Token会放在该字段中),然后验证Token的有效性:

@Path("/session")
public class SessionController {

    @Inject
    OidcTokenValidator tokenValidator;

    @POST
    @Path("/oauth/google")
    @Produces("text/html")
    public String processGoogleCredentials(@FormParam("credential") String idToken) {
        try {
            // 验证Google ID Token的签名、issuer、audience等
            OidcTokenValidationResult validationResult = tokenValidator.validateToken(idToken, OidcTokenType.ID_TOKEN);
            JsonWebToken validJwt = validationResult.getToken();

            // 获取用户信息(示例:邮箱、用户名)
            String userEmail = validJwt.getClaim("email");
            String userName = validJwt.getClaim("name");

            // 这里可以根据业务需求生成会话、返回前端跳转指令等
            return String.format("登录成功!用户:%s(邮箱:%s)", userName, userEmail);
        } catch (OidcValidationException e) {
            return "Token验证失败:" + e.getMessage();
        }
    }
}

2. 修正OIDC配置

确保application.properties中的OIDC配置正确指向Google的认证端点,保证Token验证时能获取到正确的公钥和元数据:

quarkus.oidc.provider=google
quarkus.oidc.client-id=xxx.apps.googleusercontent.com
quarkus.oidc.credentials.secret=xxx
# 显式指定Google的issuer,确保Token验证时的issuer匹配
quarkus.oidc.issuer=https://accounts.google.com

3. 检查前端请求地址

确认前端data-login_uri指向后端的正确端点,若前端与后端端口不同(如前端5173、后端8080),需修改为后端地址:

<div class="ui signin">
  <div id="g_id_onload"
       data-client_id="xxx.apps.googleusercontent.com"
       data-login_uri="http://localhost:8080/api/session/oauth/google"
       data-auto_prompt="true">
  </div>
</div>

额外说明

如果需要将验证后的身份整合到Quarkus的SecurityIdentity中,可通过SecurityIdentityAugmentor扩展或手动构建SecurityIdentity实例,实现后续接口的身份校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:43:33