初步说明——此流程仍处于早期开发阶段,以下细节可能会
发生变化。
先决条件
- 回调 allowlist。 你使用的每个
callback_url都必须在 Devin 为你的集成配置的 allowlist 中。此项由 Cognition 配置——请提前将准确的 URL 发给我们。不在列表中的 URL 会被拒绝。 - 已启用 Outposts。 客户的账户必须已启用 Outposts。
- Admin 授权。 授权连接需要一位同时拥有 enterprise-settings 和 service-user management 权限的 Devin Admin。合作伙伴无需 Devin 令牌——由管理员在其自己的浏览器会话中完成授权。
流程概览
1. 生成 PKCE verifier 和 challenge
- 生成一个高熵的随机
code_verifier:从未保留字符集[A-Za-z0-9-._~]中选取 43–128 个字符 (例如去除填充后的base64url(random 32 bytes)) 。 - 对 verifier 进行 SHA-256 哈希,再将结果编码为不带填充的 base64url,得到
code_challenge(PKCE “S256”) :
code_verifier 存储在服务器端 (用你用于关联最终回调的 state 作为键) 。绝不要将 verifier 发送到浏览器——只有 challenge 可以离开你的后端。
2. 将 Admin 重定向到连接页面
如果 Admin 尚未登录,连接页面会先暂存这些参数,并提示其先登录,然后再继续流程。
3. Admin 确认
outpost_image,也会显示) 。当 Admin 点击 Connect 时,Devin 会验证权限、回调 allowlist 以及 outpost 名称是否可用,存储一个加密的一次性代码 (TTL 为 10 分钟) ,并将你重定向回你的 app,同时附带该一次性代码。
目前还不存在 outpost 或服务用户——只有在兑换该代码时 (步骤 5) 才会创建它们。未兑换的代码会直接过期。
4. Devin 将该代码重定向到你的回调地址
callback_url,并附带该代码:
5. 通过服务端到服务端方式兑换授权码
code_verifier,然后在令牌端点兑换该授权码。这是一个采用表单编码、符合 OAuth 风格的令牌请求:
6. 接收凭据
Cache-Control: no-store——请勿缓存。
7. 运行 outpost 工作器
access_token 和 api_base_url,并将该令牌作为 Bearer 凭据,为该 outpost 运行 outpost 工作器。
错误处理
400:
invalid_grant 都应视为不可恢复的错误:丢弃已存储的 code_verifier,并从步骤 1 重新开始该流程。
安全说明
- 令牌绝不会经过浏览器。 只有一次性代码会通过重定向传递;服务用户令牌仅会通过服务端到服务端的交换返回。
- PKCE 会将代码绑定到你。 没有仅保存在你的后端中的
code_verifier,该代码就毫无用处,因此即使拦截了重定向 (或代码) ,也无法用它完成兑换。 - 代码是一次性的,且有效期很短。 兑换时会以原子方式消耗该代码;此外,它会在 10 分钟后过期。
- 回调 URL 已加入 allowlist。 Devin 只会将代码传递到 Cognition 已为你的集成预先批准的
callback_url。 - 验证该代码是否属于请求连接的用户。 确认返回到你的回调中的代码属于最初请求建立连接的同一用户。这可以防止攻击者诱使用户在毫不知情的情况下将 Devin 绑定到攻击者控制的沙盒。
- 请合理设置
outpost_name。 Admin 可能会覆盖它;你传入的名称只是一项建议。

