PAYATHON 2026

Azure DevOps 集成 Bitbucket OAuth 时回调返回 404,如何排查?

数据阿明

结论

先排查 OAuth 回调地址和授权上下文,再处理流水线中的仓库配置。错误发生在创建 service connection 的授权阶段,此时 ci pipeline.yml 尚未执行,修改 YAML 无法直接修复这次回调 404。

当前材料不足以确定唯一根因。应优先核对配置中的 https://app.vssps.visualstudio.com/oauth/callback,但不能仅凭地址外观断言它有效,也不要未经确认就把路径改成猜测的值。

为什么要先检查回调链路?

现有步骤是在 Bitbucket 创建 OAuth Consumer,将凭据添加到 ADO 的 OAuth configuration,再创建 Bitbucket Cloud service connection。报错发生在授权后返回 ADO 的阶段。

Bitbucket 的 Callback URL 用来接收授权后的跳转。授权请求可以携带回调地址;如果没有携带,Bitbucket 会使用 Consumer 中配置的地址。具体匹配规则见 Bitbucket OAuth 文档。

需要区分以下情况:

  • Bitbucket 授权请求本身失败。
  • Bitbucket 成功返回,但目标回调地址返回 404。
  • 回调处理完成后,又跳转到了无权访问或不存在的组织、项目页面。

仅凭最后看到的 404 页面,还无法区分这几种情况。

1. 找到第一个返回 404 的请求

打开浏览器开发者工具,在 Network 面板启用 Preserve log,然后从 service connection 页面重新点击 Authorize。

检查以下信息:

  1. 跳转到 Bitbucket 时使用的 client_id 是否对应当前 Consumer 的 Key。
  2. 授权请求是否包含 redirect_uri;如有,将其 URL 解码后核对。
  3. Bitbucket 授权响应中的 Location 指向哪里。
  4. 第一个返回 404 的请求使用的域名和路径。

如果授权请求没有包含 redirect_uri,重点核对 Consumer 中保存的 Callback URL。若 ADO 当前配置界面提供回调地址,应以该集成实际要求的地址为准,并与请求链路交叉核对。

不要通过手工访问不带授权参数的 Callback URL 来判断整个 OAuth 流程是否正常。回调处理还可能依赖授权返回的参数和浏览器会话。

2. 核对 Consumer 与 ADO 配置是否对应

在 Bitbucket 和 ADO 两侧逐项检查:

  • ADO OAuth configuration 使用的 client ID 和 secret 来自同一个 Consumer。
  • 创建 service connection 时选中了刚才核对的 OAuth configuration。
  • 连接类型为 Bitbucket Cloud。
  • 当前 Bitbucket 授权账号可以访问目标 workspace 和仓库。
  • 当前浏览器已登录目标 ADO 组织,且有创建或管理该 service connection 的权限。

修改配置后,从 ADO 页面重新发起授权,不要复用旧回调链接。如果怀疑多个账号的登录会话相互影响,可以在新的浏览器会话中登录所需账号后重试。

这些检查有助于缩小范围,但不能据此认定 secret 错误或账号权限不足一定会表现为 404。

3. 授权成功后,修正仓库资源配置

原始片段中的 type、endpoint 和 name 没有缩进到同一个仓库条目下。此外,Bitbucket 仓库的 name 应包含 workspace 和 repository,而不是只填写仓库显示名称。Azure Pipelines 的资源文档要求 Bitbucket Cloud 仓库通过相应的 service connection 授权,格式示例见 仓库资源说明。

可以按以下结构配置:

resources:
  repositories:
    - repository: templates
      type: bitbucket
      endpoint: 'Test-service-connection'
      name: 'your-workspace/your-repository'
      ref: refs/heads/main

steps:
  - template: templates/build.yml@templates

其中的 workspace、repository、分支和模板路径都是示例,需要替换成真实值:

  • endpoint 对应当前项目中已经授权成功的 service connection 名称。
  • ref 必须指向存在的分支或标签;示例假设存在 main 分支。
  • templates/build.yml 必须存在于所选版本中。
  • 示例使用 steps 引用,因此模板应提供适用于该位置的步骤内容。

@templates 引用的是 repository: templates 定义的别名。跨仓库模板通过仓库资源解析,不能依靠流水线运行时执行 git clone 来补救更早发生的模板解析错误。参见 Azure Pipelines 模板说明。

还需要允许该流水线使用 service connection。连接授权成功和流水线获准使用连接是两个检查点。

4. OAuth 暂时无法修复时的替代方式

如果当前 ADO 界面提供 Email and API Token,可以使用 Atlassian 账号邮箱和具备所需权限的 Bitbucket API token 创建连接,再执行 Verify 或 Authorize。具体权限要求以 Bitbucket Cloud service connection 文档 为准。

这种方式可以绕开浏览器 OAuth 回调,但仍需验证仓库权限和流水线使用权限。Bitbucket OAuth Consumer 的 secret 不能直接当作 Bitbucket API token 使用。

若回调仍返回 404,应保留发生时间、失败请求的域名和路径、HTTP 状态码,以及响应中可用的请求标识,供管理员或支持人员继续定位。分享记录前,移除授权码、token、secret 和 Cookie。

备注:内容仅供参考。