gpt4 book ai didi

python - AWS Cognito for Django3 + DRF 身份验证

转载 作者:行者123 更新时间:2023-12-01 06:22:12 24 4
gpt4 key购买 nike

我正在尝试设置 AWS Cognito 后端我已经有一个 React 前端在使用它,现在我需要我的 DRF API 使用 Cognito 作为后端进行身份验证。

我为此找到了一些 Python 包,但似乎没有一个得到积极维护 django-warrant不适用于 Django3 并且几乎已经死了

Django Cognito JWT似乎是我最好的选择但也没有积极维护,文档很差,有一个medium post关于如何使用,不是很详细,但聊胜于无。

所以,我尝试遵循文档

在我的设置中添加了环境变量

COGNITO_AWS_REGION = 'us-east-1'
COGNITO_USER_POOL = 'us-east-1_xxxxxxx' # same user pool id I'm using on the React app
COGNITO_AUDIENCE = 'XXXXXXXXXXXXXXXXXXXXXX' # the same client id I'm using on the React app

然后在我的 DRF 身份验证类上:

    'DEFAULT_AUTHENTICATION_CLASSES': [
'django_cognito_jwt.JSONWebTokenAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
],

最后是用户模型:

AUTH_USER_MODEL = 'accounts.MyUser'
COGNITO_USER_MODEL = "accounts.MyUser"

我的自定义用户模型:

class MyUser(AbstractUser):
"""User model."""

username = None
email = models.EmailField(_('email address'), unique=True)

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []

objects = UserManager()

我也在使用 DRF JWT 包,如果我尝试使用 Cognito 用户登录,类似于:

curl -X POST -H "Content-Type: application/json"-d '{"email":"user@invalid.com","password":"secretpassword"}' http://本地主机/api-token-auth/

我收到错误

{"non_field_errors":["无法使用提供的凭据登录。"]}

另一方面,如果我尝试通过 Django Rest Framework JWT 使用本地 Django 用户登录,它工作正常,并且我得到 JWT token 作为响应,所以我猜问题出在 Cognito 集成上。

知道我错过了什么吗?或者我如何调试才能弄清楚发生了什么?

更新

深入研究代码后,我发现了一些事情:

即使进行 DRF JWT 身份验证,代码最终也会出现:django/contrib/auth/init.py它循环遍历 Django 的所有身份验证后端,而不是 DRF:

for backend, backend_path in _get_backends(return_tuples=True):

仍然使用ModelBackend来验证用户身份。

所以,我想我还需要为 Django 添加一些 Cognito 身份验证后端。我检查了是否可以使用 DRF 上使用的相同后端,但随后出现参数无效的错误:类型错误:authenticate() 收到意外的关键字参数“email”

更新 2问题之一似乎是因为我使用电子邮件而不是用户名进行身份验证,并且没有一个软件包似乎支持它

最佳答案

基本上,有两个步骤可以实现您的目标。

  1. 通过 Boto3 库从 Cognito 获取 IdToken 和 AccessToken。
  2. 应用此模式Authorization Bearer IdToken中的IdToken通过curl调用API。

rest_framework_jwt 不同,django_cognito_jwt 仅处理 header 中的 JWT token 。 django_cognito_jwt 不涵盖第 1 步。这就是您收到此错误的原因 TypeError:authenticate() got an Unexpected keywords argument 'email'

因此,解决方案是使用 boto3 获取 IdToken 并通过传递 Authorization:Bearer IdToken header 应用 curl

关于python - AWS Cognito for Django3 + DRF 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60309604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com