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。
检查以下信息:
- 跳转到 Bitbucket 时使用的
client_id是否对应当前 Consumer 的 Key。 - 授权请求是否包含
redirect_uri;如有,将其 URL 解码后核对。 - Bitbucket 授权响应中的
Location指向哪里。 - 第一个返回 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。
备注:内容仅供参考。
