2. REST API基础与认证机制

Atlassian Cloud 的 REST API 是集成开发的主入口。无论是同步 Jira Issue、读取 Confluence 页面,还是触发 Bitbucket Pipeline,最终都要落到一次 HTTP 请求上。理解它的设计风格与认证机制,决定了集成方案能否稳定、安全地长期运行。

一、Atlassian Cloud REST API 的设计风格

Atlassian Cloud 的 REST API 遵循 REST 架构约束,整体呈现几个鲜明特征:

  • 资源化 URL:URL 表达资源层级,例如 /rest/api/3/issue/{issueIdOrKey} 表示 Jira 平台 v3 版本下的单个 Issue 资源。
  • 版本化路径:Jira 使用 /rest/api/3(新版)与 /rest/api/2(旧版),Confluence Cloud 使用 /wiki/rest/api,Bitbucket Cloud 使用 /2.0。版本号是 URL 的一部分,升级时需评估兼容性。
  • 标准 HTTP 方法:GET 读取、POST 创建、PUT 全量更新、DELETE 删除,语义与 HTTP 规范一致。
  • JSON 载荷:请求与响应体均为 JSON,Content-Type 通常为 application/json。
  • 分页与限流:列表接口普遍使用 startAt、maxResults、total 字段分页;响应头中的 X-RateLimit-* 系列字段用于限流判断。

一个典型的 Jira Issue 查询请求如下:

GET /rest/api/3/issue/PROJ-123?fields=summary,status,assignee
Host: your-domain.atlassian.net
Accept: application/json
Authorization: Basic <base64(email:api_token)>

响应体是 JSON,包含 id、key、fields 等字段。理解这种“URL 定位资源 + 方法表达动作 + JSON 承载数据”的模式,是后续所有集成工作的基础。

二、三种认证机制的适用场景

Atlassian Cloud 主要提供三种认证方式,它们并非互相替代,而是面向不同使用场景。

认证方式 典型场景 凭据形态 安全等级
Basic Auth(邮箱 + API Token) 脚本、CLI、个人自动化、内部工具 Base64(email:token) 中,凭据长期有效
OAuth 2.0(3LO) 面向多租户的第三方应用、SaaS 集成 Access Token + Refresh Token 高,支持细粒度授权与撤销
OAuth 2.0(2LO / 服务账号) 企业级后台服务、无用户交互的自动化 Client Credentials 高,权限由管理员授予

Basic Auth + API Token 是最容易上手的方式。API Token 在 Atlassian 账户安全设置中生成,与邮箱组合后做 Base64 编码,放入 Authorization 头。它适合个人脚本或内部工具,但 Token 一旦泄露,攻击者即可在有效期内以该用户身份操作,因此必须配合最小权限账户与定期轮换。

OAuth 2.0 3LO 是面向第三方应用的标准方案。用户授权后,应用获得 Access Token(通常 1 小时有效)和 Refresh Token(长期有效,可撤销)。它的优势在于:权限范围(scope)可精确控制,用户可随时撤销授权,且不暴露用户密码或长期凭据。适合需要分发给多个客户使用的集成产品。

OAuth 2.0 2LO 适用于企业内部的机器对机器场景。管理员在 Atlassian 管理后台为应用授予权限,应用使用 Client Credentials 直接换取 Access Token,无需用户交互。它适合后台同步服务、定时任务等场景。

三、安全配置的关键实践

无论选择哪种认证方式,以下实践都应当遵守:

  • 凭据不入代码库:API Token、Client Secret 应通过环境变量或密钥管理服务注入,禁止硬编码在源码或配置文件中。
  • 最小权限原则:为集成创建专用账户,只授予必要的项目权限与 scope,避免使用管理员账户。
  • Token 轮换与撤销:API Token 应定期更换;OAuth Refresh Token 在检测到异常时应立即撤销。
  • 传输安全:所有请求必须走 HTTPS,禁止降级到 HTTP。
  • 限流与重试:遇到 429 响应时,读取 Retry-After 头并做指数退避,避免触发更严格的限流。
API Token 等同于账户密码,切勿通过邮件、聊天工具或工单系统明文传递。若怀疑泄露,应立即在 Atlassian 账户设置中撤销并重新生成。

四、认证流程与请求链路

下图展示了三种认证方式在请求链路中的差异,以及它们与 Atlassian Cloud API 网关的交互关系。理解这张图,有助于在实际集成中快速判断该用哪种认证、凭据放在哪里、失败时从哪里排查。

Atlassian Cloud REST API 认证链路 客户端 / 集成方 脚本 / CLI Basic Auth 第三方应用 OAuth 2.0 3LO 后台服务 OAuth 2.0 2LO 凭据形态 Base64(email:token) 长期有效 Access + Refresh 1h / 可撤销 Client Credentials 管理员授权 认证端点 直接携带 Authorization /oauth/token 授权码换令牌 /oauth/token client_credentials API 网关 校验凭据 检查 scope 限流控制 路由到服务 失败排查顺序:凭据是否正确 → Token 是否过期 → scope 是否覆盖 → 是否触发限流(429)

从图中可以看到,三种认证方式最终都汇聚到 API 网关进行统一校验。区别在于凭据的获取方式、有效期和权限粒度。Basic Auth 的凭据直接携带在请求头中,OAuth 2.0 则需要先通过 /oauth/token 端点换取 Access Token,再携带该 Token 访问资源接口。

五、实操示例:用 API Token 调用 Jira Issue 接口

以下示例展示如何用 curl 和 API Token 查询一个 Jira Issue。假设邮箱为 dev@example.com,API Token 为 ATATT3xFfGF0...(示例值,非真实 Token)。

# 1. 生成 Base64 凭据
echo -n "dev@example.com:ATATT3xFfGF0..." | base64
# 输出示例:ZGV2QGV4YW1wbGUuY29tOkFUQVRUM3hGZkdGMC4uLg==

# 2. 发起请求
curl -s -X GET \
  "https://your-domain.atlassian.net/rest/api/3/issue/PROJ-123?fields=summary,status" \
  -H "Authorization: Basic ZGV2QGV4YW1wbGUuY29tOkFUQVRUM3hGZkdGMC4uLg==" \
  -H "Accept: application/json"

若返回 200 且响应体包含 key、fields.summary、fields.status.name,说明认证与权限均正常。若返回 401,检查邮箱与 Token 是否匹配、Token 是否已撤销;若返回 403,检查该账户是否有权访问该项目;若返回 429,读取 Retry-After 头并等待后重试。

在生产集成中,建议将 Base64 凭据的生成与请求发送封装为独立函数,并在日志中只记录请求 URL 与状态码,绝不记录 Authorization 头,避免凭据泄露到日志系统。