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

Keycloak客户端认证报错:getAuthenticationSession()返回null引发空指针

Keycloak密码授权模式获取令牌失败问题排查与解决

问题现象

使用密码授权模式从Keycloak服务器获取令牌,修改用户密码及认证流程后出现两类错误:

  • 登录凭证无效警告
  • 客户端认证时触发NullPointerException异常

已尝试重启Keycloak服务器、修改授权方式,问题未解决。

错误日志

2023-11-21 16:43:52,510 WARN  [org.keycloak.events] (executor-thread-37) type=LOGIN_ERROR, realmId=7ffc23bd-250e-429e-8026-14cff8c6bdef, clientId=Print_login_protect, userId=null, ipAddress=172.20.67.92, error=invalid_user_credentials, auth_method=openid-connect, auth_type=code, response_type=code, redirect_uri=http://localhost:9000/home, code_id=40bf3e47-17b9-44f4-837b-508490fd71c9, response_mode=query
2023-11-21 16:45:41,979 ERROR [org.keycloak.services] (executor-thread-36) KC-SERVICES0015: Unexpected error when authenticating client: java.lang.NullPointerException: Cannot invoke "org.keycloak.sessions.AuthenticationSessionModel.getExecutionStatus()" because the return value of "org.keycloak.authentication.AuthenticationProcessor.getAuthenticationSession()" is null
at org.keycloak.authentication.DefaultAuthenticationFlow.isProcessed(DefaultAuthenticationFlow.java:68)
at org.keycloak.authentication.DefaultAuthenticationFlow.isProcessed(DefaultAuthenticationFlow.java:63)
at org.keycloak.authentication.DefaultAuthenticationFlow.processSingleFlowExecutionModel(DefaultAuthenticationFlow.java:373)
at org.keycloak.authentication.DefaultAuthenticationFlow.processFlow(DefaultAuthenticationFlow.java:249)
at org.keycloak.authentication.AuthenticationProcessor.authenticateClient(AuthenticationProcessor.java:897)
at org.keycloak.protocol.oidc.utils.AuthorizeClientUtil.authorizeClient(AuthorizeClientUtil.java:50)
at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.checkClient(TokenEndpoint.java:269)
at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.processGrantRequestInternal(TokenEndpoint.java:217)
at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.processGrantRequest(TokenEndpoint.java:190)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:154)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:118)
at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:560)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:452)
at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:413)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:415)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:378)
at org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:174)
at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:142)
at org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:168)
at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:131)
at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:33)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:429)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:240)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:154)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:157)

错误分析

  1. invalid_user_credentials:提示用户凭证无效,可能是请求中使用的密码未更新为修改后的新密码,或用户账号被锁定、禁用。
  2. NullPointerException:核心原因是认证会话(AuthenticationSessionModel)为null,说明修改认证流程时破坏了客户端认证的必要步骤,导致Keycloak无法正常创建认证会话。

解决方案

1. 验证用户凭证与状态

  • 确认令牌请求中携带的用户名、密码为修改后的正确值;
  • 登录Keycloak控制台,检查对应用户是否处于「启用」状态,未被锁定。

2. 检查并修复认证流程配置

  • 进入对应Realm的「Authentication」->「Flows」页面;
  • 查看「Direct Grant」流程(密码授权模式依赖此流程),确保流程包含「Username Password Form」等必要执行节点,且节点状态为「Required」;
  • 查看「Client Authentication」流程,确认包含「Client Authenticator」等核心节点,若自定义流程导致异常,直接点击流程右侧的「Actions」->「Restore Default」恢复默认配置。

3. 检查客户端配置

  • 找到客户端「Print_login_protect」,确认「Direct Grants Enabled」选项已开启;
  • 若客户端为「confidential」类型,确认请求令牌时已携带正确的client_id和client_secret;
  • 检查客户端的「Valid Redirect URIs」等配置是否符合当前请求场景。

4. 清除Keycloak缓存

  • 在Realm设置页面进入「Cache」选项,手动清除缓存,避免旧配置残留影响认证流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:03:11