

# API Gateway 资源策略如何影响授权工作流程
<a name="apigateway-authorization-flow"></a>

当 API Gateway 评估附加到您的 API 的资源策略时，结果会受到您为 API 定义的身份验证类型的影响，如以下章节的流程图所示。

**Topics**
+ [仅限 API Gateway 资源策略](#apigateway-authorization-flow-resource-policy-only)
+ [Lambda 授权方和资源策略](#apigateway-authorization-flow-lambda)
+ [IAM 身份验证和资源策略](#apigateway-authorization-flow-iam)
+ [Amazon Cognito 身份验证和资源策略](#apigateway-authorization-flow-cognito)
+ [策略评估结果表](#apigateway-resource-policies-iam-policies-interaction)

## 仅限 API Gateway 资源策略
<a name="apigateway-authorization-flow-resource-policy-only"></a>

在此工作流中，API Gateway 资源策略附加至 API，但没有为 API 定义任何身份验证类型。对策略的评估将涉及根据调用方的入站标准寻求明确的许可。隐式拒绝或任何明确拒绝都将导致拒绝调用方。

![\[仅资源策略的授权流程。\]](http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/images/apigateway-auth-resource-policy-only.png)


以下是此类资源策略的一个示例。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:111111111111:api-id/",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
                }
            }
        }
    ]
}
```

------

## Lambda 授权方和资源策略
<a name="apigateway-authorization-flow-lambda"></a>

在此工作流程中，除了资源策略外，还为 API 配置了 Lambda 授权方。将在两个阶段中对资源策略进行评估。在调用 Lambda 授权方之前，API Gateway 首先评估策略并检查是否存在任何明确拒绝。一经发现，将立即拒绝调用方访问。否则，会调用 Lambda 授权方，它将返回[策略文档](api-gateway-lambda-authorizer-output.md)，对该文档与资源策略进行评估。如果授权方使用缓存，则 API Gateway 可能会返回缓存的策略文档。结果根据[表 A](#apigateway-resource-policies-iam-policies-interaction) 确定。

以下示例资源策略仅允许从 VPC 端点调用，其 VPC 端点 ID 为 `vpce-1a2b3c4d`。在“预身份验证”评估期间，只有来自示例中所述的 VPC 端点的调用才允许向前推进并评估 Lambda 授权方。阻止所有剩余的调用。如果为私有 API 使用自定义域名，则此授权工作流程相同。

![\[资源策略和 Lambda 授权方的授权流程。\]](http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/images/apigateway-auth-lambda-resource-policy.png)


------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:us-east-1:111111111111:api-id/"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-1a2b3c4d"
                }
            }
        }
    ]
}
```

------

## IAM 身份验证和资源策略
<a name="apigateway-authorization-flow-iam"></a>

在此工作流中，除资源策略外，还为 API 配置 IAM 身份验证。使用 IAM 服务对用户进行身份验证后，API 将同时评估附加到用户的策略以及资源策略。结果因调用方是在同一 AWS 账户 中还是在与 API 所有者不同的 AWS 账户 中而异。

如果调用方和 API 所有者来自不同的账户，则 IAM policy 和资源策略都明确允许调用方继续操作。有关更多信息，请参阅[表 B](#apigateway-resource-policies-iam-policies-interaction)。

然而，如果调用方和 API 所有者在同一 AWS 账户中，则 IAM 用户策略或资源策略必须明确允许调用方继续操作。有关更多信息，请参阅[表 A](#apigateway-resource-policies-iam-policies-interaction)。

![\[资源策略和 Lambda 身份验证的授权流程。\]](http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/images/apigateway-auth-iam-resource-policy.png)


以下是跨账户资源策略的一个示例。假定 IAM policy 包含允许效果，此资源策略将仅允许来自 VPC ID 为 `vpc-2f09a348` 的 VPC 的调用。有关更多信息，请参阅[表 B](#apigateway-resource-policies-iam-policies-interaction)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:us-east-1:111111111111:api-id/"
            ],
            "Condition" : {
                "StringEquals": {
                    "aws:SourceVpc": "vpc-2f09a348"
                    }
            }
        }
    ]
}
```

------

## Amazon Cognito 身份验证和资源策略
<a name="apigateway-authorization-flow-cognito"></a>

在此工作流程中，除了资源策略之外，还为 API 配置了 [Amazon Cognito 用户池](apigateway-integrate-with-cognito.md)。API Gateway 首先尝试通过 Amazon Cognito 对调用方进行身份验证。这通常通过调用方提供的 [JWT 令牌](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)执行。如果身份验证成功，则资源策略将被独立评估，且需要显示允许。拒绝或“不允许也不拒绝”将导致拒绝。下面是资源策略的一个示例，可以与 Amazon Cognito 用户池一起使用。

![\[资源策略和 Amazon Cognito 授权方的授权流程。\]](http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/images/apigateway-auth-cognito-resource-policy.png)


下面是资源策略的一个示例，该策略只允许从指定的源 IP 调用（假定 Amazon Cognito 身份验证令牌包含允许）。有关更多信息，请参阅[表 B](#apigateway-resource-policies-iam-policies-interaction)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:111111111111:api-id/",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
                }
            }
        }
    ]
}
```

------

## 策略评估结果表
<a name="apigateway-resource-policies-iam-policies-interaction"></a>

表 A 列出了对 API Gateway API 的访问由 IAM 策略（或 Lambda 授权方）和 API Gateway 资源策略（两者都位于同一 AWS 账户中）控制时产生的行为。


| **IAM 策略（或 Lambda 授权方）** | **API Gateway 资源策略** | **产生的行为** | 
| --- | --- | --- | 
| 允许 | 允许 | 允许 | 
| 允许 | 既不允许也不拒绝 | 允许 | 
| 允许 | 拒绝 | 显式拒绝 | 
| 既不允许也不拒绝 | 允许 | 允许 | 
| 既不允许也不拒绝 | 既不允许也不拒绝 | 隐式拒绝 | 
| 既不允许也不拒绝 | 拒绝 | 显式拒绝 | 
| 拒绝 | 允许 | 显式拒绝 | 
| 拒绝 | 既不允许也不拒绝 | 显式拒绝 | 
| 拒绝 | 拒绝 | 显式拒绝 | 

表 B 列出了对 API Gateway API 的访问由 IAM 策略（或 Amazon Cognito 用户池授权方）和 API Gateway 资源策略（两者位于不同 AWS 账户中）控制时产生的行为。如果其中一个静默（既不允许也不拒绝），则跨账户访问会被拒绝。这是因为跨账户访问要求资源策略和 IAM 策略（或 Amazon Cognito 用户池授权方）均明确授予访问权限。


| **IAM 策略（或 Amazon Cognito 用户池授权方）** | **API Gateway 资源策略** | **产生的行为** | 
| --- | --- | --- | 
| 允许 | 允许 | 允许 | 
| 允许 | 既不允许也不拒绝 | 隐式拒绝 | 
| 允许 | 拒绝 | 显式拒绝 | 
| 既不允许也不拒绝 | 允许 | 隐式拒绝 | 
| 既不允许也不拒绝 | 既不允许也不拒绝 | 隐式拒绝 | 
| 既不允许也不拒绝 | 拒绝 | 显式拒绝 | 
| 拒绝 | 允许 | 显式拒绝 | 
| 拒绝 | 既不允许也不拒绝 | 显式拒绝 | 
| 拒绝 | 拒绝 | 显式拒绝 | 