OAuth 2.0 授權 URL 工作階段繫結
AgentCore Identity 為您的代理應用程式提供 OAuth 2.0 存取權杖擷取,以存取受身分提供者/授權伺服器保護的第三方應用程式供應商或資源。如果應用程式或資源需要使用者使用 OAuth 授權碼流程明確授權,AgentCore Identity 會產生授權 URL,讓使用者導覽至 並同意存取。然後,在使用者同意後,AgentCore Identity 會代表使用者從應用程式或資源擷取存取權杖,並將其存放在 AgentCore Identity Token Vault 中。
不過,由於使用者可能會不小心將授權 URL 傳送給其他使用者,並存取該使用者的應用程式或資源,因此您的應用程式必須驗證啟動授權請求的使用者是否仍與授予應用程式或資源之同意的使用者相同。若要這樣做,您需要使用處理使用者驗證的 AgentCore Identity 註冊公開可用的 HTTPS 應用程式端點。
工作階段繫結的運作方式
下列流程圖和對應的步驟顯示 OAuth 2.0 授權 URL 工作階段繫結程序:
-
叫用代理程式 – 當原始代理程式使用者想要存取他/她擁有的一些應用程式或資源時,您的代理程式程式碼會叫用
GetResourceOauth2TokenAPI 來擷取授權 URL。 -
產生授權 URL – AgentCore Identity 會產生授權 URL 和工作階段 URI,讓使用者導覽至 和同意存取。
-
授權和取得存取權杖 – 使用者導覽至授權 URL,並授予您的代理程式存取其資源的同意。之後,AgentCore Identity 會使用包含授權請求原始使用者的資訊,將使用者的瀏覽器重新導向至 HTTPS 應用程式端點。此時,您的 HTTPS 應用程式端點會判斷原始代理程式使用者是否仍與目前登入的應用程式使用者相同。如果相符,您的應用程式端點會叫用 ,
CompleteResourceTokenAuth以便 AgentCore Identity 可以擷取和存放存取權杖。 -
重新叫用代理程式以取得存取權杖 – 應用程式傳回有效的回應後,您的代理程式應用程式將能夠擷取最初為使用者請求的 OAuth2.0 存取權杖。如果使用者不相符,您的應用程式只會執行任何動作或記錄嘗試。
透過允許應用程式端點驗證使用者身分,AgentCore Identity 可讓您的代理程式應用程式確保一律是啟動授權請求的相同使用者,以及同意存取的使用者。
實作詳細資訊
下列步驟會逐步引導您從資源提供者設定工作負載身分、OAuth 2.0 登入資料提供者和 OAuth 2.0 應用程式用戶端,以擷取代理程式應用程式的 OAuth 2.0 存取字符。
您可以參考範例程式碼做為運作中應用程式的範例:OAuth 2.0 回呼伺服器實作。
重要
當您agentcore dev在本機環境中使用 AgentCore CLI 搭配 時,為了簡化您的本機開發和測試,CLI 會託管回呼端點,並代表您呼叫 CompleteResourceTokenAuth API 來驗證使用者工作階段以取得 OAuth 2.0 存取字符,因此您可以略過下列設定中的步驟 1、2 和 4。不過,將代理程式程式碼部署到 AgentCore 執行期時,連線至代理程式執行期的 Web 應用程式必須託管可公開存取的 HTTPS 回呼端點本身,必須使用 AgentCore 執行期提供的代理程式 ID AllowedResourceOAuth2ReturnUrl呼叫 UpdateWorkloadIdentity,將回呼端點註冊為 ,然後在驗證目前使用者的瀏覽器工作階段以保護 OAuth 2.0 授權流程之後呼叫 CompleteResourceTokenAuth API。
實作 OAuth 2.0 授權 URL 工作階段繫結
-
建立應用程式 URL – 針對面向使用者的瀏覽器應用程式,建立和託管可從使用者瀏覽器存取的新 URL,並可接受瀏覽器重新導向的請求。此頁面應重新導向至應用程式頁面,您的使用者可以繼續使用其代理程式工作階段,或轉譯一些基本網頁,指示您的使用者傳回其目前作用中的代理程式工作階段。在實作的稍後部分,此頁面用於驗證目前使用者的作用中工作階段,因此此頁面也應該能夠存取和維護您的應用程式使用者工作階段資料。
例如,您的應用程式可能會讓其使用者在 等主要應用程式頁面上與 代理程式互動
https://myagentapp.com/assistant。您會想要公開新的 URLhttps://myagentapp.com/callback,例如現在將重新導向至主要應用程式頁面。您/callback端點中的實際程式碼邏輯稍後會在遵循本指南時更新。 -
使用應用程式 URL 更新工作負載身分 – (如果透過 AgentCore CLI 在本機測試,則可以略過) 一旦您建立並託管要重新導向的 AgentCore Identity 應用程式 URL,請更新您的工作負載身分,以便將應用程式 URL 註冊為
AllowedResourceOauth2ReturnUrl。請確定使用的 IAM 登入資料具有呼叫CreateWorkloadIdentity或 的許可,UpdateWorkloadIdentity取決於您要建立新的工作負載身分或更新現有的工作負載身分。注意
對於 AgentCore 執行期或閘道代表您建立的工作負載身分,工作負載身分名稱將對應至 服務發出的執行期 ID 或閘道 ID。
UpdateWorkloadIdentityAPI 呼叫範例:aws bedrock-agentcore-control update-workload-identity --name GoogleCalendarAgent \ --allowed-resource-oauth2-return-urls https://myagentapp.com/callback -
在 AgentCore Identity 中建立 OAuth 2.0 登入資料提供者 – 若要完整註冊 OAuth 2.0 登入資料提供者,您需要呼叫
CreateOauth2CredentialProvider和UpdateOauth2CredentialProvider的許可。請遵循下列步驟:-
CreateOauth2CredentialProvider使用預留位置呼叫 以取得用戶端 ID 和用戶端秘密。 -
API 回應將包含 OAuth 回呼 (重新導向) URL,例如:
https://bedrock-agentcore.amazonaws.com/identities/callback/123-456-7890記錄此值,因為它專屬於每個建立的提供者,且稍後會由 OAuth 2.0 資源提供者需要。
-
前往您的資源提供者 (例如 Google 或 GitHub) 並建立 OAuth 2.0 應用程式用戶端。以允許的 OAuth 2.0 回呼 URL 的形式,提供服務從對資源提供者的
CreateOauth2CredentialProvider呼叫發出的回呼 URL。 -
建立 OAuth 2.0 應用程式用戶端之後,請記錄指派給您應用程式用戶端的用戶端 ID 和用戶端秘密,因為您需要使用這些值更新 OAuth 2.0 登入資料提供者。
-
呼叫
UpdateOauth2CredentialProvider並提供資源提供者提供的用戶端 ID 和用戶端秘密,取代建立登入資料提供者時提供的預留位置值。
-
-
新增用於呼叫 CompleteResourceTokenAuth 的程式碼處理常式 – 建立 OAuth 2.0 登入資料提供者後,請新增程式碼和 IAM 許可,以在應用程式 URL 處理常式中呼叫
CompleteResourceTokenAuthAPI。呼叫CompleteResourceTokenAuthAPI 時,您的應用程式必須呈現原始傳入身分提供者 OAuth 權杖或用於產生工作負載存取權杖的user_id字串,以代表 OAuth 2.0 授權流程中涉及的使用者和代理程式應用程式。此資訊應該從使用者瀏覽器上的作用中應用程式工作階段擷取 (通常是透過瀏覽器 Cookie 或瀏覽器本機儲存體),而且不應從任何遠端工作階段快取提取。此外,AgentCore Identity 產生的每個授權 URL 都會以自己的工作階段 URI 唯一識別。此工作階段 URI 也必須與使用者識別符一起顯示,才能將工作階段與預期使用者繫結。
重要
在您的應用程式呼叫
CompleteResourceTokenAuthAPI 之前,您的應用程式必須驗證目前使用者與您的應用程式具有作用中且有效的工作階段。如此一來,您的應用程式就可以將目標使用者與授權工作階段建立關聯。此外,如果您的應用程式依賴後端服務,您可以將呼叫CompleteResourceTokenAuthAPI 的程式碼移至後端,並讓應用程式轉送傳入身分提供者 OAuth 權杖或user_id後端。應用程式程式碼範例:
def _handle_3lo_callback(self, request: Request) -> JSONResponse: session_id = request.query_params.get("session_id") if not session_id: console.print("Missing session_id in OAuth2 3LO callback") return JSONResponse(status_code=400, content={"message": "missing session_id query parameter"}) session_details = validate_session_cookies(request.cookies.get('my-application-cookie')) user_id = None if oauth2_config: user_id = session_details.get(USER_ID) if not user_id: console.print(f"Missing {USER_ID} in session_details") return JSONResponse(status_code=500, content={"message": "Internal Server Error"}) console.print(f"Handling 3LO callback for workload_user_id={user_id} | session_id={session_id}", soft_wrap=True) region = agent_config.aws.region if not region: console.print("AWS Region not configured") return JSONResponse(status_code=500, content={"message": "Internal Server Error"}) identity_client = IdentityClient(region) identity_client.complete_resource_token_auth( session_uri=session_id, user_identifier=UserIdIdentifier(user_id=user_id) ) return JSONResponse(status_code=200, content={"message": "OAuth2 3LO flow completed successfully"}) -
測試 – 完成設定後,您就可以測試整合。首先,在瀏覽器中呼叫
GetResourceOauth2Token和 ,前往傳回的授權 URL。在 OAuth 2.0 資源提供者完成授權後,您應該會看到瀏覽器重新導向回您的應用程式 URL 並叫用CompleteResourceTokenAuthAPI。一旦應用程式傳回有效的回應,您的代理程式應用程式將能夠擷取最初為使用者請求的 OAuth 2.0 存取字符。您可以透過呼叫GetResourceOauth2TokenAPI 來擷取這些字符。
其他考量
實作 OAuth 2.0 授權 URL 工作階段繫結時,請謹記下列考量:
-
每個授權 URL 及其對應的工作階段識別符僅在 10 分鐘內有效。
-
為了保護您的應用程式回呼端點免受 CSRF 攻擊,強烈建議您產生不透明狀態,以包含在對 的 API
GetResourceOAuth2Token呼叫中。您的應用程式應該能夠剖析此值,以確保其為代理程式應用程式啟動的請求提供服務。