【问题标题】:How to secure AWS REST back end for mobile access如何保护 AWS REST 后端以进行移动访问
【发布时间】:2020-05-06 19:30:25
【问题描述】:

我已经阅读了很多 AWS Amplify 和 Cognito 文档,但似乎没有为此描述直接的方法。

我有什么:

我有一个用 Swift 编写的 iOS 应用程序,后端设置在几个 lambda 函数中。我能够以通常的方式访问 REST 端点(就像任何公共 URL 一样)。

因此,我的 iOS 代码中没有集成 Amplify 或 AWS SDK。

我想要什么?

1) 包括用户管理:允许用户注册/登录(这已经在我的后端,但我愿意使用 Cognito)

2) 保护我的后端 API,以便只有经过身份验证的用户才能通过移动应用访问它。(我可以从 Postman 将它用于我自己的开发目的)

我所知道的:

我知道有 OAuth 2 (PKCE) 机制可用于从移动设备安全地访问 API,而无需客户端机密,但 AWS 并未明确说明使用哪些工具来真正实现它。 p>

我不介意使用 Cognito(如果一切顺利的话)或我自己的后端 lambda 进行用户管理。唯一的问题是该解决方案必须能够保护我的 REST API。

障碍:

看起来他们的文档非常分散,以至于

  • 根本不讨论 REST。 GraphQL 是,他们展示了一种很好的方式,如何使用 GraphQL 模型在 swift 代码中完成所有工作,但对于我的目的来说,这有点过头了。我想像世界上任何其他 REST 端点一样访问它,但以一种仅限于我的移动应用的安全方式访问它。

  • AWS SDKAmplify SDK 之间没有明显的区别(我从谷歌那里得到了一些提示,即 Amplify 处于更高级别并抽象了很多选择,但没有具体的内容)

    李>
  • Documentation on AWS 是非常概念化的,但不包含任何关于如何处理此特定用例的示例。

  • 我也看过一些很棒的 Youtube videos,但他们没有解决这个平台堆栈。

PS: 请不要再提供现成的文档链接。我已经经历了很多,除非他们中的任何一个直接解决我上面的问题,否则我怕他们无济于事。

更新

我发现了一些很好的examples Cognito 如何在移动应用程序中处理令牌+用户管理。但是,在这些示例中,注册似乎仍然没有令牌。在 app bundle 中公开 pool id 等详细信息,并假设任何人都可以使用 SDK 进行注册,则可以轻松获得令牌。即使使用自定义 lambda 授权器,使用智能字符串解析器/提琴手,端点也可以从应用程序包中公开,并且很可能滥用 API。

这些示例可能没有使用 PKCE(我认为它们使用了SRP)。或者我错过了一个关键步骤。

假设我使用 AppAuth 从 Cognito 端点获取令牌。如果我想使用 Cognito 用户名/密码对用户进行身份验证,这是否合理?

我也对重定向 URI 感到困惑。移动应用程序中的重定向是否必须获得令牌(即使我没有使用任何公共身份验证,如 Google/Facebook)?

【问题讨论】:

  • 你可以用放大做你想做的一切。

标签: ios oauth-2.0 aws-lambda amazon-cognito aws-amplify


【解决方案1】:

-> 使用 Cognito 进行身份验证以获得 Cognito 令牌。 ID、访问、刷新。

-> 将 Token 发送到 Rest API 并对发送的 JWT 令牌进行验证。[1]

另外:

-> Amplify Auth 组件非常适合用于登录/注册和管理您的令牌/会话。

-> 然后使用任何 HTTP 库将请求发送到 API。

-> 如果 API 将成为 API Gateway(由 Lambda 支持),那么您有更多选择。 Amplify 中的 API 组件将帮助发送请求,并且 API 网关上有 IAM/自定义 Lambda/Cognito 授权方选项,这些选项在使用 Cognito 作为 IDP 时都是有效的选项。

[1]https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html

【讨论】:

    【解决方案2】:

    我始终采用基于标准的方法,而不是特定于 AWS 的方法,因为您的目标是构建具有最佳未来选项的出色 UI 和 API。

    我下面基于教程的博客链接不包括 Amplify,但我认为它们与您相关。使用这项技术可能会有相当长的学习曲线。

    • 这里是 some code of mine,用于在 API 中验证 Cognito 令牌。

    • 我有使用 Cognito 令牌调用 API 的云托管版本的工作演示 Web 和移动 UI - 您可以从 this page 快速运行 UI。

    博客的索引页面有许多分步指南,例如解释无服务器 API 和 running it on your PC,尽管有些帖子很长且详细。

    如果您发现其中的任何内容有用,请随时发布任何后续问题。

    【讨论】:

    • +1 很棒。那里有一些非常好的信息。我还没有找到一个例子,有人在不使用 Amplify 或此类 SDK 的情况下从原生移动应用程序中完成所有操作。但这篇文章真的很有帮助。谢谢。
    • 想知道my Android app 是否符合您的目标?我想尽快用 SwiftUI 做同样的事情 - 也许有机会就解决方案进行合作?
    • 不错的链接。 AppAuth 是您的仓库吗?我对 Android 不太了解,并且我研究了一段时间的 AWS iOS SDK,但似乎他们已经过时了,取而代之的是 Amplify。基本上我想使用任何更通用/更纯粹的东西,而不依赖于 3rd 方 SDK。我想知道 AppAuth 是否免费。我遇到了 Okta 和 Auth0,但他们不是。
    • AppAuth 是一个免费库,您可以将其包含在您的移动应用程序中。集成它并处理所有问题具有挑战性——尽管它是推荐的选择。实际的授权服务器可能会花费公司很多钱——作为开发人员,您可以从 AWS Cognito 之类的免费服务器开始。
    • AppAuth 仅适用于移动应用。对于 lambda,您通常会将它们托管在 API Gateway 后面,并使用内置网关 Cognito 验证或自定义 lambda 授权器来验证令牌。我发现第二个选项最好,因为您可以在开发人员 PC 上运行相同的逻辑。 lambda 授权者编写一个策略文档,其中的声明被传递给 lambda。棘手 - 但我上面的链接有文字和代码示例
    猜你喜欢
    • 2017-10-30
    • 2021-07-16
    • 2017-03-18
    • 1970-01-01
    • 2014-09-05
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多