跳至主要內容

動態應用程式 (CIMD)

動態應用程式允許 OAuth 用戶端無需預先註冊即可連接到你的租戶。用戶端不再使用 Logto 發行的 client ID,而是以公開的 HTTPS URL 作為其 client_id。該 URL 提供一份描述用戶端的 JSON 文件,稱為 client ID metadata document (CIMD)。Logto 會擷取此文件,並將該用戶端視為 第三方應用程式

動態應用程式實作了 IETF 草案 OAuth Client ID Metadata Document

什麼時候該使用動態應用程式

預先註冊適用於你已知合作夥伴的情境。當任何用戶端都可能連接時(這在 Model Context Protocol (MCP) 生態系中很常見):例如,使用者要求其 AI agent 連接你的服務,而該 agent 之前從未與你的租戶互動。

透過動態應用程式,用戶端在其擁有的 URL 上公開自己的 metadata,該 URL 即為其身分。你的租戶無需事先建立任何內容。

已註冊第三方應用程式動態應用程式
Client ID由 Logto 發行用戶端擁有的 HTTPS URL
註冊必須不需要
Client secret支援不支援
權限每個應用程式獨立所有動態用戶端共用
Grant types依應用程式類型而定authorization_coderefresh_token

動態用戶端屬於公開用戶端,因此一律使用 PKCE。你可以同時使用這兩種模式。你信任的合作夥伴仍可擁有專屬權限的註冊應用程式。

啟用動態應用程式

  1. 前往 主控台 > 應用程式,並切換到 第三方應用程式 分頁。
  2. 點擊 建立應用程式 並選擇 動態應用程式 卡片。這會啟用租戶層級功能,而非建立一個應用程式。
  3. 在對話框中確認。啟用後,任何擁有有效公開 HTTPS client ID URL 的 OAuth 用戶端都可以開始對你的租戶發起授權請求。
  4. 從應用程式清單中開啟動態應用程式,並前往 權限 分頁以授予權限。

動態應用程式沒有可編輯的名稱、redirect URI 或憑證。每個用戶端會在其 metadata document 中提供這些資訊。

備註:

動態應用程式需要 OIDC provider SSRF 保護,因為 Logto 會從網際網路擷取 metadata document。若自架部署停用此功能,則無法啟用動態應用程式。

授予權限

權限 分頁定義所有動態用戶端共用的最大權限。其運作方式與已註冊第三方應用程式的 權限管理 相同,分為 使用者 (User)組織 (Organization) 區塊。

請求未被授予的使用者權限會導致錯誤,未被授予的 API 資源與組織權限則會被忽略。使用者僅會同意其透過 角色 (Roles) 擁有的權限。

由於所有動態用戶端共用這組權限,請盡量保持精簡。

發佈 client ID metadata document

如果你正在開發連接 Logto 的用戶端,請託管一份 metadata document,並將其 URL 作為你的 client_id。該 URL 必須使用 https 協定,且不得包含 fragment、user info 或點路徑段。Logto 會對該 URL 發送 GET 請求,並期望收到 JSON 物件。

例如,Claude Code 使用 https://claude.ai/oauth/claude-code-client-metadata,其內容如下:

{
"client_id": "https://claude.ai/oauth/claude-code-client-metadata",
"client_name": "Claude Code",
"client_uri": "https://claude.ai",
"redirect_uris": ["http://localhost/callback", "http://127.0.0.1/callback"],
"token_endpoint_auth_method": "none"
}

欄位名稱與 OAuth 2.0 動態用戶端註冊 相同。注意:

  • client_id 必須與提供該文件的 URL 完全一致。
  • 動態用戶端屬於公開用戶端。文件中不得包含 client_secret,且 token_endpoint_auth_method 不得為共用密鑰方法。請改用 PKCE
  • client_urilogo_uritos_uripolicy_uri 等 metadata URI 必須為絕對 https URL。這不適用於 redirect_uris,因此原生用戶端仍可使用如上例的 loopback 位址。
  • redirect_uris 需完全比對字串,唯獨 loopback 位址可比對任意 port。萬用字元模式 亦支援。
  • scopegrant_typesresponse_types 由 Logto 決定。若文件宣告這些欄位,將被忽略。動態用戶端僅能使用授權碼流程與重新整理權杖。

Logto 最多會根據你的回應 Cache-ControlExpires 標頭快取該文件 24 小時。請根據你預期的更新頻率設定這些標頭。

動態用戶端屬於第三方應用程式,因此 使用者授權頁面 (Consent screen) 一定會顯示。

授權頁面同時會顯示該用戶端尚未註冊的提示。用戶端名稱與 logo 來自 metadata document,因此可模仿任何品牌。client ID URL 的主機名稱也會顯示,因為這是用戶端唯一無法偽造的部分。

管理授權 (Manage authorizations)

授予動態用戶端的授權屬於一般第三方 授權 (grants)。使用者可在帳號設定中檢視與撤銷,管理員則可透過 Management API 管理。client ID URL 用於識別用戶端。

停用動態應用程式會阻止新的授權請求,但現有授權會保留。撤銷授權後,用戶端需再次獲得使用者授權,但先前發出的存取權杖 (Access tokens) 可能會在到期前繼續有效。

限制

  • 僅支援授權碼流程(含 PKCE)與重新整理權杖。不支援 client credentials、裝置流程與權杖交換。
  • 權限與品牌無法針對單一用戶端設定。
  • 應用程式層級存取控制 不適用於動態用戶端,因為它們沒有應用程式紀錄。
第三方應用程式(OAuth / OIDC)

啟用第三方 AI agent 存取你的 MCP 伺服器