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

Posted

技术标签:

【中文标题】AWS Cognito 作为网站的 Django 身份验证后端【英文标题】:AWS Cognito as Django authentication back-end for web site 【发布时间】:2017-10-29 07:17:50 【问题描述】:

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

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

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

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

(1) 使用 Cognito 验证网站是浪费时间,它只是为了访问 AWS 资源

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

(3) https://github.com/capless/warrant、https://github.com/metametricsinc/django-warrant 是来自 aws 论坛的两种可能的解决方案。

【问题讨论】:

我在同一条船上。计划将 Cognito 用于移动原生应用程序和 Django 服务器后端背后的联合社交登录。真的很惊讶,那里至少没有一个身份验证后端。 我想用它来让我的网站看起来很漂亮,使用 2 因素身份验证,但除非他们开辟道路,否则它太复杂了。我发现 AWS for Python 上的“操作方法”指南往往已经过时,而且他们没有投入任何精力来更新它们。我在AWS Forum 上提出了同样的问题,但亚马逊技术人员尚未回复。 github.com/metametricsinc/django-warrant 【参考方案1】:

如果您正在阅读本文,您可能在 Google 上搜索了“aws cognito django”xD。

我只是想分享一下我为使这件事发挥作用所做的工作:

Django-Warrant。很棒的 aws cognito 包装包。 确保了解您当前的用户模型结构。如果您使用自定义用户模型,请不要忘记使用COGNITO_ATTR_MAPPING 设置对其进行映射。

更改您的身份验证以支持第 3 方连接。当您从客户端获取一些 Cognito 令牌时,使用 oAuth/JWT/Session 将其转换为您自己的令牌。

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

归根结底,这是一个伟大的快速身份验证解决方案。

【讨论】:

感谢您分享我们的项目,很高兴它对您有所帮助。 我对 django 很陌生。在尝试这个时,我得到了。未找到模板保证/login.html 不幸的是,django-warrant(和保证)似乎已无人维护。 PyPI 版本不适用于 Django 2.0。 截至 2021 年 7 月,软件包 django-warrant 尚未积极开发,有人可以建议一些替代软件包吗?【参考方案2】:

要添加到已接受的答案,我发现有一个简单但非常重要的额外步骤是在 Django 2.0 中使用 django-warrant 所必需的:

根包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-授权在身份验证过程中使用。该问题以与 Crypto._SHA256 文件相关的 FileNotFound 错误的形式出现。这个错误似乎是由于 pycryptodome 期望在 Windows(我正在开发的)和 Linux(Lambda 环境)上运行时不同的文件在 Crypto 包中可用。我最终通过下载 pycryptodome 的 Linux 版本并将其 Crypto 包与 Windows 版本的 Crypto 包合并来解决了这个问题。

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

注意:我最终使用的 pycryptodome 和 python-jose(不是 python-jose-cryptodome)的版本分别是 3.7.2 和 3.0.1。

【讨论】:

以上是关于AWS Cognito 作为网站的 Django 身份验证后端的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Amazon Cognito 作为我的网站(非移动应用程序)的用户身份验证 [关闭]

使用 AWS Cognito 和 Django 创建用户

AWS Cognito 与 django 休息框架反应 js?

Django - 在处理终端节点请求之前验证 AWS Cognito 令牌是不是有效

网站的 AWS Cognito 应用程序客户端设置

由于错误 AccessDeniedException(Lambda 别名作为 Cognito 触发器),AWS Cognito 用户池引发 PreSignUp 调用失败