Django DRF simpleJWT-是否仍然可以获取用户';从无法访问';请求';波拉姆?
我正在尝试为Django通道编写一个自定义的身份验证中间件,因为我正在使用JWT作为我的应用程序的身份验证方案。我使用的是文章中提到的方法,基本上是在向WebSocket发出的第一个请求中获取用户的令牌,然后在Django DRF simpleJWT-是否仍然可以获取用户';从无法访问';请求';波拉姆?,django,django-rest-framework,django-channels,django-rest-framework-simplejwt,Django,Django Rest Framework,Django Channels,Django Rest Framework Simplejwt,我正在尝试为Django通道编写一个自定义的身份验证中间件,因为我正在使用JWT作为我的应用程序的身份验证方案。我使用的是文章中提到的方法,基本上是在向WebSocket发出的第一个请求中获取用户的令牌,然后在consumers.py文件的接收方法中,根据该方法获取用户的数据,然后将其放入self.scope['user'](由于UI应用程序是独立的,因此无法使用该方法。). 现在,由于我无法访问通常在views.py文件中用于获取用户数据的请求参数,是否可以仅从访问令牌中获取用户数据???He
consumers.py
文件的接收方法中,根据该方法获取用户的数据,然后将其放入self.scope['user'](由于UI应用程序是独立的,因此无法使用该方法。). 现在,由于我无法访问通常在views.py
文件中用于获取用户数据的请求参数,是否可以仅从访问令牌中获取用户数据???Hello@Jalal试试这个
from channels.auth import AuthMiddlewareStack
from rest_framework.authtoken.models import Token
from django.contrib.auth.models import AnonymousUser
from django.db import close_old_connections
from rest_framework_simplejwt.backends import TokenBackend
class TokenAuthMiddleware:
"""
Token authorization middleware for Django Channels 2
"""
def __init__(self, inner):
self.inner = inner
def __call__(self, scope):
headers = dict(scope['headers'])
if b'authorization' in headers:
try:
token_name, token_key = headers[b'authorization'].decode().split()
if token_name == 'Token':
print(token_key)
valid_data = TokenBackend(algorithm='HS256').decode(token_key,verify=False)
print(valid_data)
scope['user_id'] = valid_data['user_id']
close_old_connections()
except Token.DoesNotExist:
scope['user'] = AnonymousUser()
return self.inner(scope)
TokenAuthMiddlewareStack = lambda inner: TokenAuthMiddleware(AuthMiddlewareStack(inner))
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
# Add custom claims
token['username'] = user.username
token['email'] = user.email
# ...
return token
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer