我已经使用了djangorestframework-simplejwt一段时间,现在我想将 JWT 存储在 cookie 中(而不是本地存储或前端状态),以便客户端发出的每个请求都包含令牌。
因此,我对此进行了一些研究,我发现的最相关的结果是这个 stackoverflow 问题,其中作者使用的djangorestframework-jwt包有一个名为 cookie 的预配置设置JWT_AUTH_COOKIE。因此想切换到该软件包,但最终发现该软件包几乎已经死了。
虽然有一个建议使用的分叉djangorestframework-jwt,但我想知道是否可以用其djagnorestframework_simplejwt本身来设置 HttpOnly cookie 中的 JWT?
django django-rest-framework django-rest-framework-jwt django-rest-framework-simplejwt
在 Django 中,超级用户可以根据他们的滚动添加更多用户。我正在使用带有 DRF 的简单 JWT 进行身份验证。但仅通过访问和刷新令牌无法检测用户类型。
这是我的 settings.py 文件
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',),
'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework_simplejwt.authentication.JWTAuthentication',),
}
Run Code Online (Sandbox Code Playgroud)
网址.py
from django.contrib import admin
from django.urls import path, include
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('Manage_Merchants.urls')),
path('api-auth', include('rest_framework.urls')),
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
Run Code Online (Sandbox Code Playgroud)
当我通过 Postman 访问 127.0.0.1:8000/api/token/ 时,它要求输入用户名和密码。当我输入用户名和密码时,它会生成一个刷新和访问令牌。 使用 Postman 生成带有 DRF 的 JWT
那么如何识别为超级用户或其他用户创建的超级用户生成的令牌?如何将更多值作为字典与访问和刷新令牌一起传递以识别用户类型?
我想使用Django Rest Framework作为后端来构建SPA应用程序。该应用程序将使用令牌身份验证。
为了获得最大的安全性,我想将身份验证令牌存储在httpOnly cookie中,因此无法从javascript访问它。但是,由于无法从javascript访问cookie,因此无法设置“ Authorization:Token ...”标头。
因此,我的问题是,我可以使DRF身份验证系统(或Django-Rest-Knox / Django-Rest-JWT)从Cookie中读取身份验证令牌,而不是从“ Authorization”标头中读取身份验证令牌吗?还是“授权”标头是在DRF中进行身份验证的唯一正确方法?
django cookies django-rest-framework django-rest-auth django-rest-framework-jwt
我想使用最安全的方法将登录的用户会话存储在 cookie 中。后端是基于 Django 和 DRF 构建的,因此我在用于令牌身份验证的 simplejwt 插件或 djangos 默认 SessionAuth 之间进行选择。前端不是 SPA,但最终也会有一个移动应用程序。所以我一直倾向于令牌身份验证,将它们存储在寿命较短的 httpOnly cookie 中。但那时,我想知道我是否本质上只是以一种迂回的方式进行会话身份验证?
对于该应用程序,一个比另一个更好(就安全性而言)?
django-authentication django-sessions django-rest-framework django-rest-framework-jwt django-rest-framework-simplejwt
我正在使用 Django Rest Framework 构建 REST API。我目前有一个问题,我的一些端点返回 HTTP 401 Unauthorized,而我的绝大多数端点返回正确的响应。对于身份验证,我将 JWT 令牌与 djangorestframework-simplejwt 一起使用。
我已将 Django 配置为将令牌身份验证与 djangorestframework-simplejwt 结合使用。
# rest framework config settings
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
# 'rest_framework.permissions.AllowAny',
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
Run Code Online (Sandbox Code Playgroud)
当我在请求中传递有效的访问令牌时,我的绝大多数端点都会返回有效数据。如果我没有发送有效的令牌,我会收到 HTTP 403。
另一方面,我有一些自定义 API 视图,无论我是否传递有效令牌,它们都会返回 HTTP 401。
我已将代码包含在下面的一个有问题的视图中。
class CheckDifferentialView(generics.GenericAPIView):
permission_classes = [IsAuthenticated]
authentication_classes = [TokenAuthentication]
serializer_class = QuizDifferentialSerializer
def post(self, request, *args, **kwargs):
"""
A function to check a quiz question and to update a user's record of questions …Run Code Online (Sandbox Code Playgroud) python django django-rest-framework django-rest-framework-jwt django-rest-framework-simplejwt
考虑下面的代码(在 urls.py 中):
router = DefaultRouter()
router.register('my-endpoint', MyViewSet, basename='mybasename')
urlpatterns = [
path('api/v1/', include(router.urls)),
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
Run Code Online (Sandbox Code Playgroud)
此代码有效,但 2 个端点(TokenObtainPairView 和 TokenRefreshView)未出现在 Root API (DRF) 中
然后,我尝试在路由器上注册 django-rest-frakmework-simplejwt 的两个端点:
router = DefaultRouter()
router.register('my-endpoint', MyViewSet, basename='mybasename'),
router.register('api/token/', TokenObtainPairView.as_view(), basename='token_obtain_pair')
router.register('api/token/refresh/', TokenRefreshView.as_view(), basename='token_refresh')
# Other way:
# router.register('api/token/', TokenObtainPairView, basename='token_obtain_pair')
# router.register('api/token/refresh/', TokenRefreshView, basename='token_refresh')
urlpatterns = [
path('api/v1/', include(router.urls))
]
Run Code Online (Sandbox Code Playgroud)
然后当我运行时,出现以下错误:
File "/home/sidon/dev/boticario-teste/boticashback/boticashback/urls.py", line 32, in <module>
path('api/', include(router.urls)),
File "/home/sidon/miniconda3/envs/botcash/lib/python3.8/site-packages/rest_framework/routers.py", line 78, in urls
self._urls = self.get_urls() …Run Code Online (Sandbox Code Playgroud) 我正在管理我的用户模型(针对客户),但我不知道如何将 simple-jwt 用于我的客户模型及其自定义登录视图。
模型.py
from django.db import models
class Customer(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(max_length=100)
password = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
另外,我想通过保存刷新令牌来管理我的客户会话,任何人都可以告诉我如何实现这一目标。
django-rest-framework django-rest-framework-jwt django-rest-framework-simplejwt
我有一个自定义用户模型并创建了一个自定义身份验证后端。我使用django rest framework和django rest framework JWT进行令牌认证。
用户模型:
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(
unique=True,
max_length=254,
)
first_name = models.CharField(max_length=15)
last_name = models.CharField(max_length=15)
mobile = models.IntegerField(unique=True)
date_joined = models.DateTimeField(default=timezone.now)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name', 'mobile']
Run Code Online (Sandbox Code Playgroud)
验证后端:
class EmailOrMobileAuthBackend(object):
def authenticate(self, username=None, password=None):
try:
user = get_user_model().objects.get(email=username)
if user.check_password(password):
return user
except User.DoesNotExist:
if username.isdigit():
try:
user = get_user_model().objects.get(mobile=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Django-Rest-Framework (DRF) 创建一个 api 来 CRUD 用户。我已成功创建并读取用户,但由于某种原因更新不起作用。似乎它正在尝试创建一个用户而不是更新它,因为它以“用户名已存在”错误消息响应。当我尝试传递不在数据库中的电子邮件时,它只会创建一个新用户。有谁知道为什么会这样?
这是我的用户序列化程序:
class UserSerializer(FriendlyErrorMessagesMixin, serializers.ModelSerializer):
password = serializers.CharField(
max_length=128,
min_length=8,
write_only=True
)
class Meta:
model = User
fields = ('username',
'email',
'password',
'name',
'house_number',
'address_line_one',
'address_line_two',
'address_line_three',
'city',
'postcode',
'phone_number')
read_only_fields = ('date_created', 'date_modified', 'username')
def update(self, instance, validated_data):
password = validated_data.pop('password', None)
for (key, value) in validated_data.items():
setattr(instance, key, value)
if password is not None:
instance.set_password(password)
instance.save()
return instance
Run Code Online (Sandbox Code Playgroud)
这是我的观点:
class UserRetrieveUpdateAPIView(RetrieveUpdateAPIView):
permission_classes = (IsAuthenticated,)
serializer_class = UserSerializer
def retrieve(self, request, *args, …Run Code Online (Sandbox Code Playgroud) python django django-rest-framework django-rest-framework-jwt
我正在尝试为 django 频道设置一个身份验证中间件。我希望这个中间件只对 websocket 请求有效。
在这种情况下,我似乎没有获得完整的中间件功能。例如,我无法response = self.get_response(scope)工作:
'TokenAuthMiddleware' object has no attribute 'get_response'
Run Code Online (Sandbox Code Playgroud)
现在这个中间件一切都很好(它只为 websocket 请求激活,而不是在 中注册settings.py),除了我需要一种方法来修改响应状态代码(阻止匿名用户并设置错误代码ExpiredSignatureError)。任何帮助表示赞赏。我使用 Django2.0.6和 channels 2.1.1。jwt 认证通过djangorestframework-jwt
中间件:
import jwt, re
import traceback
import logging
from channels.auth import AuthMiddlewareStack
from django.contrib.auth.models import AnonymousUser
from django.conf import LazySettings
from jwt import InvalidSignatureError, ExpiredSignatureError, DecodeError
from project.models import MyUser
settings = LazySettings()
logger = logging.getLogger(__name__)
class TokenAuthMiddleware:
"""
Token authorization middleware for Django Channels 2
"""
def …Run Code Online (Sandbox Code Playgroud) django django-rest-framework django-channels django-rest-framework-jwt