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

如何在Java中访问由Keycloak保护的Jakarta EE REST应用?

问题解决:使用Keycloak令牌访问Wildfly上的Jakarta EE REST API

问题背景

运行在Wildfly上的Jakarta EE Web应用,通过Elytron默认OIDC集成Keycloak做身份保护,浏览器访问正常(会重定向到Keycloak登录,登录后可访问资源),但通过password授权类型获取Access Token后,用Authorization: Bearer <token>请求REST API时,被302重定向到Keycloak登录页。

核心原因

Wildfly Elytron的默认OIDC配置会把所有请求按浏览器场景处理,优先尝试Session Cookie认证,当检测不到有效会话时就触发重定向。而REST API场景需要明确指定用Bearer Token认证,需调整配置区分浏览器请求和API请求。

解决步骤

1. 确认Keycloak客户端配置

  • 确保目标客户端(my-clientid)开启Direct Access Grants Enabled(支持password授权类型)
  • 客户端Access Type设置为confidential(因为使用了client_secret)

2. 调整Wildfly Elytron OIDC配置

修改Wildfly的standalone.xml/domain.xml,通过路径匹配为API端点指定专属认证方式:

<subsystem xmlns="urn:wildfly:elytron-oidc-client:1.0">
    <oidc-client name="keycloak-oidc" 
                 provider-url="https://sso.my-keycloakserver.foo.com/realms/my-application-realm"
                 client-id="my-clientid" 
                 client-secret="MY-SECRET">
        <secure-deployment name="my-application.war">
            <resource server-id="my-clientid"/>
            <!-- 定义支持的认证方式 -->
            <auth-methods>
                <auth-method method="BEARER"/>
                <auth-method method="REDIRECT"/>
            </auth-methods>
            <!-- 为不同路径指定认证方式 -->
            <paths>
                <path name="/api/*" auth-method="BEARER"/>
                <path name="/*" auth-method="REDIRECT"/>
            </paths>
        </secure-deployment>
    </oidc-client>
</subsystem>

关键是<paths>节点:将/api/*路径强制使用BEARER认证,其他路径保留REDIRECT适配浏览器场景。

3. 验证Token有效性

如果调整配置后仍有问题,先确认Token是否有效:

curl -d 'token=eyJhbGciOiJ..................' -d 'client_id=my-clientid' -d 'client_secret=MY-SECRET' \
'https://sso.my-keycloakserver.foo.com/realms/my-application-realm/protocol/openid-connect/token/introspect'

返回结果中"active":true表示Token有效。

4. 代码层面适配

如果REST端点使用@RolesAllowed等权限注解,需确保Keycloak客户端已配置角色映射,Token中包含对应角色信息。

关于OIDC流程的说明

你使用的password授权类型属于OIDC规范中的资源所有者密码凭证授权,适合信任度高的后端服务调用;如果是外部服务调用,更推荐使用客户端凭证授权(无需用户密码,用客户端自身凭证获取Token):

curl -d 'client_id=my-clientid' -d 'client_secret=MY-SECRET' \
-d 'grant_type=client_credentials' \
'https://sso.my-keycloakserver.foo.com/realms/my-application-realm/protocol/openid-connect/token'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:12:37