gpt4 book ai didi

django-rest-framework - 如何在 Django channel 上使用 token 身份验证对 websocket 进行身份验证?

转载 作者:行者123 更新时间:2023-12-03 10:11:44 24 4
gpt4 key购买 nike

我们想为我们的 websocket 使用 django-channels,但我们也需要进行身份验证。我们有一个运行 django-rest-framework 的 rest api,在那里我们使用 token 来验证用户,但相同的功能似乎没有内置到 django-channels 中。

最佳答案

如果您正在使用 Django channel 3 您可以使用此代码:
https://gist.github.com/AliRn76/1fb99688315bedb2bf32fc4af0e50157
中间件.py

from django.contrib.auth.models import AnonymousUser
from rest_framework.authtoken.models import Token
from channels.db import database_sync_to_async
from channels.middleware import BaseMiddleware

@database_sync_to_async
def get_user(token_key):
try:
token = Token.objects.get(key=token_key)
return token.user
except Token.DoesNotExist:
return AnonymousUser()

class TokenAuthMiddleware(BaseMiddleware):
def __init__(self, inner):
super().__init__(inner)

async def __call__(self, scope, receive, send):
try:
token_key = (dict((x.split('=') for x in scope['query_string'].decode().split("&")))).get('token', None)
except ValueError:
token_key = None
scope['user'] = AnonymousUser() if token_key is None else await get_user(token_key)
return await super().__call__(scope, receive, send)
路由.py
from channels.security.websocket import AllowedHostsOriginValidator
from channels.routing import ProtocolTypeRouter, URLRouter
from .middleware import TokenAuthMiddleware
from main.consumers import MainConsumer
from django.conf.urls import url

application = ProtocolTypeRouter({
'websocket': AllowedHostsOriginValidator(
TokenAuthMiddleware(
URLRouter(
[
url(r"^main/$", MainConsumer.as_asgi()),
]
)
)
)
})

关于django-rest-framework - 如何在 Django channel 上使用 token 身份验证对 websocket 进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43392889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com