Как вы обрабатываете аутентификацию на основе файлов cookie в Eve?

Я использую Eve 0.7, Eve-Sqlalchemy 0.7.1 и класс TokenBasedAuth, реализованный и установленный на моих доменах. Он работает как дизайн для запросов, которые отправляют токен через заголовок авторизации.

Пример, который работает так, как разработан локально:

curl -sk -X GET -H "Authorization:Bearer $MY_JWT" localhost:5000/my_domain

У меня есть вариант использования, когда клиент хотел бы отправить заголовок Cookie с токеном аутентификации внутри него. Однако, когда я пытаюсь выполнить такой запрос

curl -sk -X GET -H "Cookie: $MY_COOKIE" localhost:5000/my_domain

я получаю ответ от

{
    "_status": "ERR",
    "_error": {
        "code": 401,
        "message": "Please provide proper credentials"
    }
}

Есть ли способ обрабатывать аутентификацию на основе файлов cookie в Eve 0.7?

До сих пор я пытался добавить некоторые операторы ведения журнала в обработчик событий on_pre_GET, чтобы попытаться понять, что происходит, но обработчик никогда не срабатывает. Я предполагаю, что что-то может происходить внутри, чтобы вернуть 401, поскольку заголовка аутентификации нет (я еще не просматривал исходный код, поэтому просто догадываюсь).

Я также установил X_ALLOW_CREDENTIALS = True в своих настройках, но я не думаю, что это правильный путь (если я ошибаюсь, просто дайте мне знать!).

Спасибо за чтение и любую помощь, которую вы можете предоставить!


Обновлять

Я прочитал eve/auth.py (https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py), и я считаю, что могу переопределить авторизованный (https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/edauth.py#L258), чтобы делать то, что мне нужно. Как только я проверю, я могу обновить снова.


person Pladdy    schedule 28.01.2020    source источник


Ответы (1)


Класс аутентификации токена (https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py#L230) содержит метод authorized(), который можно переопределить.

Однако это не задокументированный метод переопределения, поэтому знайте, что при этом вы можете столкнуться с проблемами в разных версиях Eve.

Способ, которым я модифицировал метод, заключался в том, чтобы он искал заголовок Cookie и, если находил, пытался получить от него токен авторизации. Если он найдет его и check_auth вернет true, вызовите set_user_or_token и вернитесь.

Если заголовок файла cookie отсутствует или токен не check_auth успешно, переходит к авторизованному методу родительского класса для обработки других случаев (например, заголовка авторизации).

class MyTokenAuth(TokenAuth):
    def authorized(self, allowed_roles, resource, method):
        auth = None
        if request.headers.get("Cookie"):
            auth = self.try_to_get_auth_from_cookie(request.headers.get("Cookie"))

        if auth and self.check_auth(auth, allowed_roles, resource, method):
            super().set_user_or_token(auth)
            return True

        return super().authorized(allowed_roles, resource, method)
person Pladdy    schedule 29.01.2020