Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Javascript WebSocket将头传递到Django通道,以使用令牌对用户进行身份验证_Python_Django_Websocket_Django Channels - Fatal编程技术网

Python 使用Javascript WebSocket将头传递到Django通道,以使用令牌对用户进行身份验证

Python 使用Javascript WebSocket将头传递到Django通道,以使用令牌对用户进行身份验证,python,django,websocket,django-channels,Python,Django,Websocket,Django Channels,我不知道如何使用令牌身份验证连接和验证django通道,因为javascript WebSocket不支持向服务器传递头 class TokenAuthMiddleware: """ Token authorization middleware for Django Channels 2 """ def __init__(self, inner): self.inner = inner def __call__(self, scope)

我不知道如何使用令牌身份验证连接和验证django通道,因为javascript WebSocket不支持向服务器传递头

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':
                    token = Token.objects.get(key=token_key)
                    scope['user'] = token.user
            except Token.DoesNotExist:
                scope['user'] = AnonymousUser()
        return self.inner(scope)

TokenAuthMiddlewareStack = lambda inner: TokenAuthMiddleware(AuthMiddlewareStack(inner))
我已经找到了关于使用令牌进行身份验证的答案,但问题是我不知道如何将头传递给服务器

    token = Token.objects.get(key='175f76fd9b63a9477bf5f9a6f2e9a7f12ac62d65')
            if token.user:
                scope['user'] = token.user
            else:
                scope['user'] = AnonymousUser()
            return self.inner(scope)

TokenAuthMiddlewareStack = lambda inner: TokenAuthMiddleware(AuthMiddlewareStack(inner))
当我手动对用户进行身份验证时,通道可以识别用户并对其进行身份验证

我试过了

def get(request):
        for user in User.objects.all():
            token=Token.objects.get_or_create(user=request.user)
            if token.user:
                print("ok")
            else:
                print("not okay")
            print(token)
在同一类中间件中添加此函数 我原以为这样行得通,但行不通 这样我就可以使用生成的令牌对用户进行身份验证


我只是想知道是否有任何方法可以使用令牌对用户进行身份验证

是的,您可以,但正如您已经注意到的,您不能传递头。因此,您必须以查询字符串的形式传递令牌,这是不安全的,但这是当前可用的主要选项。其他人在初始连接后进行身份验证,以便他们可以在请求正文中传递令牌,这是安全的。请详细说明并证明您的回答。请检查此处的答案