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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 23:13:14