如何通过Keycloak API登录系统并获取含更新数据的有效令牌?
首先明确:存在符合你需求的请求,分两种场景处理:
场景1:应用自身提供登录API
如果你的系统(应用)有独立的登录接口,直接调用这个接口即可。这类接口通常会在内部完成与Keycloak的交互,同时执行令牌更新/增强逻辑(比如添加自定义业务数据到令牌),最终返回包含新数据的有效access-token。
请求参数一般就是用户名和密码,具体格式需参考你应用的接口文档。
场景2:直接使用Keycloak的登录流程API
你提到的/realms/{realm}/login-actions/authenticate是Keycloak处理表单登录的后端接口,适合模拟浏览器端的用户登录流程,能触发Keycloak内的完整认证逻辑(包括可能的令牌数据更新)。但这个请求属于Keycloak浏览器认证流的一部分,需要先完成前置步骤:
前置步骤
先发送GET请求到Keycloak的授权端点,获取会话相关参数和Cookie:
GET /realms/{realm}/protocol/openid-connect/auth?client_id={your_client_id}&redirect_uri={your_redirect_uri}&response_type=code
从响应中提取以下内容:
- Cookie中的
KEYCLOAK_SESSION和KEYCLOAK_SESSION_LEGACY(后续请求需携带) - 响应HTML表单中的
session_code、tab_id、credentialId(密码认证对应的凭证ID)
authenticate请求的Payload(form-data格式)
POST请求到/realms/{realm}/login-actions/authenticate,需携带上述Cookie,Payload包含以下必填参数:
username: 目标用户的用户名password: 目标用户的密码credentialId: 从前置步骤的表单中提取的凭证IDclient_id: 你的应用在Keycloak注册的客户端IDsession_code: 从前置步骤提取的会话codetab_id: 从前置步骤提取的会话tab IDauthenticationFlow: 认证流ID,默认填browser即可
更适合自动化测试的替代方案
如果你的Keycloak开启了Resource Owner Password Credentials Flow(ROPC流),推荐直接调用token端点获取令牌,流程更简单,无需处理会话Cookie:
POST /realms/{realm}/protocol/openid-connect/token Content-Type: application/x-www-form-urlencoded grant_type=password &username={your_username} &password={your_password} &client_id={your_client_id} &client_secret={your_client_secret} # 仅当客户端为保密类型时需要
如果这个令牌缺少应用所需的新数据,说明你的应用在用户登录时会执行额外的令牌增强逻辑(比如更新Keycloak用户属性后刷新令牌),此时你需要在拿到初始token后,调用应用的相关接口完成数据更新,再通过Keycloak的refresh_token端点获取更新后的令牌。
内容的提问来源于stack exchange,提问作者klch_o

