【问题标题】:AWS Cognito Correct User FlowAWS Cognito 正确的用户流程
【发布时间】:2020-06-15 23:24:04
【问题描述】:

我正在尝试将我的基于 PHP 的系统迁移到 AWS,但我遇到的最大问题是用户管理/身份验证方面的事情。我制作了 API 网关和 Lambda 函数来从我的 RDS 实例中获取数据,并且我可以使用 API 密钥或 ID 令牌进行身份验证以保护它们生成的数据。我真正苦苦挣扎的是 Cognito 方面的事情。在我的脑海中,系统会按如下方式工作?

  1. 用户访问我的网站并单击登录按钮。
  2. 用户被重定向到托管的认知用户界面并登录。
  3. 用户被重定向到所选页面,并且 id 令牌显示在 URL 中
  4. 我使用 JavaScript 将 ID 令牌存储在本地存储中(不确定这是正确的方式)
  5. 然后我可以提取 ID 令牌并在 SDK 中使用它来运行和验证我的 API

在 PHP 中,我会在加载页面之前检查会话是否存在,以防止未登录的用户访问我的系统,如果会话不存在,他们将被重定向到登录页面。如何使用 Cognito/JWT 执行此操作,我是否需要在我的站点的每个 HTML 页面顶部使用 Lambda 函数验证 JWT?我基本上只想允许通过 Cognito 用户池登录的用户访问我系统的所有 HTML、js、CSS 文件,主页除外。

【问题讨论】:

  • 您如何托管静态内容?如果它由服务器(节点、php 等)托管,您可以检查令牌的标头,然后有条件地呈现您的应用程序,就像您处理会话一样。如果您托管的是纯静态内容(例如在 s3 中),那么您必须在客户端的应用程序上保护路由。但总的来说,保护你的 CSS 和其他静态内容会很困难
  • @RobertMoskal 我还没有真正考虑过托管。我的 API 返回 JSON 数据,因此我将使用 javascript 将其解析为表、链接等,就像我在 PHP 中使用从数据库返回的数组一样。这真的很烦人,因为我确切地知道我希望我的系统如何工作我只是没有编码和 AWS 的知识来找出我应该做的确切方式。托管在全栈 Web 服务器上不是问题,我想它可以让我使用我非常熟悉的 PHP。
  • @RobertMoskal *" 如果您托管纯静态内容(如在 s3 中),那么您必须在客户端的应用程序上保护路由。" - 我不认为它必须是客户端?如果您的 S3 前面是 Cloudfront 发行版,您可以通过 Lambda@Edge 来完成
  • 是的。一个可以做到的!那将是一条路!

标签: javascript amazon-web-services jwt amazon-cognito


【解决方案1】:

听起来你已经解决了大部分认知问题。

如果您从 Web 客户端调用 api 网关,您很可能会在标头中传递该 jwt 令牌,并且这些 api 调用将在用户登录之前失败。

如果您使用的是客户端框架(React、Vue 等),那么您可能可以访问渲染各种 UI 组件的路由器。这与您在 php 中的服务器上所做的工作类似,并且非常容易锁定某些路由或基于用户登录的某些组件的呈现。在没有框架的情况下执行此操作可能需要大量的努力。

您还可以建立一个 php 服务器,验证 jwt 令牌并执行您通常为经过身份验证的用户所做的事情。

或者您可以采用超现代的无服务器方法。您可以将 html/css 托管在 S3 存储桶中,并在其前面放置一个 Cloudfront 发行版。您可以编写一些 Lambda@Edge 函数来对 S3 存储桶中的内容强制执行权限。

如果您正在创建基于 api 的 javascript 应用程序,您可能不需要保护您的标记/css。

【讨论】:

  • 非常感谢,我必须承认我不知道 Cloudfront 发行版是什么,但我明天会进行研究。我喜欢构建我的想法,API Gateway 和 Lambda 非常易于学习和使用,但真正保护我的系统的身份验证和授权方面是一场噩梦 ?。非常感谢您花时间帮助我。
  • @MattM - 您可能会发现 this AWS Serverless App Repo example 很有帮助。它说明了 S3-Cloudfront-Cognito 方法。
猜你喜欢
  • 1970-01-01
  • 2015-05-25
  • 2022-07-05
  • 2016-01-03
  • 2018-02-22
  • 2020-04-14
  • 1970-01-01
  • 2021-06-02
  • 2019-09-02
相关资源
最近更新 更多