📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 7.x-8.x

1. 错误异常的基本描述 #

Failed to exchange code for Id Token. Code=[...]; Description=[...] 表示 Elasticsearch 已经调用了 OpenID Connect 提供方的 Token Endpoint,但提供方返回了标准 OAuth2 错误响应。

常见现象 #

  • 浏览器完成回调后登录失败。
  • Elasticsearch 日志中除了主异常外,还会带出 IdP 返回的错误码和描述。
  • 常见返回包括 invalid_grantinvalid_clientunauthorized_clientinvalid_request

2. 为什么会发生这个错误 #

从日志上下文看,Elasticsearch 能成功解析 Token Endpoint 的错误响应,并把 codedescription 原样写入异常消息。这说明失败点不在本地解析,而在 IdP 明确拒绝了本次授权码交换。

常见原因包括:

  • 授权码已过期、已被使用,或回调中的 code 与当前会话不匹配。
  • client_idclient_secretredirect_uri 与 IdP 注册配置不一致。
  • IdP 不允许当前客户端以授权码流程换取 ID Token。

3. 如何排查和解决这个异常和解决这个异常 #

  1. 先查看异常里的 CodeDescription,这是最直接的根因线索。
  2. 核对 realm 配置中的 rp.client_id、客户端认证方式和 redirect_uri
  3. 检查 IdP 侧应用注册,确认授权码流程与当前回调地址已启用。
  4. 如果错误是 invalid_grant,重点排查授权码是否重复使用或过期。

4. 如何解决这个错误 #

常用修复思路 #

  • 修正客户端凭据、回调地址和授权范围配置。
  • 确保浏览器回调落在与发起登录同一会话上下文中。
  • 缩短代理链路和人为跳转,避免授权码过期或被篡改。

5. 小结 #

这个异常已经把 IdP 的拒绝原因暴露出来,排查时应优先根据 CodeDescription 精确修复,而不是泛化为“网络故障”。

相关错误 #

附:日志上下文 #

if (tokenSuccessResponse.indicatesSuccess() == false) {
    final TokenErrorResponse errorResponse = TokenErrorResponse.parse(tokenHttpResponse);
    tokensListener.onFailure(new ElasticsearchSecurityException(
        "Failed to exchange code for Id Token. Code=[{}]; Description=[{}]",
        errorResponse.getErrorObject().getCode(),
        errorResponse.getErrorObject().getDescription()
    ));
}