dan*_*nca 5 python django jwt django-rest-framework amazon-cognito
我正在尝试设置一个 AWS Cognito 后端,我有一个 React 前端已经在使用它,现在我需要我的 DRF API 来使用 Cognito 作为后端进行身份验证。
我为此找到了一些 Python 包,它们似乎都没有得到积极维护 django- warrant 不适用于 Django3 并且几乎已经死了
Django Cognito JWT似乎是我最好的选择,但也没有积极维护,文档很差,并且有一篇关于如何使用的中等帖子,不是很详细,但总比没有好。
所以,我试着按照文档
在我的设置中添加了环境变量
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
Run Code Online (Sandbox Code Playgroud)
然后在我的 DRF 身份验证类上:
'DEFAULT_AUTHENTICATION_CLASSES': [
'django_cognito_jwt.JSONWebTokenAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
Run Code Online (Sandbox Code Playgroud)
最后是用户模型:
AUTH_USER_MODEL = 'accounts.MyUser'
COGNITO_USER_MODEL = "accounts.MyUser"
Run Code Online (Sandbox Code Playgroud)
我的自定义用户模型:
class MyUser(AbstractUser):
"""User model."""
username = None
email = models.EmailField(_('email address'), unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
Run Code Online (Sandbox Code Playgroud)
我也在使用 DRF JWT 包,如果我尝试使用 Cognito 用户登录,例如:
curl -X POST -H "Content-Type: application/json" -d '{"email":"user@invalid.com","password":"secretpassword"}' http://localhost/api-token-auth/
我收到一个错误
{"non_field_errors":["Unable to log in with provided credentials."]}
另一方面,如果我尝试通过 Django Rest Framework JWT 使用本地 Django 用户登录,它可以正常工作并且我得到 JWT 令牌作为响应,所以我猜问题是 Cognito 集成。
知道我错过了什么吗?或者我如何调试才能弄清楚发生了什么?
更新
在深入研究代码之后,我发现了一些事情:
即使进行 DRF JWT 身份验证,代码最终还是在: django/contrib/auth/ init .py 循环遍历 Django 的所有身份验证后端,而不是 DRF:
for backend, backend_path in _get_backends(return_tuples=True):
Run Code Online (Sandbox Code Playgroud)
仍然使用ModelBackend来验证用户。
所以,我想我还需要为 Django 添加一些 Cognito 身份验证后端。我检查了我是否可以使用 DRF 上使用的相同后端,但后来我收到了无效参数的错误:
TypeError: authenticate() got an unexpected keyword argument 'email'
更新 2 似乎问题之一是因为我使用电子邮件而不是用户名进行身份验证,并且似乎没有任何软件包支持它
基本上,有两个步骤可以实现您的目标。
Authorization Bearer IdToken通过 调用 API curl。与 不同rest_framework_jwt,django_cognito_jwt仅在标头处处理 JWT 令牌。django_cognito_jwt不包括第 1 步。这就是您收到此错误的原因 TypeError: authenticate() got an unexpected keyword argument 'email'。
因此,解决方案是使用 boto3通过传递标头来获取IdToken和应用。curlAuthorization:Bearer IdToken
| 归档时间: |
|
| 查看次数: |
2125 次 |
| 最近记录: |