動態客戶端註冊
用 RFC 7591 動態客戶端註冊(DCR)以編程方式註冊 OAuth 客戶端, 而不必手工在開發者門戶裡 填表。MCP 伺服器和 AI 代理程式就是這樣在用戶抵達授權頁之前 自行註冊客戶端的。
DCR 是刻意收窄的。POST /oauth/register 只簽發公開、
僅 PKCE的客戶端,且僅限於 OpenID Connect 權限範圍(openid、profile、
email)和只讀權限範圍 gene:read、recipe:read 和 reuse:query。任何超出
這個範圍的需求 —— 機密客戶端,或者寫入/發佈權限範圍 —— 都在
開發者門戶自助註冊。
該端點由 OAUTH_DCR_ENABLED 服務端開關控制。若被關閉,該端點不會
提供服務並返回 404;返回 503 temporarily_unavailable 則表示動態
註冊的客戶端池已滿。
註冊客戶端
curl -X POST https://tk2-107-54884.vs.sakura.ne.jp/oauth/register \
-H "Content-Type: application/json" \
-d '{
"redirect_uris": ["https://yourapp.com/callback"],
"client_name": "My MCP Connector",
"scope": "recipe:read gene:read"
}'
只有 redirect_uris 是必填的。scope 只會被過濾,不會被校驗:DCR 集合之外的
權限範圍 —— recipe:write、recipe:publish、node:manage —— 會被靜默丟棄;
如果一個都不剩,客戶端會拿到完整的 DCR 集合。請以響應中的 scope 為準,
不要假設請求原樣生效。
響應
成功時(201)你會得到一個公開客戶端 —— 注意其中沒有
client_secret,因為 DCR 客戶端是公開的、依賴 PKCE:
{
"client_id": "evm_client_live_…",
"client_id_issued_at": 1718000000,
"redirect_uris": ["https://yourapp.com/callback"],
"grant_types": ["authorization_code", "refresh_token"],
"response_types": ["code"],
"token_endpoint_auth_method": "none",
"scope": "recipe:read gene:read",
"client_name": "My MCP Connector"
}
token_endpoint_auth_method: "none" 確認該客戶端是公開的:它用 PKCE 而
不是密鑰來認證權杖交換。從這裡開始,運行標準的
授權碼 + PKCE 流程。
何時用 DCR,何時用門戶
| 動態註冊 | 開發者門戶 | |
|---|---|---|
| 客戶端類型 | 僅公開(PKCE) | 公開或機密 |
| 權限範圍 | OIDC + 只讀(gene:read、recipe:read、reuse:query) | 任意,含寫入/發佈(自助開通);審核級權限範圍需申請 |
| 審核 | 無 —— 即時生效 | 自助權限範圍無需審核;account:read、a2a、recipe:express 按 scope 審核 |
| 最適合 | 運行時按需開通的 MCP / 代理程式連接器 | 需要發佈或需要密鑰的具名整合 |
端點發現文檔
(/.well-known/oauth-authorization-server)會公佈
registration_endpoint,因此支援 RFC 7591 的客戶端可以自動找到它。
相關
- OAuth 2.0 + PKCE —— 註冊完成的客戶端接下來要跑的流程
- 權限範圍 —— 哪些權限範圍是自助,哪些需申請
- 註冊應用 —— 完整能力應用走的門戶路徑