0
Я ни в коем случае не инженер по безопасности, и я только начал свое путешествие как веб-разработчик. Я использую пакет python, известный как django для моего бэкэнда, реагирую. js для моего интерфейса. Недавно я включил django -каналы, это пакет, который дает мне возможность использовать веб-сокеты в моем проекте. Поскольку я развязал свои передний и внутренний интерфейсы, основа аутентификации, которую я использую, основана на использовании токенов (рассмотрим использование jwt).
Проблема в том, что с javascript невозможно отправить заголовки аутентификации через подключение к websocket (или так мне сказали), поэтому многие люди используют куки для отправки этого токена аутентификации. Вот пример фрагмента того, как я отправляю токен из моего внешнего интерфейса:
const path = wsStart + 'localhost:8000'+ loc.pathname
document.cookie = 'authorization=' + token + ';'
this.socketRef = new WebSocket(path)
, делая это, позволяет мне затем извлечь информацию о токене с помощью специального промежуточного программного обеспечения на моем бэкэнде.
import re
from channels.db import database_sync_to_async
from django.db import close_old_connections
@database_sync_to_async
def get_user(token_key):
try:
return Token.objects.get(key=token_key).user
except Token.DoesNotExist:
return AnonymousUser()
class TokenAuthMiddleware:
"""
Token authorization middleware for Django Channels 2
see:
https://channels.readthedocs.io/en/latest/topics/authentication.html#custom-authentication
"""
def __init__(self, inner):
self.inner = inner
def __call__(self, scope):
return TokenAuthMiddlewareInstance(scope, self)
class TokenAuthMiddlewareInstance:
def __init__(self, scope, middleware):
self.middleware = middleware
self.scope = dict(scope)
self.inner = self.middleware.inner
async def __call__(self, receive, send):
close_old_connections()
headers = dict(self.scope["headers"])
print(headers[b"cookie"])
if b"authorization" in headers[b"cookie"]:
print('still good here')
cookies = headers[b"cookie"].decode()
token_key = re.search("authorization=(.*)(; )?", cookies).group(1)
if token_key:
self.scope["user"] = await get_user(token_key)
inner = self.inner(self.scope)
return await inner(receive, send)
TokenAuthMiddlewareStack = lambda inner: TokenAuthMiddleware(AuthMiddlewareStack(inner))
Однако это подняло некоторую форму красных флажков безопасности (или так мне сказали).
Поэтому я хочу sh распространить этот вопрос на ветеранов безопасности там:
- Безопасна ли эта методология отправки аутентификационной информации токена через заголовки cook ie?
- Безопасна ли моя реализация этого метода?
- Есть ли способ защитить ее еще дальше?