
Databricks OAuth2: token refresh is hardcoded to 401, cannot handle 403
快速结论:该报错发生于 n8n 中 Databricks OAuth2 凭证的 token 刷新逻辑被硬编码为仅处理 401 状态码,当 Databricks(或其前置代理)返回 403 时,n8n 不会触发 token 刷新,导致请求失败。优先排查你是否在 Databricks 节点前使用了会重写 401→403 的代理或网关,或者 Databricks 端点本身返回了 403。
问题场景
该问题出现在使用 n8n 的 Databricks 节点时,节点通过 databricksOAuth2Api 凭证(继承自 oAuth2Api,使用 client_credentials 授权类型)调用 Databricks API。当访问令牌过期且 Databricks 返回 403 状态码(而非默认的 401)时,n8n 无法自动刷新 token,导致操作失败并返回错误。
报错原文
HTTP request failed with status 403 (Forbidden) — token refresh not triggered because 403 ≠ 401
(注意:实际报错信息可能因节点和端点不同而略有差异,但核心表现是 403 错误不会被自动处理为 token 过期。)
原因分析
可能原因:n8n 的 Databricks OAuth2 凭证在继承基础 oAuth2Api 凭证时,丢失了 tokenExpiredStatusCode 字段。在 oAuth2Api 中,该字段被标记为 doNotInherit: true,导致 DatabricksOAuth2Api 无法继承它。同时,DatabricksOAuth2Api 也没有重新声明该字段,因此 n8n 在运行时始终使用默认值 401。当 Databricks 返回 403 时,状态码比较逻辑会跳过 token 刷新,错误直接冒泡到用户。
环境排查
- n8n 版本:master 分支(commit
345ce7f0dc) - 触发节点:
nodes-base/Databricks - 凭证类型:
databricksOAuth2Api(继承自oAuth2Api,grantType: clientCredentials) - 相关代码路径:
packages/nodes-base/credentials/DatabricksOAuth2Api.credentials.ts、packages/nodes-base/credentials/OAuth2Api.credentials.ts、packages/core/src/execution-engine/node-execution-context/utils/request-helper-functions.ts - 基础凭证字段定义:
tokenExpiredStatusCode在OAuth2Api.credentials.ts:197-205被标记doNotInherit: true - 属性合并逻辑跳过位置:
packages/workflow/src/node-helpers.ts:1688(if (property.doNotInherit) continue;)
解决步骤
- 优先尝试建议一(推荐):在
DatabricksOAuth2Api.credentials.ts中重新声明tokenExpiredStatusCode为隐藏字段(hidden),默认值为401。这样该字段会出现在解密后的凭证对象上,允许用户通过编辑凭证来更改该值(例如改为 403 以匹配你的环境)。{ displayName: 'Token Expired Status Code', name: 'tokenExpiredStatusCode', type: 'hidden', default: 401, } - 如果建议一不可行,尝试建议二:在每个 Databricks 操作调用
httpRequestWithAuthentication时,传入第 4 个参数{ oauth2: { tokenExpiredStatusCode: <code> } }。这需要修改所有 Databricks 节点操作的调用点,较为繁琐。 - 建议三(影响范围较大,谨慎尝试):从基础
oAuth2Api凭证中移除tokenExpiredStatusCode字段的doNotInherit: true标记。这会将该字段暴露给所有继承oAuth2Api的凭证,需要全面检查其他凭证的兼容性,不推荐轻易实施。
验证方法
选择一个已知会返回 403 的 Databricks 端点(或通过代理/模拟返回 403),使用更新后的凭证运行 Databricks 节点操作。确认请求在第一次返回 403 后被自动重试(token 被刷新),并且操作成功完成。如果返回 403 且节点报错“token not refreshed”,则说明修复未生效。



