client_id/client_secret 只保存在服务端,不发送给浏览器或 Agent。
Clink 为 MCP 登录和 定制 Agent Portal 只读 API 使用同一个预注册平台 client;两种 token 不同,但 client 身份相同。
工作方式
前置条件
请 Clink 在目标环境预先注册平台 client,并确认:- 平台
client_id和client_secret; - 首次授权使用的精确 OAuth
redirect_uri; - 平台后端支持 PKCE S256;
- 环境 MCP resource,例如
https://uat-api.clinkbill.com/mcp; - 平台自己已经验证过的用户邮箱。
1. 获取平台 client token
token_use=client,audience 为 clink-agent-platform-api,scope 为 agent-platform:account。在 expires_in 到期前缓存,不要发给 Agent 或浏览器。
2. 创建或恢复 MCP 会话
{ code, msg, data } envelope;读取 data.status:
authorized
customer_created=true 表示 Clink 用已验证邮箱创建了新客户。首次登录会返回 refresh token;复用已有会话时默认只返回 access token,除非请求 issue_refresh: true。
authorization_required
email 预填 Portal 登录页,但用户仍需完成邮箱 OTP 验证。平台服务端保存 state 和 PKCE code_verifier,直到回调完成。
3. 连接 Agent 到 MCP
使用返回的access_token 作为 MCP endpoint 的 Bearer token:
之后 Agent 可以按正常 MCP 连接使用钱包和支付工具。不要把平台 client token 暴露给 Agent。
4. 完成首次授权
收到authorization_required 后,让用户打开 authorization_url。登录并同意后,浏览器会带 code、state 和 iss 回到注册的回调地址。
- 校验
state属于发起流程的用户; - 从 Authorization Server Metadata 校验
iss与环境一致; - 按 Browser Pay 平台接入 的方式用 PKCE 换取 code;
- 用同一邮箱重试
POST /agent/cwallet/platform/sessions。新的 LoginSession 会让 Clink 直接返回authorized。
Refresh token
首次登录会返回 refresh token,平台服务端保存并在过期前刷新:/agent/cwallet/platform/sessions。没有有效 session 时会重新返回 authorization_required,不要通过省略用户授权来绕过。
环境地址
安全要求
- 平台
client_secret和平台 client token 只放服务端。 - 邮箱只有经过平台自身验证后才能作为身份断言。
- 不要接受 Agent 传入的
customer_id或 email 来切换用户。 - 使用稳定
device_id,它属于用户登录状态。 - 不要混用 sandbox 和 production 的凭据、回调地址或 MCP resource。
定制 Agent Portal
使用同一个平台 client 获取只读 portal token,展示用户的 Clink 数据。
MCP 连接与 OAuth
查看完整的 MCP 授权和连接流程。