【问题标题】:AWS Cognito - help understanding authenticated vs. unauthenticated accessAWS Cognito - 帮助了解经过身份验证与未经身份验证的访问
【发布时间】:2019-01-29 07:25:00
【问题描述】:

我不明白身份验证。与未经授权的。 AWS Cognito 中的用户访问权限。在学习 Cognito 时,我在 Internet 上看到了几篇文章,并在 Stackoverflow 中发现了与此相关的问题,但我只是没有理解这个概念。

我正在收集一个简单的 unauth 用例。 Cognito 中的用户访问是指我们的用户需要访问一些拥有帐户但未“登录”的 AWS 资源。但这怎么可能?另外要获得访问令牌,您不需要有效的用户名和密码吗?如果通过未经身份验证。我们的意思是拥有有效访问令牌但无法访问某些资源 [基于某些用户池参数] 的用户,我认为这是有道理的,但我不明白 Cognito 在这方面是如何工作的。

在没有掌握这个概念的情况下,我已经搜索了几个小时,如果有人愿意分享,我真的只需要社区的一点帮助。

更新:让我感到困惑的是“unauth”。已经是未登录用户了,不是吗?为什么我必须或想要为未登录的用户获取访问令牌?这样做的目的是什么?

【问题讨论】:

  • Authenticated 表示已完成身份确认过程。未经身份验证意味着用户尚未经历该过程,因此您不认识他们。考虑一下这个网站 - 未经身份验证的用户(可能有也可能没有帐户)可以阅读任何帖子并可以向他们发布答案,但没有其他内容(没有投票、评论、编辑等)。经过身份验证的用户通常可以做得更多,因为 SO 知道他们是谁以及他们获得了哪些特权。
  • 但是你不是默认未认证的吗?这就是我的困惑。未经授权的用户和互联网用户有什么区别?
  • 您为什么认为未经身份验证的互联网上的用户之间必然存在差异?
  • 我们为 Cognito 用户池中未经身份验证的用户创建了一个 IAM 角色。所以有定义。不同。
  • 约翰,你真的很敏锐,看起来很懂你的东西。我只是不明白这个。有什么地方可以让我了解更多吗? AWS 文档对我来说没有意义。

标签: amazon-web-services amazon-cognito aws-cognito


【解决方案1】:

在开始使用 AWS Cognito 时令人困惑的是,它实际上是两种服务。 Cognito 用户池是一个用户存储,验证用户和 Cognito 身份池授权用户。

未授权:

当提到未经身份验证的流程时,您将跳过身份验证过程,实际上只是使用身份池进行授权。要在代码中执行此操作,您需要设置凭据提供程序,然后调用 GetID。这会在身份池中生成一个身份 ID,并检索授权令牌,这些令牌根据 IAM 角色为未经身份验证的用户提供访问权限。 Example here

授权:

现在对于经过身份验证的流程,在您使用身份池进行授权之前,您必须拥有身份验证令牌。这些可以通过第三方(例如 Facebook)或 Cognito 用户池的身份验证来检索。您通过提供用户名/电子邮件和密码来对这些服务进行身份验证。然后可以将这些服务提供的令牌“传递”给凭证提供者。以这种方式完成后,使用身份池进行授权将返回访问令牌,这些令牌根据 IAM 角色为经过身份验证的用户提供访问权限。此外,用户可以“注销”,然后再“重新登录”,他们将能够收到与他们第一次获得身份池授权时为他们生成的相同身份 ID。

我希望一切都有意义。我将举例说明为什么您可以将两者结合起来

示例

假设我们正在构建一个列出我们城市周围活动的网络平台。该平台需要:

  • 在数据库中存储事件

  • 允许城市组织者将活动添加到数据库中

  • 允许居民查看活动

我们不希望居民必须登录才能查看公开列出的事件,因此当他们访问我们网站的事件页面时,他们不知道,他们实际上使用身份池进行授权。因此,他们获得了未经身份验证的 IAM 角色访问权限,以对我们的数据库进行 GET API 调用,以检索事件。

当然,我们不希望任何人向数据库添加事件。所以对于城市组织者来说,有一个登录表格。此登录表单采用用户名和密码来使用用户池对其进行身份验证。然后使用用户池令牌对身份池进行授权,授予他们身份验证 IAM 角色访问权限以对我们的 API 进行 POST 调用,从而允许他们向我们的数据库添加事件。

【讨论】:

  • 谢谢,非常有帮助而且非常清晰。只有一个后续问题 - 为什么我需要获得身份验证。不会登录的用户的代码。我不能通过向公众提供资源来让他/她在没有任何身份池和/或用户池的情况下访问资源。为未登录的用户获取授权码似乎效率较低。
  • 如果通过身份验证代码表示来自身份池的令牌,那么,您需要这些,因为 AWS 仍然需要知道调用者的角色。如果没有角色,他们可能会进行任何他们想要的调用,包括管理员调用甚至 EC2 实例更改,从而导致安全和计费风险。您可以做的是使用 API Gateway 和 Lambda 设置一个 API,其端点不需要任何类型的 auth/unauth/IAM 签名。这样一来,IAM 角色提供的安全性被置于您的后端 Lambda 函数(或您选择使用的任何函数)上,用户可以直接调用您的 API。
  • 有两种情况: 1.) 访问受保护的 AWS 资源 - ...在这种情况下,我理解为什么我们需要访问令牌,因为我们不希望 Internet 上的每个用户都制作使用我们的基础设施。 2.) 访问不需要登录的资源 - ......在这种情况下,无论我们是通过不需要登录的用户池获取身份验证代码,还是使其公开可用。 ...它具有相同的效果。让资源公开使用不是更容易吗?比如文件的 S3 存储桶?授权代码与公开可用的相比有什么好处?
  • 啊,我明白了。在像 S3 这样的情况下,如果您确实确定它可以公开使用,则无需将 auth 与 Cognito 一起使用。但请注意计费风险,请参阅此问题了解更多信息:serverfault.com/questions/888487/…
猜你喜欢
  • 2016-01-17
  • 2019-09-25
  • 2017-07-01
  • 2018-03-29
  • 2017-05-31
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多