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

