

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 Amazon 验证权限中实现授权
<a name="authorization"></a>

创建策略存储、策略、模板、架构和授权模型后，就可以开始使用 Amazon Verified Permissions 授权请求了。要实现已验证的权限授权，必须将中授权策略的配置 AWS 与应用程序中的集成结合起来。要将已验证权限与您的应用程序集成，请添加一个 AWS SDK 并实现调用已验证权限 API 并针对您的策略存储生成授权决策的方法。

使用经过验证的权限进行授权对于应用程序中的 *UX 权限*和 *API 权限*非常有用。

**用户体验权限**  
控制用户对您的应用程序 UX 的访问权限。您可以只允许用户查看他们需要访问的确切表单、按钮、图形和其他资源。例如，当用户登录时，您可能需要确定其账户中是否有 “转账” 按钮。您还可以控制用户可以采取的操作。例如，在同一个银行应用程序中，您可能需要确定是否允许您的用户更改交易类别。

**API 权限**  
控制用户对数据的访问权限。应用程序通常是分布式系统的一部分，并从外部引入信息 APIs。在银行应用程序的示例中，Verified Permissions 允许显示 “转账” 按钮，当您的用户发起转账时，必须做出更复杂的授权决定。Verified Permissions 可以授权列出符合条件的转账目标账户的 API 请求，然后授权将转账推送到其他账户的请求。

说明此内容的示例来自[策略存储库示](policy-stores-create.md#policy-stores-create.title)例。要继续操作，请在您的测试环境中创建**DigitalPetStore**示例策略存储。

有关使用批量授权实现 UX 权限的端到端示例应用程序，请参阅*AWS 安全*博客上的 “[使用 Amazon 已验证的权限进行大规模细粒度授权](https://aws.amazon.com/blogs/security/use-amazon-verified-permissions-for-fine-grained-authorization-at-scale/)”。

**Topics**
+ [

## 可用于授权的 API 操作
](#authorization-operations)
+ [

# 测试您的授权模型
](authorization-testing.md)
+ [

# 将您的授权模型与应用程序集成
](authorization-sdk.md)

## 可用于授权的 API 操作
<a name="authorization-operations"></a>

已验证权限 API 具有以下授权操作。

**[IsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html)**  
`IsAuthorized`API 操作是使用已验证权限的授权请求的入口点。您必须提交承担者、操作、资源、上下文和实体元素。Verified Permissions 会根据请求的策略存储区中适用于请求中实体的所有策略来评估您的请求。

**[IsAuthorizedWithToken](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorizedWithToken.html)**  
该`IsAuthorizedWithToken`操作根据 JSON Web 令牌 (JWTs) 中的用户数据生成授权请求。Verified Permissions 可直接与 OIDC 提供商配合使用，例如 Amazon Cognito 作为策略存储中的身份源。Verified Permissions 会根据用户 ID 或访问令牌中的声明填充您的请求中的委托人的所有属性。您可以通过身份源中的用户属性或群组成员资格来授权操作和资源。  
您不能在`IsAuthorizedWithToken`请求中包含有关群组或用户主体类型的信息。您必须将所有委托人数据填充到您提供的 JWT 中。

**[BatchIsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_BatchIsAuthorized.html)**  
该`BatchIsAuthorized`操作在单个 API 请求中处理针对单个委托人或资源的多个授权决策。此操作将请求分组为单个批处理操作，从而最大限度地减少[配额使用量](quotas.md#quotas-tps.title)，并返回最多 30 个复杂嵌套操作中每个操作的授权决策。通过对单个资源的批量授权，您可以筛选用户可以对资源执行的操作。通过对单个委托人的批量授权，您可以筛选用户可以对其采取操作的资源。

**[BatchIsAuthorizedWithToken](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_BatchIsAuthorizedWithToken.html)**  
该`BatchIsAuthorizedWithToken`操作在一个 API 请求中为单个委托人处理多个授权决策。委托人由您的策略存储身份源以 ID 或访问令牌形式提供。此操作将请求分组为单个批处理操作，以最大限度地减少[配额使用量](quotas.md#quotas-tps.title)，并返回最多 30 个操作和资源请求中每个请求的授权决策。在您的策略中，您可以通过其属性或用户目录中的群组成员资格来授权他们的访问权限。  
与一样`IsAuthorizedWithToken`，您不能在`BatchIsAuthorizedWithToken`请求中包含有关群组或用户委托人类型的信息。您必须将所有委托人数据填充到您提供的 JWT 中。

# 测试您的授权模型
<a name="authorization-testing"></a>

要了解部署应用程序时 Amazon 已验证权限授权决定的影响，您可以在制定策略时使用[使用 Amazon 已验证权限测试平台](test-bench.md)和通过 HTTPS REST API 请求对已验证权限进行评估。测试平台是用于评估策略存储库中的 AWS 管理控制台 授权请求和响应的工具。

随着您从概念理解转向应用程序设计，经过验证的权限 REST API 是您开发的下一步。经过验证的权限 API 接受带有[IsAuthorized[IsAuthorizedWithToken](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorizedWithToken.html)](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html)、和[BatchIsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_BatchIsAuthorized.html)作为已[签名的 AWS API 向区域[服务终端节点](https://docs.aws.amazon.com/general/latest/gr/verifiedpermissions.html)发出的授权请求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html)。要测试您的授权模型，您可以使用任何 API 客户端生成请求，并验证您的策略是否按预期返回授权决策。

例如，您可以按照以下步骤`IsAuthorized`在示例策略存储中进行测试。

------
#### [ Test bench ]

1. 在已验证权限控制台上打开[已验证权限控制台](https://console.aws.amazon.com/verifiedpermissions/)。使用名称从**示例策略存储中创建策略存储**DigitalPetStore****。

1. 在新保单库中选择 “**测试台**”。

1. 在已验证权限 API 参考[IsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html#API_IsAuthorized_Examples)中填充您的测试平台请求。以下详细信息复制了**示例 4** 中引用该**DigitalPetStore**示例的条件。

   1. 将爱丽丝设为校长。要让**校长采取行动**，请选择`DigitalPetStore::User`并输入`Alice`。

   1. 将爱丽丝的角色设定为客户。选择 “**添加父母**”，选择`DigitalPetStore::Role`，然后输入 “客户”。

   1. 将资源设置为顺序 “1234”。对于**委托人正在操作的资源**，选择`DigitalPetStore::Order`并输入`1234`。

   1. 该`DigitalPetStore::Order`资源需要一个`owner`属性。将 Alice 设置为订单的所有者。选择`DigitalPetStore::User`并输入 `Alice`

   1. Alice 请求查看订单。对于**委托人正在采取的行动**，选择`DigitalPetStore::Action::"GetOrder"`。

1. 选择**运行授权请求**。在未经修改的策略存储中，此请求会导致`ALLOW`决策。请注意返回决策的 “**满意” 政策**。

1. 从左侧导航菜单中，选择**策略**。查看静态政策，描述为 “**客户角色-获取订单”**。

1. 请注意，由于委托人是客户角色并且是资源的所有者，因此已验证权限允许该请求。

------
#### [ REST API ]

1. 在已验证权限控制台上打开[已验证权限控制台](https://console.aws.amazon.com/verifiedpermissions/)。使用名称从**示例策略存储中创建策略存储**DigitalPetStore****。

1. 记下您的新**保单存储区的保单存储 ID**。

1. [IsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html#API_IsAuthorized_Examples)在已验证权限 API 参考中，复制**示例 4** 中引用该**DigitalPetStore**示例的请求正文。

1. 打开您的 API 客户端，为您的政策存储创建对区域服务端点的请求。如[示例](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html#API_IsAuthorized_Examples)所示，填充标题。

1. 粘贴示例请求正文，然后将的`policyStoreId`值更改为您之前记下的策略存储 ID。

1. 提交请求并查看结果。在默认**DigitalPetStore**策略存储中，此请求会返回一个`ALLOW`决定。

------

您可以更改测试环境中的策略、架构和请求，以更改结果并做出更复杂的决策。

1. 更改请求的方式会更改已验证权限的决定。例如，将爱丽丝的角色更改为`Employee`或将命令 1234 的`owner`属性更改为。`Bob`

1. 以影响授权决策的方式更改策略。例如，修改描述为 “**客户角色-获取订单**” 的政策，以删除`User`必须是所有者的条件，`Resource`然后修改请求以使其`Bob`想要查看订单。

1. 更改架构以允许策略做出更复杂的决策。更新请求实体，以便 Alice 可以满足新的要求。例如，编辑架构`User`以允许其成为`ActiveUsers`或的成员`InactiveUsers`。更新政策，以便只有活跃用户才能查看自己的订单。更新请求实体，使 Alice 成为活跃用户或非活动用户。

# 将您的授权模型与应用程序集成
<a name="authorization-sdk"></a>

要在您的应用程序中实施 Amazon Verified Permissions，您必须定义您希望应用程序强制执行的策略和架构。在授权模型到位并经过测试后，下一步是从强制执行开始生成 API 请求。为此，您必须设置应用程序逻辑以收集用户数据并将其填充到授权请求中。

**应用程序如何使用已验证的权限授权请求**

1. 收集有关当前用户的信息。通常，用户的详细信息在经过身份验证的会话的详细信息中提供，例如 JWT 或 Web 会话 Cookie。这些用户数据可能来自链接到您的策略存储库的 Amazon Cognito [身份来源](identity-sources.md#identity-sources.title)，也可能来自其他 Open [ID Connect (O](cognito-validation.md#identity-sources-other-idp.title) IDC) 提供商。

1. 收集有关用户想要访问的资源的信息。通常，当用户做出要求您的应用程序加载新资产的选择时，您的应用程序将收到有关资源的信息。

1. 确定您的用户想要采取的操作。

1. 生成对已验证权限的授权请求，其中包含用户尝试操作的委托人、操作、资源和实体。verified Permissions 会根据您的策略存储中的策略评估请求并返回授权决定。

1. 您的应用程序读取来自已验证权限的允许或拒绝响应，并强制执行对用户请求的决定。

已验证权限 API 操作内置于中 AWS SDKs。要在应用程序中加入经过验证的权限，请将适用于您所选语言的 AWS SDK 集成到应用程序包中。

要了解更多信息并进行下载 AWS SDKs，[请参阅工具 Amazon Web Services](https://aws.amazon.com/tools/)。

以下是各种已验证权限资源的文档链接 AWS SDKs。
+ [适用于 .NET 的 AWS SDK](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/VerifiedPermissions/NVerifiedPermissions.html)
+ [适用于 C\$1\$1 的 AWS SDK](https://sdk.amazonaws.com/cpp/api/LATEST/aws-cpp-sdk-verifiedpermissions/html/class_aws_1_1_verified_permissions_1_1_verified_permissions_client.html)
+ [适用于 Go 的 AWS SDK](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/verifiedpermissions)
+ [适用于 Java 的 AWS SDK](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/verifiedpermissions/package-summary.html)
+ [适用于 JavaScript 的 AWS SDK](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/verifiedpermissions/)
+ [适用于 PHP 的 AWS SDK](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-verifiedpermissions-2021-12-01.html)
+ [AWS SDK for Python (Boto)](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/verifiedpermissions.html)
+ [适用于 Ruby 的 AWS SDK](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/VerifiedPermissions/Client.html)
+ [适用于 Rust 的 AWS SDK](https://docs.rs/aws-sdk-verifiedpermissions/latest/aws_sdk_verifiedpermissions/)

以下 适用于 JavaScript 的 AWS SDK 示例`IsAuthorized`源自[使用亚马逊验证权限和 Amazon Cognito 简化细粒度](https://aws.amazon.com/blogs/security/simplify-fine-grained-authorization-with-amazon-verified-permissions-and-amazon-cognito/)授权。

```
const authResult = await avp.isAuthorized({
    principal: 'User::"alice"',
    action: 'Action::"view"',
    resource: 'Photo::"VacationPhoto94.jpg"',
    // whenever our policy references attributes of the entity,
    // isAuthorized needs an entity argument that provides    
    // those attributes
    entities: {
       entityList: [
         {
            "identifier": {
                "entityType": "User",
                "entityId": "alice"
            },
            "attributes": {
                "location": {
                    "String": "USA"
                }
            }
         }
       ]
    }
});
```

**更多开发者资源**
+ [Amazon 已验证权限研讨会](https://catalog.workshops.aws/verified-permissions-in-action)
+ [Amazon 已验证权限-资源](https://aws.amazon.com/verified-permissions/resources/)
+ [使用亚马逊验证权限为 ASP.NET Core 应用程序实施自定义授权策略提供程序](https://aws.amazon.com/blogs/dotnet/implement-a-custom-authorization-policy-provider-for-asp-net-core-apps-using-amazon-verified-permissions/)
+ [使用 Amazon 验证权限为业务应用程序构建授权服务](https://aws.amazon.com/blogs/security/build-an-entitlement-service-for-business-applications-using-amazon-verified-permissions/)
+ [使用亚马逊认证权限和 Amazon Cognito 简化细粒度授权](https://aws.amazon.com/blogs/security/simplify-fine-grained-authorization-with-amazon-verified-permissions-and-amazon-cognito/)