Как сделать общедоступный чат с использованием каналов Django БЕЗ AuthMiddlewareStack? - PullRequest
0 голосов
/ 05 ноября 2018

ОБНОВЛЕНИЕ: Я хочу реализовать чат с мобильным приложением. Пользователи мобильных приложений не являются пользователями Django, поэтому Django не может их авторизовать.

Не могу понять, как не использовать AuthMiddlewareStack при маршрутизации. Теперь мой код:

application = ProtocolTypeRouter({
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                [
                    url(r"leadusers/(?P<pk>\d+)/(?P<chatid>[\w-]+)/$", LeadUserConsumer, name='leaduser_consumer'),
                ]
            )
        ),
    ),
})

Я пытался удалить только этот класс AllowedHostsOriginValidator - не работает.

Может быть, ответ при создании пользовательской аутентификации?

class QueryAuthMiddleware:
"""
Custom middleware (insecure) that takes user IDs from the query string.
"""

def __init__(self, inner):
    # Store the ASGI application we were passed
    self.inner = inner

def __call__(self, scope):
    # Look up user from query string (you should also do things like
    # check it's a valid user ID, or if scope["user"] is already populated)
    user = User.objects.get(id=int(scope["query_string"]))
    close_old_connections()
    # Return the inner application directly and let it run everything else
    return self.inner(dict(scope, user=user))

Может быть, кто-нибудь знает? Помогите, пожалуйста.

1 Ответ

0 голосов
/ 11 ноября 2018

AuthMiddlewareStack объединяет AuthMiddleware, SessionMiddleware и CookieMiddleware: https://channels.readthedocs.io/en/latest/topics/authentication.html

Одна вещь, которую делает промежуточное ПО - это добавление некоторых значений в область действия. Например, AuthMiddleware читает идентификатор сеанса из файла cookie, ищет соответствующего пользователя django в сеансе и добавляет этого пользователя в область.

Если вы не хотите использовать пользователей django, то вам вовсе не обязательно использовать AuthMiddleware или AuthMiddlewareStack. Вы можете написать свой собственный код аутентификации в методе init вашего класса Consumer и использовать self.user, чтобы сохранить пользователя подключения.

Ваш маршрут может выглядеть так:

application = ProtocolTypeRouter({
    'websocket': AllowedHostsOriginValidator(
        URLRouter(
            [
                url(r"leadusers/(?P<pk>\d+)/(?P<chatid>[\w-]+)/$", LeadUserConsumer, name='leaduser_consumer'),
            ]
        )
    ),
})
...