AWS API 网关:API 仅适用于经过身份验证的用户和来宾用户
AWS API Gateway: API available for authenticated and guest users only
我是 AWS 的新手,我想了解一些基本概念。在我的 Android 应用程序中,我使用:
- Cognito 用户池和身份池允许我的用户注册和登录,而且还可以作为 访客 用户
使用该应用程序
- API 网关和 AWS Lambda,用于创建应用程序可以调用的 Web 服务
我的用例非常简单:我希望我在 API 网关中创建的一些 API 可供我的经过身份验证的用户使用 和 我的来宾用户,以及其他 API 仅供我的经过身份验证的用户使用。
对于仅对我的经过身份验证的用户可用的 API,我正在考虑将用户放入一组用户中(感谢 CognitoIdentityServiceProvider.adminAddUserToGroup()
),这些用户可以与 IAM 具有共同的角色附加到它的策略,以允许他们访问那些 APIs。我认为这是有道理的,因为我会有不同类型的用户,所以我将为每种类型使用一个组。
但是对于我的认证用户和来宾用户可用的 APIs,我很确定我应该做什么。如果 API 是 public,那么它们可以被包括我的来宾用户在内的任何人调用,或者是否可以让它们只对我的认证用户和我的来宾用户可用,而不是 public?有哪些好的做法,我该如何实现?
感谢您的帮助。
您应该为此使用 "API Gateway Lambda Authorizers"。您可以按方法配置授权方。因此,只有为经过身份验证的用户保留的端点应该有一组。
它们是如何工作的?
每次请求到达配置了授权器的端点时,API 网关将使用 request
信息触发它。授权方然后检查 request
是否具有正确的凭据。如果是,则 IAM 策略是 returned。方法执行调用(例如另一个 Lambda 函数)将使用此策略。否则,授权方将 return 一个错误状态代码,例如 403 Access Denied
.
在您的情况下,由于您使用的是 Cognito,因此可以使用 Cognito User Pool Authorizer。您可以使用 Cognito 的 SDK 或 AWS cli
创建它。配置完成后,您唯一需要做的就是在用户身份验证后附加 Cognito 提供的 id
或 access
令牌。它通常在 Authorization
header.
内供应
希望对您有所帮助。
这是我使用控制台的做法:
- 在API网关中,点击资源,然后点击方法(GET, POST...)
- 单击方法请求
- 对于授权,选择
AWS_IAM
- 在 Cognito 中,选择管理身份池
- 创建(或编辑)您与 Cognito 用户池一起使用的身份池
- 在未经身份验证的身份块中,勾选允许访问未经身份验证的身份
- 在同一页面上(至少如果您编辑身份池),您还应该看到 已验证角色 和 未验证角色
- 转到 IAM,然后在 角色 中找到这两个角色
- 对于每个角色,单击它,然后在 权限 选项卡中,单击附加到该角色的策略以查看它(左侧有小箭头)
- 点击编辑策略,然后点击JSON选项卡,然后添加以下块(您可以转到API网关找到ARN,单击您的 API,单击您的资源,单击您的方法:您将在 方法请求 块中找到 ARN:
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": "<the_arn_of_your_resource_api>"
}
- 点击查看政策,然后保存更改
我是 AWS 的新手,我想了解一些基本概念。在我的 Android 应用程序中,我使用:
- Cognito 用户池和身份池允许我的用户注册和登录,而且还可以作为 访客 用户 使用该应用程序
- API 网关和 AWS Lambda,用于创建应用程序可以调用的 Web 服务
我的用例非常简单:我希望我在 API 网关中创建的一些 API 可供我的经过身份验证的用户使用 和 我的来宾用户,以及其他 API 仅供我的经过身份验证的用户使用。
对于仅对我的经过身份验证的用户可用的 API,我正在考虑将用户放入一组用户中(感谢 CognitoIdentityServiceProvider.adminAddUserToGroup()
),这些用户可以与 IAM 具有共同的角色附加到它的策略,以允许他们访问那些 APIs。我认为这是有道理的,因为我会有不同类型的用户,所以我将为每种类型使用一个组。
但是对于我的认证用户和来宾用户可用的 APIs,我很确定我应该做什么。如果 API 是 public,那么它们可以被包括我的来宾用户在内的任何人调用,或者是否可以让它们只对我的认证用户和我的来宾用户可用,而不是 public?有哪些好的做法,我该如何实现?
感谢您的帮助。
您应该为此使用 "API Gateway Lambda Authorizers"。您可以按方法配置授权方。因此,只有为经过身份验证的用户保留的端点应该有一组。
它们是如何工作的?
每次请求到达配置了授权器的端点时,API 网关将使用 request
信息触发它。授权方然后检查 request
是否具有正确的凭据。如果是,则 IAM 策略是 returned。方法执行调用(例如另一个 Lambda 函数)将使用此策略。否则,授权方将 return 一个错误状态代码,例如 403 Access Denied
.
在您的情况下,由于您使用的是 Cognito,因此可以使用 Cognito User Pool Authorizer。您可以使用 Cognito 的 SDK 或 AWS cli
创建它。配置完成后,您唯一需要做的就是在用户身份验证后附加 Cognito 提供的 id
或 access
令牌。它通常在 Authorization
header.
希望对您有所帮助。
这是我使用控制台的做法:
- 在API网关中,点击资源,然后点击方法(GET, POST...)
- 单击方法请求
- 对于授权,选择
AWS_IAM
- 在 Cognito 中,选择管理身份池
- 创建(或编辑)您与 Cognito 用户池一起使用的身份池
- 在未经身份验证的身份块中,勾选允许访问未经身份验证的身份
- 在同一页面上(至少如果您编辑身份池),您还应该看到 已验证角色 和 未验证角色
- 转到 IAM,然后在 角色 中找到这两个角色
- 对于每个角色,单击它,然后在 权限 选项卡中,单击附加到该角色的策略以查看它(左侧有小箭头)
- 点击编辑策略,然后点击JSON选项卡,然后添加以下块(您可以转到API网关找到ARN,单击您的 API,单击您的资源,单击您的方法:您将在 方法请求 块中找到 ARN:
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": "<the_arn_of_your_resource_api>"
}
- 点击查看政策,然后保存更改