AWS Lambda、AWS API 网关和保护 REST 端点

AWS Lambda, AWS API Gateway and Securing REST endpoints

我正在考虑在 AWS Lambda 和可能的 AWS API 网关上将服务实现为一系列 REST 端点。前端将是一个直接调用这些端点的 JS 浏览器客户端,从而消除了对中间层的需求。

在我的研究中,我似乎无法找到的是,我如何确保 "logged in" 可以安全地访问通话?我看到 Lambda 调用是无状态的,因此没有会​​话数据。我不需要会话数据,除了知道它们已经过身份验证并且在相同情况下被授权访问特定端点之外。将有一个数据库(DynamoDB 或 RDS),所以如果我需要会话数据,我可以创建它。

有办法吗?我意识到我可以在每次 API 调用时传递他们的用户名和密码,但似乎必须有更好的方法。

此外,这可能会在 Java 中实现。我可以使用 Spring 安全性吗?

我认为您不想在 Lambda 函数中使用 Spring 安全性。我无法想象它会工作得很好,而且我怀疑它是否会工作。即使它可以 运行 在 Lambda 上它肯定会增加你的函数的冷启动时间,而不是你想要处理的。

向无状态服务提供用户身份验证检查的推荐方法是使用 JWT(JSON Web 令牌)。 Auth0 提供了一篇关于 JWT here, as well as a tutorial on using Auth0 with API Gateway and Lambda here 的很好的综合文章。即使您不使用 Auth0,我认为第二个教程对于了解如何在 API 网关和 Lambda 上执行用户身份验证很有用。

您还可以使用 API Gateway Custom Authorization 函数,它允许您将所有身份验证代码封装在一个 Lambda 函数中,该函数的作用类似于 "gatekeeper" 到您的 API 端点。我建议使用自定义授权 Lambda 函数来验证提交给您的 API.

的 JSON 网络令牌

为了保护您的 API 网关端点,您可以考虑使用 AWS Signature V4, using Cognito authorization token or Lambda(custom) Authorizer which can be set up relatively easy. There are other options. Check out AWS document 签署您的请求。

您可以使用 CloudFormation 模板或通过 AWS 控制台设置其中之一。在 front-end,您可以使用 AWS Amplify 库对请求进行签名。

查看 this article 如何保护对 API 网关的访问。