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)
错误分析
- invalid_user_credentials:提示用户凭证无效,可能是请求中使用的密码未更新为修改后的新密码,或用户账号被锁定、禁用。
- 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
相关产品推荐
相关产品推荐

