OAuth 2.0 授权网址会话绑定
AgentCore Identity 为您的代理应用程序提供 OAuth 2.0 访问令牌检索,以访问第三方应用程序供应商或受身份提供商/授权服务器保护的资源。如果应用程序或资源要求用户通过 OAuth 授权代码流进行明确授权,Ident AgentCore ity 会生成授权网址供用户导航并同意访问。然后,在用户同意后,I AgentCore dentity 代表用户从应用程序或资源中获取访问令牌,并将其存储在 AgentCore 身份令牌库中。
但是,由于用户可能会意外将授权 URL 发送给其他用户并获得该用户的应用程序或资源的访问权限,因此您的应用程序必须验证发起授权请求的用户是否仍然与对应用程序或资源给予同意的用户相同。为此,您需要使用 AgentCore 身份注册一个可公开使用的 HTTPS 应用程序终端节点,以处理用户验证。
会话绑定的工作原理
以下流程图和相应的步骤显示了 OAuth 2.0 授权网址会话绑定过程:
-
调用代理 — 当原始代理用户想要访问拥有的某些应用程序或资源时,您的代理代码会调用
GetResourceOauth2TokenAPI 来检索授权 URL。 he/she -
生成授权 URL — Ident AgentCore ity 会生成授权网址和会话 URI,供用户导航并同意访问。
-
授权并获取访问令牌-用户导航到授权 URL 并同意您的代理访问 his/her 资源。之后, AgentCore Identity 会将用户的浏览器重定向到您的 HTTPS 应用程序终端节点,其中包含授权请求的原始用户的信息。此时,您的 HTTPS 应用程序终端节点将确定原始代理用户是否仍然与应用程序的当前登录用户相同。如果它们匹配,则会调用您的应用程序终端节点,
CompleteResourceTokenAuth以便 Ident AgentCore ity 可以获取和存储访问令牌。 -
Re-invoke 代理获取访问令牌 — 应用程序返回有效响应后,您的代理应用程序将能够检索最初为用户请求的 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 Runtime 时,连接到代理运行时的 Web 应用程序本身必须托管一个可公开访问的 HTTPS 回调端点,必须UpdateWorkloadIdentity使用 AgentCore 运行时提供的代理 ID 调用该回调端点,然后在验证当前用户的浏览器会话后调用 CompleteResourceTokenAuth API 以保护您的 OAuth 2.0 授权流程。AllowedResourceOAuth2ReturnUrl
实现 OAuth 2.0 授权网址会话绑定
-
创建应用程序 URL — 对于面向用户的浏览器应用程序,创建并托管一个可从用户浏览器访问并接受浏览器重定向请求的新 URL。该页面应重定向到您的用户可以继续进行代理会话的应用程序页面,或者呈现一些基本的网页,指示您的用户返回当前处于活动状态的代理会话。在实现的后续部分中,此页面用于验证当前用户的活动会话,因此该页面还应该能够访问和维护您的应用程序用户会话数据。
例如,您的应用程序可能让其用户在主应用程序页面上与代理进行交互,例如
https://myagentapp.com/assistant。你现在需要公开一个这样的新 URLhttps://myagentapp.com/callback,它会重定向到主应用程序页面。您/callback终端节点中的实际代码逻辑将在以后按照本指南进行更新。 -
使用应用程序 URL 更新工作负载身份 —(如果通过 AgentCore CLI 进行本地测试,则可以跳过)创建并托管了供 AgentCore 身份重定向到的应用程序 URL 后,请更新您的工作负载身份,以便将应用程序 URL 注册为
AllowedResourceOauth2ReturnUrl。确保所使用的 IAM 证书具有调用权限,CreateWorkloadIdentity或者UpdateWorkloadIdentity取决于您是在创建新的工作负载身份还是更新现有工作负载身份。注意
对于由 AgentCore Runtime 或 Gateway 代表您创建的工作负载身份,工作负载标识名称将与服务颁发的运行时 ID 或网关 ID 相对应。
UpdateWorkloadIdentityAPI 调用示例:aws bedrock-agentcore-control update-workload-identity --name GoogleCalendarAgent \ --allowed-resource-oauth2-return-urls https://myagentapp.com/callback -
在 Ident@@ AgentCore ity 中创建 OAuth 2.0 凭据提供商 — 要完全注册 OAuth 2.0 凭据提供商,您需要调用和的权限。
CreateOauth2CredentialProviderUpdateOauth2CredentialProvider按照以下步骤进行操作:-
CreateOauth2CredentialProvider使用占位符调用客户端 ID 和客户机密钥。 -
API 响应将包含一个 OAuth 回调(重定向)网址,例如:
https://bedrock-agentcore.amazonaws.com/identities/callback/123-456-7890记录此值,因为该值是针对创建的每个提供商的,OAuth 2.0 资源提供者稍后将需要该值。
-
前往您的资源提供商(例如 Google 或 GitHub),创建 OAuth 2.0 应用程序客户端。提供服务在调
CreateOauth2CredentialProvider用资源提供者时发出的回传网址作为允许的 OAuth 2.0 回传网址。 -
创建 OAuth 2.0 应用程序客户端后,记录分配给应用程序客户端的客户端 ID 和客户端密钥,因为您需要使用这些值更新 OAuth 2.0 凭据提供程序。
-
调用
UpdateOauth2CredentialProvider并提供资源提供者提供的客户端 ID 和客户机密钥,替换创建凭据提供程序时提供的占位符值。
-
-
添加用于调用的代码处理程序 CompleteResourceTokenAuth-创建 OAuth 2.0 凭证提供商后,在应用程序 URL 处理程序中添加代码和 IAM 权限以调用
CompleteResourceTokenAuthAPI。调用CompleteResourceTokenAuthAPI 时,您的应用程序必须出示用于生成工作负载访问令牌的原始入站身份提供商 OAuth 令牌或user_id字符串,以代表 OAuth 2.0 授权流程中涉及的用户和代理应用程序。这些信息应从用户浏览器上的活动应用程序会话中获取(通常通过浏览器 Cookie 或浏览器本地存储),不应从任何远程会话缓存中提取。此外,Id AgentCore entity 生成的每个授权 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,然后在浏览器中转到返回的授权网址。在 OAuth 2.0 资源提供商处完成授权后,您应该会看到浏览器重定向回您的应用程序 URL 并调用 API。CompleteResourceTokenAuth应用程序返回有效响应后,您的代理应用程序将能够检索最初为用户请求的 OAuth 2.0 访问令牌。这些令牌可以通过调用GetResourceOauth2TokenAPI 来获取。
其他注意事项
在实现 OAuth 2.0 授权网址会话绑定时,请记住以下注意事项:
-
每个授权 URL 及其相应的会话标识符仅在 10 分钟内有效。
-
为了保护您的应用程序回调端点免受 CSRF 攻击,我们强烈建议您生成一个不透明的状态以包含在对的 API 调用中。
GetResourceOAuth2Token您的应用程序应该能够解析此值,以确保它正在处理由您的代理应用程序发起的请求。