from channels.middleware import BaseMiddleware from channels.db import database_sync_to_async class TokenAuthMiddleware(BaseMiddleware): async def __call__(self, scope, receive, send): # 从 headers 中获取 token headers = dict(scope['headers']) token = headers.get(b'authorization', b'').decode('utf-8') if token: # 移除 'Bearer ' 前缀(如果存在) if token.startswith('Bearer '): token = token[7:] # 验证 token 并获取用户 scope['user'] = await self.get_user(token) else: # 将导入移到函数内部 from django.contrib.auth.models import AnonymousUser scope['user'] = AnonymousUser() return await super().__call__(scope, receive, send) @database_sync_to_async def get_user(self, token): try: # 使用 userapp 的 token 验证 from userapp.authentication import RedisTokenAuthentication from django.contrib.auth.models import AnonymousUser # 创建一个模拟的 request 对象 class MockRequest: def __init__(self, token): self.headers = {'Authorization': f'Bearer {token}'} # 使用 RedisTokenAuthentication 验证 token auth = RedisTokenAuthentication() result = auth.authenticate(MockRequest(token)) if result is None: return AnonymousUser() user, _ = result return user except Exception as e: print(f"Token authentication error: {str(e)}") # 将导入移到函数内部 from django.contrib.auth.models import AnonymousUser return AnonymousUser()