AWS Cognito 作为网站的 Django 身份验证后端



我对Cognito的理解是,它可以代替本地Django管理数据库来验证网站的用户。 但是,我没有找到任何基本的"Hello,World"应用程序的示例,该应用程序具有通过Cognito的登录屏幕。 如果有人可以发布一篇文章,逐步展示如何创建 Hello World Django 应用程序和 Cognito 用户池,以及如何将 Django 中的默认身份验证替换为对 AWS Cognito 的调用,我将不胜感激。

特别是,我需要知道如何从 Cognito 管理站点收集信息,这些信息是设置对 Cognito API 的调用以对用户进行身份验证所需的。

有两种情况需要考虑:应用程序用户登录到应用程序,以及管理员登录到站点的 django 管理员 URL。 我假设我想在这两种情况下都使用 Cognito,否则我会留下一个潜在的漏洞,即管理员 URL 使用较弱的登录技术。

目前在AWS论坛和StackExchange上的答案要么说:

(1) 使用 Cognito 对网站进行身份验证是浪费时间,它仅用于访问 AWS 资源

(2)这不是浪费时间。 我快要放弃了。 我甚至创建了一个示例 Cognito 用户池和用户组,并在网络上搜索此用例的适当示例。 (没有找到,否则我不会写。

(3) https://github.com/capless/warrant,https://github.com/metametricsinc/django-warrant 是 AWS 论坛中的两种可能的解决方案。

如果你正在读这篇文章,你可能用谷歌搜索了"aws cognito django" xD。

我只想分享我为了让这件事发挥作用所做的事情:

  • 姜戈-授权。伟大的 aws cognito 包装包。
  • 确保了解您当前的用户模型结构。如果使用自定义用户模型,请不要忘记使用COGNITO_ATTR_MAPPING设置映射它。
  • 更改身份验证以支持第三方连接。当您从客户端获得一些 Cognito 令牌时,请使用 oAuth/JWT/Session 将其转换为您自己的令牌。

  • 重新考虑您的登录/注册过程。您想要不同的注册吗?django-warrant 包支持它...

归根结底,这是快速身份验证的绝佳解决方案

为了补充公认的答案,我发现在 Django 2.0 中使用 django-warrant 需要采取一个简单但非常重要的额外步骤:

根包中的条件 in backend.py 需要从以下位置更改:

if DJANGO_VERSION[1] > 10

自:

if DJANGO_VERSION[1] > 10 or DJANGO_VERSION[0] > 1:

将 django-warrant 与 Zappa 和 AWS Lambda 结合使用:

我正在从事的项目还使用 Zappa 将我的 Django 应用程序无服务器部署到 AWS Lambda。虽然上面的代码在本地测试时为我修复了 django-warrant,但在将应用程序部署到 Lambda 环境后,我遇到了另一个重大问题,源于 django-warrant 的一些支持包 - 主要与 python-jose-pycryptodome 有关,django-warrant 在身份验证过程中使用。该问题以与Crypto._SHA256文件相关的FileNotFound错误的形式表现出来。此错误似乎是由于pycryptodome期望在Windows(我正在开发)和Linux(Lambda环境)上的运行时在Crypto包中提供不同的文件。我最终通过下载 Linux 版本的 pycryptodome 并将其加密包与 Windows 版本的加密包合并来解决此问题。

TLDR:如果您想将 django-warrant 与 AWS Lambda 一起使用,并且您正在 Windows 机器上进行开发,请确保下载 Linux 版本的 pycryptodome 并将其 Crypto 包与 Windows 版本中的相同包合并。

注意:我最终用于实现上述目标的pycryptodome和python-jose(不是python-jose-cryptodome)的版本分别是3.7.2和3.0.1。

最新更新