用于 Django3 + DRF 身份验证的 AWS Cognito

     2023-03-08     236

关键词:

【中文标题】用于 Django3 + DRF 身份验证的 AWS Cognito【英文标题】:AWS Cognito for Django3 + DRF Authentication 【发布时间】:2020-06-04 04:03:08 【问题描述】:

我正在尝试设置 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://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):

仍然使用ModelBackend 对用户进行身份验证。

所以,我想我还需要为 Django 添加一些 Cognito 身份验证后端。 我检查了是否可以只使用 DRF 上使用的相同后端,但随后出现无效参数错误: TypeError: authenticate() got an unexpected keyword argument 'email'

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

【问题讨论】:

是适合您问题的this 答案之一吗? 不,这些答案与 AWS Cognito 无关 您确定问题完全出在 Cognito 上吗?这是默认的 DRF 消息,而不是 Cognito 的特定消息。 是的,通过 DRF JWT 的身份验证有效,我将使用此信息更新问题 您的设置是否正常工作?也在努力应对 react 和 drf。 【参考方案1】:

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

    通过 Boto3 库从 Cognito 获取 IdToken 和 AccessToken。 应用此 Pattern Authorization Bearer IdToken 中的 IdToken 以通过 curl 调用 API。

rest_framework_jwt 不同,django_cognito_jwt 仅处理标头处的 JWT 令牌。 django_cognito_jwt 不包括第 1 步。这就是您收到此错误 TypeError: authenticate() got an unexpected keyword argument 'email' 的原因。

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

【讨论】:

带有 DRF 的 cookie 的 Nuxt 身份验证

】带有DRF的cookie的Nuxt身份验证【英文标题】:NuxtauthwithcookieswithDRF【发布时间】:2021-05-1202:33:11【问题描述】:我正在尝试在我的前端(用NuxtJS编写)上使用cookie而不是本地存储来实现身份验证。我使用的是nuxt-auth包,配置如下... 查看详情

DRF:“详细信息”:“未提供身份验证凭据。”

】DRF:“详细信息”:“未提供身份验证凭据。”【英文标题】:DRF:"detail":"Authenticationcredentialswerenotprovided."【发布时间】:2018-03-0516:43:59【问题描述】:我是djangorest框架的新手,我无法弄清楚为什么会这样。我... 查看详情

邮递员的 DRF HawkREST 身份验证失败

】邮递员的DRFHawkREST身份验证失败【英文标题】:DRFHawkRESTauthenticationfailedwithpostman【发布时间】:2020-05-2716:36:37【问题描述】:我正在使用这个库:https://hawkrest.readthedocs.io/en/latest/在我的settings.py:REST_FRAMEWORK=\'DEFAULT_AUTHENTICATION_C... 查看详情

Django:基于 DRF 令牌的身份验证 VS JSON Web 令牌

】Django:基于DRF令牌的身份验证VSJSONWeb令牌【英文标题】:Django:DRFTokenbasedAuthenticationVSJSONWebToken【发布时间】:2015-10-1412:49:03【问题描述】:我正在构建一个真实世界的应用程序,用户将主要从Android、iOS设备以及桌面访问该应... 查看详情

仅在 DRF 中进行身份验证时才检查 CSRF?

】仅在DRF中进行身份验证时才检查CSRF?【英文标题】:CSRFisonlycheckedwhenauthenticatedinDRF?【发布时间】:2018-08-2219:47:40【问题描述】:TLDR;如果客户端具有经过身份验证的会话,我的POST(到DRF端点)似乎仅受CSRF保护。这是错误的... 查看详情

DRF+非DRF联合认证

...】:2021-06-0506:03:57【问题描述】:我是Django和基于令牌的身份验证的新手,并且有一个来自django(非DRF)的多页面站点和标准的基于会话的身份验证,以及一个在DRF和JWT身份验证上使用graphQL的反应应用程序。它们位于不同的子... 查看详情

DRF - 未提供身份验证凭据

】DRF-未提供身份验证凭据【英文标题】:DRF-Authenticationcredentialswerenotprovided【发布时间】:2019-04-2615:08:03【问题描述】:我正在使用pythonrequests模块测试djangorest框架,但它说错误。我只是初学者rest-api开发人员。DRF设置main.pyimport... 查看详情

NextJs 身份验证与针对 DRF 的 Next-Auth

】NextJs身份验证与针对DRF的Next-Auth【英文标题】:NextJsAuthenticationwithNext-AuthagainstDRF【发布时间】:2021-02-0322:11:23【问题描述】:我有一个退出的Django项目,我正试图从模板转移到NextJs前端。我遇到了Next-Auth-js,它在NextAuth中似乎... 查看详情

DRF 总是返回“未提供身份验证凭据”

】DRF总是返回“未提供身份验证凭据”【英文标题】:DRFalwaysreturning"Authenticationcredentialswerenotprovided"【发布时间】:2016-03-1709:03:36【问题描述】:更新:从Nginx配置中删除了set_header令牌。意识到这对问题没有帮助。我觉... 查看详情

在 Django (DRF) 中使用外部 API 进行基于令牌的身份验证

】在Django(DRF)中使用外部API进行基于令牌的身份验证【英文标题】:UsingexternalAPIfortokenbasedauthenticationinDjango(DRF)【发布时间】:2020-06-2316:02:48【问题描述】:上下文我的API接受一个jwt-token,我可以将其传递给外部端点,如果无效/... 查看详情

未提供身份验证凭据 drf

】未提供身份验证凭据drf【英文标题】:Authenticationcredentialswerenotprovideddrf【发布时间】:2020-01-1112:41:26【问题描述】:当我尝试访问api时出现此错误:"detail":"Authenticationcredentialswerenotprovided."我已将其包含在settings.py中:REST_FRAMEW... 查看详情

在 Django(drf 和 simplejwt)中究竟应该如何实现基于 JWT 的身份验证?

】在Django(drf和simplejwt)中究竟应该如何实现基于JWT的身份验证?【英文标题】:HowexactlyshouldJWT-basedauthenticationbeimplementedinDjango(drfandsimplejwt)?【发布时间】:2021-05-0709:05:16【问题描述】:我很难准确理解在Django中应该如何实现基... 查看详情

Django Rest Framework(DRF) Json Web Token(JWT) 身份验证和登录过程

】DjangoRestFramework(DRF)JsonWebToken(JWT)身份验证和登录过程【英文标题】:DjangoRestFramework(DRF)JsonWebToken(JWT)AuthenticationandLoginProcess【发布时间】:2018-02-1205:07:18【问题描述】:我想为我的项目实现JWT身份验证,因为这似乎是所有身份验... 查看详情

DRF 简单 jwt 从用户实例获取身份验证令牌或更改用户名和密码组合

】DRF简单jwt从用户实例获取身份验证令牌或更改用户名和密码组合【英文标题】:DRFsimplejwtgettingauthtokenfromauserinstanceORchangeusernameandpasswordcombination【发布时间】:2021-02-2507:51:12【问题描述】:我有一个聊天应用程序,它使用与What... 查看详情

DRF JWT 身份验证对象没有属性“id”

】DRFJWT身份验证对象没有属性“id”【英文标题】:DRFJWTAuthenticationobjecthasnoattribute\'id\'【发布时间】:2020-07-3021:12:20【问题描述】:我正在使用库suggestedbyDRF(djangorestframework_simplejwt),使用安装pipinstalldjangorestframework_simplejwt将其添... 查看详情

无法使用用户名/密码登录令牌端点:drf 令牌身份验证和自定义用户模型,Django

】无法使用用户名/密码登录令牌端点:drf令牌身份验证和自定义用户模型,Django【英文标题】:Cannotlogintotokenendpointwithusername/password:drftokenauthandcustomusermodel,Django【发布时间】:2022-01-2213:22:14【问题描述】:我有一个使用Djangorest... 查看详情

如何在 DRF 中使用身份服务器 4 验证 JWT 令牌?

】如何在DRF中使用身份服务器4验证JWT令牌?【英文标题】:HowtovalidateJWTtokenusingidentityserver4inDRF?【发布时间】:2021-04-1005:42:42【问题描述】:我有一个identityserver4、一个前端Angular应用程序和一个DjangoREST框架资源API。如果未登录... 查看详情

在 Django/DRF 中使用 JWT 身份验证并将 JWT 存储在 HttpOnly Cookie 中

】在Django/DRF中使用JWT身份验证并将JWT存储在HttpOnlyCookie中【英文标题】:UsingJWTauthenticationwithDjango/DRFandStoringJWTsinHttpOnlyCookies【发布时间】:2021-06-1808:42:48【问题描述】:我正在尝试在后端使用Django和DRF并在前端使用ReactJs构建一... 查看详情