28 lines
990 B
Python
28 lines
990 B
Python
# your_app/middleware.py
|
|
from channels.db import database_sync_to_async
|
|
from rest_framework.authtoken.models import Token
|
|
from django.contrib.auth.models import AnonymousUser
|
|
from urllib.parse import parse_qs
|
|
|
|
class QueryAuthMiddleware:
|
|
"""
|
|
Custom middleware to authenticate users using a token passed in the WebSocket URL query string.
|
|
"""
|
|
def __init__(self, inner):
|
|
self.inner = inner
|
|
|
|
async def __call__(self, scope, receive, send):
|
|
query_string = scope["query_string"].decode()
|
|
query_params = parse_qs(query_string)
|
|
token_key = query_params.get("token", [None])[0]
|
|
|
|
if token_key:
|
|
try:
|
|
token = await database_sync_to_async(Token.objects.get)(key=token_key)
|
|
scope["user"] = token.user
|
|
except Token.DoesNotExist:
|
|
scope["user"] = AnonymousUser()
|
|
else:
|
|
scope["user"] = AnonymousUser()
|
|
|
|
return await self.inner(scope, receive, send) |