问题标签 [django-rest-framework-simplejwt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2846 浏览

django - 使用 Django Rest Framework Simple JWT TokenRefresh 返回用户名和 ID

我正在使用 Django Rest Framework 和 django-rest-framework-simplejwt 进行身份验证。正在发送的数据正在被 React 消耗。

到目前为止,我已经能够TokenObtainPairSerializer在登录/获取新令牌时对 进行子类化以返回用户名和 ID。

我正在尝试在刷新令牌时返回用户用户名和 ID。但是,这不起作用:

在这里,用户名总是作为空字符串返回,ID 总是作为 null 返回。

我尝试了许多不同的方法,包括尝试在视图本身中更新此信息,但似乎无法使其正常工作。我注意到TokenRefreshSerializer子类serializers.Serializer,而 TokenObtainPairSerializer 子类TokenObtainSerializer本身使用 Django 身份验证对用户进行身份验证。这似乎需要密码(例如用户登录时),但显然在刷新令牌时不会提供密码。

我的问题是,刷新令牌时如何返回有关当前用户的用户名和 ID(或任何任意信息)?

接下来的问题是,当用户首次登录时简单地将这些信息保存到前端的 localStorage 并让状态在每次后续访问时重新填充该数据(直到用户注销,或者刷新令牌不再有效)?

请注意:不是类似问题的转贴,因为我的目标是令牌的刷新。最初TokenObtainPairView的子类和实现很简单。

0 投票
2 回答
6530 浏览

python - 将自定义用户身份验证添加到 django-rest-framework-simple-jwt

我想通过一次性密码以及 django 中常用的用户名/密码方法添加用户登录。为此,用户名/密码或用户名/OTP 从客户端发送到服务器,并且基于提供的字段对,如果用户通过身份验证,我需要返回访问和刷新令牌。我正在使用 django 的 simple-jwt。我知道我必须重写 TokenObtainPairView 和 TokenObtainSerializer。问题是,我想自己做字段验证部分。

在我看来,我覆盖了 simple-jwt 的默认视图。

我重写了如下的序列化程序:

因此,如果客户端以下面其中一种可能的形式传递用户凭据,我将能够对其进行身份验证并返回令牌对。

或者

问题是,当我以第二种形式发送数据时,我得到400 BadRequest:password is required. 如何自定义字段及其验证?

0 投票
1 回答
433 浏览

django - 如何在 django simple jwt 中自定义登录 url 和条件

我有一个具有多用户类型、作者、版主和经理的应用程序。这个组有不同的安卓应用。我已经使用 django 简单的 JWT 令牌进行登录。问题是作者可以登录版主应用程序,版主可以登录其他应用程序等等。

问题是,我如何区分这些组的登录 url 和条件?

我使用 django 用户模型进行身份验证,并使用 django 组来定义三个组。只有管​​理员可以创建用户,当他创建用户时,定义用户组。在简单的 jwt 中,我们使用此模式进行身份验证

我的身份验证后端设置是这样的:

所有用户都可以登录我的应用程序。不重要他们的群体。因为系统只检查 django 用户模型。

现在我想为这三个 android 应用程序设置单独的登录 url,并为每个组设置特定的登录条件。但我不知道我该怎么做!?

0 投票
1 回答
2410 浏览

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

我正在使用DRF ( djangorestframework_simplejwt ) 建议的库,使用安装

将其添加到 settings.py

从导入的视图创建两个端点

在数据库中创建用户没有任何问题,并且正在对密码进行哈希处理。

如果我去http://localhost:8000/api/token/,然后得到以下视图

Token 获取 Pair JWT DRF

使用密码发布正确的用户,然后我收到以下错误

/api/token/ 处的 AttributeError

[2020 年 4 月 17 日 12:06:51]“POST /api/token/HTTP/1.1”500 122221 内部服务器错误:/api/token/ Traceback(最后一次调用):文件“C:\Users\tiago \Desktop\letsgo\authenticationJwt\lib\site-packages\django\core\handlers\exception.py”,第 34 行,内部响应 = get_response(request) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\ lib\site-packages\django\core\handlers\base.py”,第 115 行,在 _get_response 响应 = self.process_exception_by_middleware(e, request) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site -packages\django\core\handlers\base.py”,第 113 行,在 _get_response 响应 = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\django\views\decorators\csrf.py”,第 54 行,在 Wrapped_view 返回 view_func(*args, **kwargs) 文件“C:\Users\ tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\django\views\generic\base.py”,第 71 行,在视图中返回 self.dispatch(request, *args, **kwargs) 文件“C:\Users \tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework\views.py”,第 505 行,在调度响应 = self.handle_exception(exc) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\ lib\site-packages\rest_framework\views.py”,第 465 行,在 handle_exception self.raise_uncaught_exception(exc) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework\views.py ",第 476 行,在 raise_uncaught_exception raise exc 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework\views.py”,第 502 行,在调度响应 = handler(request, *args, **kwargs)文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\views.py”,第 27 行,在 post serializer.is_valid(raise_exception=True) 文件“C:\Users\tiago\ Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework\serializers.py”,第 234 行,在 is_valid self._validated_data = self.run_validation(self.initial_data) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt \lib\site-packages\rest_framework\serializers.py",第 436 行,在 run_validation value = self.validate(value) File "C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\serializers.py",第 73 行,在验证刷新 = self.get_token(self.user) 文件“C:\Users\tiago\Desktop\ letsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\serializers.py”,第 68 行,在 get_token 中返回 RefreshToken.for_user(user) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\ rest_framework_simplejwt\tokens.py",第 161 行,在 for_user user_id = getattr(user, api_settings.USER_ID_FIELD) AttributeError: 'MyUser' object has no attribute 'id'\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\serializers.py”,第 68 行,在 get_token 中返回 RefreshToken.for_user(user) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt \lib\site-packages\rest_framework_simplejwt\tokens.py",第 161 行,在 for_user user_id = getattr(user, api_settings.USER_ID_FIELD) AttributeError: 'MyUser' object has no attribute 'id'\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\serializers.py”,第 68 行,在 get_token 中返回 RefreshToken.for_user(user) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt \lib\site-packages\rest_framework_simplejwt\tokens.py",第 161 行,在 for_user user_id = getattr(user, api_settings.USER_ID_FIELD) AttributeError: 'MyUser' object has no attribute 'id'

错误很明显,MyUser 对象没有属性 id。相反,它有user_id一个primary_key,如下所示

问题是,我不想更改当前的 MyUser 字段。


编辑

转到djangorestframework_simplejwt的设置,可以阅读

因此,考虑到我不想将 MyUser primary_key 更改为 id,我去了安装 djangorestframework_simplejwt 的地方并搜索了声明 USER_ID_FIELD 的地方。

仅在 SIMPLE_JWT 的 venv\Jwt\Lib\site-packages\djangorestframework_simplejwt-4.4.0.dist-info\METADATA 中找到它。在那里,改为

然后,重新启动 venv 和 runserver。问题仍然存在。

0 投票
1 回答
894 浏览

django - 如何在 django rest 框架中的 simplejwt 令牌身份验证中跳过或删除密码字段?

我的要求是,我不想在 simplejwt 令牌身份验证中输入密码。根据我的要求,我通过继承TokenObtainPairSerializerinit()的方法在身份验证中添加了一个额外的字段 。

目前,我None在密码字段中传递,但仍向用户显示(djnago 管理门户)。我想要的是,我不想在使用 simplejwt 进行身份验证时向用户显示密码字段。

下面是我的代码,

有什么方法可以将 PasswordField 设置为不可用,这样它就不会显示给用户?

0 投票
1 回答
3605 浏览

django - 简单 JWT 向令牌中的有效负载数据添加额外字段

我使用 djoser 和 rest_framework_simplejwt。这是我的用户模型;

我的 views.py 为用户获取令牌,如下所示;

这是serializer.py;

我可以像这样获得访问和刷新令牌。

当使用 jwt.io 有效负载数据编码令牌时;

我想在访问令牌的有效负载中添加用户名,姓氏,我想得到;

0 投票
0 回答
105 浏览

reactjs - 如何在 React 中保护刷新令牌?

我正在使用带有 React 前端的 Django Rest Framework 和 simplejwt。通过身份验证,React 应用程序会收到访问和刷新令牌。

根据最佳实践,前端应该将访问令牌存储在内存中,但是刷新令牌呢?

除了我应该将刷新令牌存储在 httponly cookie 中之外,我找不到任何关于此的信息。如果这是首选方式,如何使用当前设置实现它?

0 投票
1 回答
430 浏览

django - 如何在 django-rest-framework 中扩展 JWTAuthentication

我创建了 CustomAuthentication 类,这个类扩展了 JWTAuthentication 类。我把这个类放在文件 auth.py 和 settings.py 的相同位置。

在 settings.py 我修改:

但它不起作用,它抛出

“无法为 API 设置‘DEFAULT_AUTHENTICATION_CLASSES’导入‘auth.CustomAuthentication’。ImportError:模块“auth”未定义“CustomAuthentication”属性/类。”

这是 auth.py 的内容:

这里有什么问题?请帮忙。

非常感谢。

0 投票
1 回答
364 浏览

django - Django Rest Framework JWT 身份验证请求 CSRF 令牌

我正在使用 django rest 框架 simplejwt 进行身份验证。这是其余的框架设置:

据我所知,如果没有提及 DEFAULT_AUTHENTICATION_CLASSES,django 将默认使用需要 csrf 令牌的基于会话的身份验证。我没有包括会话身份验证,并且使用了 simplejwt,如上所示。然而,我在处理 POST 请求时收到 CSRF 验证失败的错误,这不应该是必需的。我究竟做错了什么?

0 投票
2 回答
1310 浏览

django - Django rest 框架 simple-jwt 错误“详细信息”:“没有找到具有给定凭据的活动帐户”

我在 Django 中创建了一个自定义用户模型,并使用 djangorestframework simplejwt 进行身份验证(登录和注册)。

楷模:

我可以很好地注册,但是当我尝试登录(为此使用邮递员)时,它显示以下消息:

我所有的凭据都是准确的,我已经通过 python shell 检查了我的用户都处于活动状态并且拥有正确的电子邮件~密码。我究竟做错了什么?