

# 為您的閘道設定傳出授權
<a name="gateway-outbound-auth"></a>

傳出授權可讓 Amazon Bedrock AgentCore 閘道代表在傳入授權期間經過身分驗證和授權的使用者安全地存取閘道目標。

AgentCore Gateway 支援下列類型的傳出授權：
+  **無授權 （不建議）** – 有些目標類型可讓您選擇略過傳出授權。不建議使用此較不安全的選項。
+  **IAM 型傳出授權** – 使用[閘道服務角色](gateway-prerequisites-permissions.md#gateway-service-role-permissions)透過 [AWS Signature 第 4 版 (Sig V4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) 驗證對閘道目標的存取。
+  **來電者 IAM 登入**資料 – 閘道會使用來電者的 IAM 登入資料來簽署對目標的請求。閘道會使用聯合存取服務 (FAS) 代表發起人擔任角色，並使用發起人的身分簽署傳出請求。當目標服務需要根據原始發起人的身分而非閘道服務角色進行授權時，這很有用。
+  **OAuth** – 允許用戶端應用程式存取資源的開放授權架構。您可以搭配[內建身分提供者或自訂身分提供者](identity-idps.md)使用 OAuth。如需詳細資訊，請參閱 [OAuth 2.0](https://oauth.net/2/)。您可以使用下列類型的 OAuth 授權：
  +  **用戶端憑證授予** – Machine-to-machine身分驗證 （也稱為 2 邊 OAuth)。用戶端應用程式會代表應用程式存取資源，而不是代表使用者。
  +  **授權碼授予** – 使用者委派的存取 （也稱為 3 邊 OAuth)。使用者同意用戶端應用程式代表使用者存取資源。
  +  **權杖交換授予 (On-behalf-of)** – 閘道會交換傳入使用者的存取權杖，以取得以下游資源為目標的新範圍存取權杖。交換的權杖同時具有使用者的身分和代理的身分，可讓下游服務在每個躍點強制執行精細授權，而不會觸發額外的同意流程。如需詳細資訊，請參閱[On-behalf-of權杖交換](on-behalf-of-token-exchange.md)。
+  **權杖傳遞** – 閘道會將傳入授權權杖直接傳遞至目標，無需修改。目標服務負責驗證字符。這需要閘道使用`AUTHENTICATE_ONLY`傳入授權，以便驗證字符，但保留用於轉送。
+  **API 金鑰** – 使用 AgentCore 服務來產生 API 金鑰，以驗證對閘道目標的存取。

您可以設定的傳出授權類型取決於您授權存取的閘道目標類型：


| Target type (目標類型) | 無授權 | 閘道服務角色 | 來電者 IAM 登入資料 | OAuth （用戶端登入資料） | OAuth （授權碼） | OAuth （權杖交換） | 字符傳遞 | API 金鑰 | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| API Gateway 階段 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 是 | 
| Lambda 函式 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 
| MCP 伺服器 | 是 | 是 | 否 | 是 | 是 | 是 | 否 | 是 | 
| OpenAPI 結構描述 | 是 | 是 | 否 | 是 | 是 | 是 | 否 | 是 | 
| Smithy 結構描述 | 否 | 是 | 否 | 是 | 否 | 否 | 否 | 否 | 
| AgentCore 執行期 (HTTP) | 否 | 是 | 是 | 是 | 否 | 否 | 是 | 否 | 

**注意**  
如果您使用整合提供者範本做為目標，請從[整合提供者做為目標，檢閱內建](gateway-target-integrations.md)範本中不同範本的支援授權類型。

將目標新增至閘道之前，您必須透過其中一個支援的方法為其設定授權。

**注意**  
如果您打算使用 AWS 管理主控台或 AgentCore CLI 來建立閘道，則可以略過此先決條件。如果您使用這些工具，您可以讓 AgentCore 自動為您建立具有存取目標所需許可的服務角色。每次新增目標時，必要的許可都會自動連接到您的服務角色。

選取主題以了解如何設定該類型的授權：

**Topics**
+ [使用閘道服務角色設定 IAM 型傳出授權](#gateway-outbound-auth-iam)
+ [使用 OAuth 用戶端設定傳出授權](#gateway-outbound-auth-oauth)
+ [使用 API 金鑰設定傳出授權](#gateway-outbound-auth-api-key)

## 使用閘道服務角色設定 IAM 型傳出授權
<a name="gateway-outbound-auth-iam"></a>

IAM 型傳出授權可讓您使用閘道服務角色的 IAM 憑證來授權 [AWS Signature 第 4 版 (Sig V4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) 。此選項可讓 Amazon Bedrock AgentCore 服務代表您的閘道發起人驗證閘道目標。

如果您使用此選項，請確認閘道服務角色具有 `bedrock-agentcore:InvokeGateway` 許可。閘道會在調用期間使用 服務角色登入資料進行身分驗證。

 **MCP 伺服器和 OpenAPI 目標的其他組態** 

當您搭配 MCP 伺服器或 OpenAPI 目標使用 IAM 型傳出授權時，您必須提供 SigV4 簽署的其他組態。在 `credentialProviderConfigurations` 中，包含`iamCredentialProvider`具有下列欄位的 ：
+  **service** （必要） – 用於 SigV4 簽署 AWS 的服務名稱。例如，`bedrock-agentcore`對於託管在 Amazon Bedrock AgentCore 上的 MCP 伺服器。
+  **region** （選用） – SigV4 簽署 AWS 的區域。如果您未指定區域，閘道會使用自己的區域。

對於 Lambda、API Gateway 和 Smithy 目標，請勿包含 `iamCredentialProvider` 欄位。這些目標類型僅支援 `credentialProviderType` 的基本`GATEWAY_IAM_ROLE`組態。如需指定登入資料提供者組態的詳細資訊，請參閱 [AgentCore Gateway 服務角色 (IAM) 授權](gateway-building-adding-targets-authorization.md#gateway-building-adding-targets-authorization-service-role)。

### IAM 型傳出授權的安全最佳實務
<a name="_security_best_practices_for_iam_based_outbound_authorization"></a>

閘道執行角色會跨使用 設定的所有目標共用`GATEWAY_IAM_ROLE`。其許可是任何授權發起人可以透過閘道執行的上限。遵循這些最佳實務來限制暴露：
+  **將執行角色範圍限定為最低許可** – 僅授予所有已設定目標所需的許可。避免使用廣泛`Action`或`Resource`萬用字元。
+  針對**不同的信任界限使用個別閘道** – 如果目標具有不同的敏感度層級或為不同的工作負載提供服務，請將它們部署在具有不同執行角色的個別閘道後方。
+  **使用政策引擎來限制呼叫者存取** – 在共用閘道上，使用[政策引擎](policy-getting-started.md)來控制哪些呼叫者可以叫用哪些目標，限制任何單一呼叫者許可的爆量半徑。

## 使用 OAuth 用戶端設定傳出授權
<a name="gateway-outbound-auth-oauth"></a>

若要使用 OAuth 用戶端設定傳出授權，您可以使用 AgentCore Identity 服務，並指定您在內建身分提供者中建立用戶端時收到的用戶端憑證 （請參閱[提供者設定和組態](identity-idps.md)或自訂身分提供者。

 **使用 OAuth 用戶端設定傳出授權** 

1. 向支援的第三方供應商註冊您的用戶端應用程式。

1. 您會收到用戶端 ID、用戶端秘密，以及可能在設定傳出授權時參考的其他值。

1. 根據您的需求，遵循下列其中一個步驟：
   + 若要使用內建身分提供者在主控台中設定傳出授權，請遵循[使用隨附的提供者新增 OAuth 用戶端](identity-add-oauth-client-included.md)中的步驟。
   + 若要使用自訂身分提供者在主控台中設定傳出授權，請遵循[使用自訂提供者新增 OAuth 用戶端](identity-add-oauth-client-custom.md)中的步驟。
   + 若要使用 API 設定傳出授權，請傳送 [CreateOauth2CredentialProvider](https://docs.aws.amazon.com/bedrock-agentcore-control/latest/APIReference/API_CreateOauth2CredentialProvider.html) 與其中一個 [AgentCore 控制平面端點](https://docs.aws.amazon.com/general/latest/gr/bedrock_agentcore.html#bedrock_agentcore_cp) 。如需範例，請參閱[設定 OAuth 用戶端授權的範例](#gateway-outbound-auth-oauth-examples)。
**注意**  
`oauth2ProviderConfigInput` 欄位映射到的 JSON 物件形狀取決於您使用的提供者，並且必須與您指定的`credentialProviderVendor`值一致。若要查看不同憑證提供者的不同組態範例，請參閱[提供者設定和組態](identity-idps.md)中您選擇的憑證提供者中的傳出授權範例。

1. 請記下產生的登入資料 ARN ( API `credentialProviderArn`中的 ) 和 AWS Secrets Manager 秘密 ARN ( API `secretArn`中的 )。建立閘道目標時，您會使用這些值。

1. （如果您使用的是自訂閘道服務角色） 將下列身分型政策連接至閘道服務角色：

   ```
   {
   "Version": "2012-10-17",		 	 	 
       "Statement": [
         {
           "Sid": "GetWorkloadAccessToken",
           "Effect": "Allow",
           "Action": [
               "bedrock-agentcore:GetWorkloadAccessToken",
           ],
           "Resource": [
               "arn:aws:bedrock-agentcore:us-east-1:123456789012:workload-identity-directory/default",
               "arn:aws:bedrock-agentcore:us-east-1:123456789012:workload-identity-directory/default/workload-identity/GatewayName-*"
           ]
         },
         {
           "Sid": "GetResourceOauth2Token",
           "Effect": "Allow",
           "Action": [
               "bedrock-agentcore:GetResourceOauth2Token",
           ],
           "Resource": [
               "arn:aws:bedrock-agentcore:us-east-1:123456789012:token-vault/TokenVaultId/oauth2credentialprovider/CredentialName"
           ]
         },
         {
           "Sid": "GetSecretValue",
           "Effect": "Allow",
           "Action": [
               "secretsmanager:GetSecretValue",
           ],
           "Resource": [
               "arn:aws:secretsmanager:us-east-1:123456789012:secret:SecretId"
           ]
         }
       ]
   }
   ```

   取代下列欄位的值：
   + 在 `GetWorkloadAccessToken`陳述式中，將`Resource`清單中的 {{GatewayName}} 取代為您的閘道名稱。
   + 在 `GetResourceOauth2Token`陳述式中，將`Resource`清單中的值取代為您剛產生的登入資料的 ARN。
   + 在 `GetSecretValue`陳述式中，將`Resource`清單中的值取代為您產生登入資料時回應中傳回之 AWS 秘密的 ARN。

### 設定 OAuth 用戶端授權的範例
<a name="gateway-outbound-auth-oauth-examples"></a>

下列範例示範如何透過閘道目標的 OAuth 用戶端設定授權：

**Example**  

1. AgentCore CLI 登入資料命令必須在現有的 agentcore 專案內執行。如果您還沒有專案，請先使用 建立專案`agentcore create`。

   ```
   agentcore add credential \
     --name oauth-credential-provider \
     --type oauth \
     --discovery-url <DiscoveryUrl> \
     --client-id <ClientId> \
     --client-secret <ClientSecret>
   agentcore deploy
   ```

1. 

   ```
   aws bedrock-agentcore-control create-oauth2-credential-provider \
     --name oauth-credential-provider \
     --credential-provider-vendor CustomOAuth2 \
     --oauth2-provider-config-input '{
       "customOAuth2ProviderConfig": {
         "oauthDiscovery": {
           "discoveryUrl": "<DiscoveryUrl>"
         },
         "clientId": "<ClientId>",
         "clientSecret": "<ClientSecret>"
       }
     }'
   ```

1. 

   ```
   import boto3
   
   client = boto3.client("bedrock-agentcore-control")
   
   client.create_oauth2_credential_provider(
     name="oauth-credential-provider",
     credentialProviderVendor="CustomOAuth2",
     oauth2ProviderConfigInput={
       "oauthDiscovery": {
         "discoveryUrl": "<DiscoveryUrl>"
       },
       "clientId": "<ClientId>",
       "clientSecret": "<ClientSecret>"
     }
   )
   ```

## 使用 API 金鑰設定傳出授權
<a name="gateway-outbound-auth-api-key"></a>

若要使用 API 金鑰設定傳出授權，您可以使用 AgentCore Identity 服務，並指定您從支援的身分提供者收到的 API 金鑰。

 **使用 OAuth 用戶端設定傳出授權** 

1. 向支援的第三方供應商註冊您的用戶端應用程式。

1. 設定提供者服務的 API 金鑰。請記下下列值，您將在新增閘道目標時指定這些值：
   +  **登入資料位置** – API 金鑰是否應放置在 標頭中或做為查詢參數。
   +  **登入資料字首** – 登入資料的字首 （例如 承載）。

1. 根據您的需求，遵循下列其中一個步驟：
   + 若要在 AgentCore 主控台中建立 API 金鑰，請遵循[新增 API 金鑰](identity-add-api-key.md)中的步驟，並指定 API 金鑰的值。
   + 若要使用 AgentCore API 建立 API 金鑰，請使用其中一個 AgentCore 控制平面端點傳送 [CreateApiKeyCredentialProvider](https://docs.aws.amazon.com/bedrock-agentcore-control/latest/APIReference/API_CreateApiKeyCredentialProvider.html) 請求，並在 `apiKey` 欄位中指定 API 金鑰的值。 [AgentCore ](https://docs.aws.amazon.com/general/latest/gr/bedrock_agentcore.html#bedrock_agentcore_cp) 如需範例，請參閱[設定 API 金鑰的範例](#gateway-outbound-auth-api-key-examples)。

1. 請記下下列值，您將在新增閘道目標時指定這些值：
   +  **登入資料提供者 ARN** – 為登入資料提供者產生的 Amazon Resource Name (ARN)。
   +  **名稱** – 您提供給 API 金鑰的名稱。
   +  **秘密 ARN** – 針對 API 金鑰產生的 AWS Secrets Manager 秘密 ARN。

1. （如果您使用的是自訂閘道服務角色） 將下列身分型政策連接至閘道服務角色：

   ```
   {
   "Version": "2012-10-17",		 	 	 
       "Statement": [
         {
           "Sid": "GetWorkloadAccessToken",
           "Effect": "Allow",
           "Action": [
               "bedrock-agentcore:GetWorkloadAccessToken",
           ],
           "Resource": [
               "arn:aws:bedrock-agentcore:us-east-1:123456789012:workload-identity-directory/default",
               "arn:aws:bedrock-agentcore:us-east-1:123456789012:workload-identity-directory/default/workload-identity/GatewayName-*"
           ]
         },
         {
           "Sid": "GetResourceApiKey",
           "Effect": "Allow",
           "Action": [
               "bedrock-agentcore:GetResourceApiKey",
           ],
           "Resource": [
               "arn:aws:bedrock-agentcore:us-east-1:123456789012:token-vault/TokenVaultId/apikeycredentialprovider/Name"
           ]
         },
         {
           "Sid": "GetSecretValue",
           "Effect": "Allow",
           "Action": [
               "secretsmanager:GetSecretValue",
           ],
           "Resource": [
               "arn:aws:secretsmanager:us-east-1:123456789012:secret:SecretId"
           ]
         }
       ]
   }
   ```

   取代下列欄位的值：
   + 在 `GetWorkloadAccessToken`陳述式中，將`Resource`清單中的 {{GatewayName}} 取代為您的閘道名稱。
   + 在 `GetResourceApiKey`陳述式中，將`Resource`清單中的值取代為您剛產生的登入資料的 ARN。
   + 在 `GetSecretValue`陳述式中，將`Resource`清單中的值取代為您產生登入資料時回應中傳回之 AWS 秘密的 ARN。

### 設定 API 金鑰的範例
<a name="gateway-outbound-auth-api-key-examples"></a>

下列範例示範如何設定閘道目標的 API 金鑰：

**Example**  

1. AgentCore CLI 登入資料命令必須在現有的 agentcore 專案內執行。如果您還沒有專案，請先使用 建立專案`agentcore create`。

   ```
   agentcore add credential \
     --name api-key-credential-provider \
     --type api-key \
     --api-key <API_KEY_VALUE>
   agentcore deploy
   ```

1. 

   ```
   aws bedrock-agentcore-control create-api-key-credential-provider \
     --name api-key-credential-provider \
     --api-key <API_KEY_VALUE>
   ```

1. 

   ```
   import boto3
   
   client = boto3.client("bedrock-agentcore-control")
   
   client.create_api_key_credential_provider(
     name="api-key-credential-provider",
     apiKey="<API_KEY_VALUE>"
   )
   ```