Django DRF simpleJWT-是否仍然可以获取用户';从无法访问';请求';波拉姆?

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

我正在尝试为Django通道编写一个自定义的身份验证中间件,因为我正在使用JWT作为我的应用程序的身份验证方案。我使用的是文章中提到的方法,基本上是在向WebSocket发出的第一个请求中获取用户的令牌,然后在
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