【问题标题】:How to use both service-to-service AND Cognito auth for API Gateway如何为 API Gateway 使用服务到服务和 Cognito 身份验证
【发布时间】:2020-01-20 22:23:53
【问题描述】:

我有一个通过 AWS API Gateway 访问的 RESTful API。我希望两个人类用户(通过 Cognito 进行身份验证)和其他(内部)服务都能够调用 API。有很多关于如何做的文档,但没有关于如何做both的文档。

我尝试使用未经身份验证的 Cognito 联合身份来授权服务。我还使用 Cognito 用户池对 people 进行身份验证。但是,API Gateway 只允许一个授权者(在这种情况下,AWS_IAM 或一个 Cognito 授权者)。但是,我看不出两者兼得。

我想我需要一个自定义 Lambda 授权方,但我很难找到有关如何使用 IAM 或 Cognito 编写授权方的准确信息。

当然,我们不可能是第一个希望允许服务和人类访问 API 的人。这样做的文档缺乏使我相信我要么错过了一些非常明显的东西,要么这是一个最好避免的用例(在这种情况下,最佳实践是什么?)。

有什么办法可以同时做到这两点吗?是否有一个 Lambda 授权人示例可以为我指明正确的方向?有什么我缺少的内置功能吗?

我们拒绝“假装” Cognito 用户是人类的想法,而实际上它实际上是一项服务,因为在我们看来这似乎是对 Cognito 用户池和身份联合的滥用。同样,相反,Cognito 用户被联合起来充当用户和服务共享的 IAM 角色,这似乎是对用户身份验证的滥用。

有没有规范的方法可以做到这一点?如果没有,是否有现有文档说明如何编写自定义 Lambda 授权方来同时执行这两项操作?

【问题讨论】:

    标签: amazon-web-services authorization aws-api-gateway amazon-cognito amazon-iam


    【解决方案1】:

    简短的回答是:您(可能)在这两种情况下都不需要使用 API Gateway。

    API 网关,顾名思义,只是一个网关。它接受一个请求(通常是 HTTP)并将其转发到另一个位置(一个 Lambda 函数、一个 EC2 实例、另一个 AWS 服务或另一个 HTTP 端点)。如果您需要没有关联 IAM 角色的用户访问 AWS 服务,这非常有用。

    通过 Cognito 进行身份验证的用户通过关联的 Cognito 身份池具有关联的 IAM 角色。只需通过这种方式让他们访问 AWS 服务,无需通过 API 网关。

    需要访问其他 AWS 服务的 AWS 服务不需要通过 API Gateway,它们需要通过其 IAM 角色获得权限。

    如果由于某种原因您必须为您的用户和服务使用 API 网关,请创建两个指向使用不同身份验证方法的相同资源的 API 网关。

    【讨论】:

    • 感谢您的信息。我们确实需要使用 API 网关来实现类似 RESTful 的接口,同时通过 Lambda 部署底层 API(使用 serverless 框架)。我们有一个 SPA UI,它调用 Lambda 函数,就好像它们是 RESTful 一样,因此我们可以抽象实际的 lambda 调用,以防我们以后想要更改架构。 (我没有包含此信息,因为它与我的问题不太相关。)我试图避免两个网关实例,因为这也意味着对相同功能的维护加倍,但也许这是“正确的”方式。
    • 您不需要 API Gateway 即可拥有 RESTful 接口。在前端使用 AWS 开发工具包,您只需直接调用 InvokeFunction 方法来调用您的 Lambda 函数。这是最流行的用例,可以无缝处理 Cognito 身份验证。
    • 实际应用程序是使用 Python 的烧瓶框架编写的,该框架被部署为 Lambda 函数,并通过 API Gateway 实现了 RESTful。我们希望使用它,以便我们也可以在本地进行测试,如果需要,可以更改为经典的服务器架构。使用 API Gateway,如果我们最终更改后端的部署方式,前端不必更改。除非我在这里遗漏了什么?
    • 好吧,如果你想改变后端架构并希望对前端进行零更改,API Gateway 是正确的选择。但我想指出,API Gateway 并不是让您的无服务器架构成为 RESTful 的原因,Lambda 已经是 RESTful,API Gateway 只是将您的请求转发给该函数。使用 Cognito 和 Lambda 的一大好处是您不必担心这一点,身份验证完全通过 IAM 处理。
    • 最后一句话是我不确定的。 Cognito 不允许我访问经常用于 IAM 身份验证的标准 IAM 凭证(访问密钥 ID 和秘密访问密钥)。获取这些凭据需要IdentityId,我还没有找到任何方法从经过身份验证的 Cognito 用户那里获取它,只有id_token,这是不一样的。也就是说,我想得越多,您对相同功能的两个网关的建议可能是我们要完成的任务最少的麻烦(维护量最少)。
    猜你喜欢
    • 2016-08-20
    • 2019-01-24
    • 2020-06-24
    • 2020-04-05
    • 2017-10-05
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多