Wildfly 37通过Elytron-OIDC对接WSO2的改造与疑问
Wildfly 37 Elytron OIDC Client对接WSO2身份认证的问题与改造验证
我正在配置Wildfly 37独立实例,通过elytron-oidc-client子系统实现Web应用对接WSO2身份认证。目前已成功实现,但不得不修改Wildfly模块源码,对此存在疑虑。已知Wildfly+OIDC仍在开发阶段,且仅针对Keycloak做过测试,想了解当前改造是否具备可行性,或者是否有其他替代方案。
初始可行配置步骤
- 确认已启用
org.wildfly.extension.elytron-oidc-client扩展及urn:wildfly:elytron-oidc-client:2.0子系统(默认已存在); - 修改
web.xml,声明security-constraint,并将login-config的auth-method设为OIDC; - 在WEB-INF目录添加
oidc.json文件,配置正确的client-id,且provider-url指向WSO2的OIDC发现端点(https://.../oauth2/oidcdiscovery/)。
问题排查与改造点
访问受保护资源时,重定向登录页正常,但登录后返回Wildfly时出现403禁止响应。通过反编译Wildfly代码排查,需解决四个令牌验证相关问题(修改了wildfly-elytron-http-oidc-2.6.4.Final.jar中的TokenValidator类):
- 问题0:
parseAndVerifyToken方法吞噬异常,仅在TRACE级别日志输出简略信息,需将catch块的tracef改为warn以打印详细异常; - 问题1:Elytron OIDC模块要求IdP使用2048位密钥,而目标WSO2使用1024位,调用
setRelaxVerificationKeyValidation()可放宽验证,建议增加配置开关; - 问题2:模块假设ID Token和Access Token均为JWT,但WSO2默认返回opaque类型Access Token,需在WSO2中设置改为JWT类型;
- 问题3:模块期望JWT包含
Roles声明,但WSO2返回Groups声明,需在验证后将Groups映射为Roles,建议支持声明名称映射配置。
修改后的TokenValidator.java关键代码
public VerifiedTokens parseAndVerifyToken(String idToken, String accessToken, OidcHttpFacade.Cookie cookie, boolean isValidateNonce) throws OidcException { try { JwtContext idJwtContext = setVerificationKey(idToken, this.jwtConsumerBuilder); this.jwtConsumerBuilder.setExpectedAudience(new String[]{this.clientConfiguration.getResourceName()}); this.jwtConsumerBuilder.registerValidator(new AzpValidator(this.clientConfiguration.getResourceName())); this.jwtConsumerBuilder.registerValidator(new AtHashValidator(accessToken, this.clientConfiguration.getTokenSignatureAlgorithm())); if (isValidateNonce) { this.jwtConsumerBuilder.registerValidator(new NonceValidator(cookie)); } /* -> */ // Allow 1024 bits keys /* -> */ ElytronMessages.log.tracef("Relaxing key validation..."); /* -> */ this.jwtConsumerBuilder.setRelaxVerificationKeyValidation(); this.jwtConsumerBuilder.build().processContext(idJwtContext); JwtClaims idJwtClaims = idJwtContext.getJwtClaims(); if (idJwtClaims == null) { throw ElytronMessages.log.invalidIDTokenClaims(); } JwtClaims jwtClaims = (new JwtConsumerBuilder()).setSkipSignatureVerification().setSkipAllValidators().build().processToClaims(accessToken); /* -> */ // Add a new claim "roles" with the contents of the "groups" claim /* -> */ ElytronMessages.log.tracef("Mapping groups to roles..."); /* -> */ jwtClaims.setClaim("roles", jwtClaims.getClaimValue("groups")); return new VerifiedTokens(new IDToken(idJwtClaims), new AccessToken(jwtClaims)); } catch (InvalidJwtException e) { /* -> */ // Print exception stacktrace to log //ElytronMessages.log.tracef("Problem parsing ID token: " + idToken, e); ElytronMessages.log.warn("Problem parsing ID token: " + idToken, e); throw ElytronMessages.log.invalidIDToken(e); } }
核心疑问
- 是否遗漏了其他配置?
- 是否有人用OIDC子系统对接过Keycloak外的IdP?
- Wildfly 3x是否有其他OIDC集成方案?
内容的提问来源于stack exchange,提问作者Sergio Pio Alvarez
相关产品推荐
相关产品推荐

