Как заставить Flask запомнить сеанс входа в систему

Я создаю фляжный сервер с Flask-Login следующим образом:

Вход в систему работает (выводит правильного пользователя). Сразу после этого я делаю тестовый запрос. Он всегда возвращает анонимного пользователя и каждый раз другого (ожидая увидеть того, кто только что вошел в систему).

Запросы выполняются html-страницей на http-сервере с тем же (локальным) IP-адресом, но с другим портом, чем у сервера flask.

Это мой файл Python, использующий crossdomainflask:

from flask import *
from flask.ext.login import (LoginManager, UserMixin, login_user, current_user)
from crossdomainflask import *

class User(UserMixin):
    def __init__(self, username):
        self.name = username

    @property
    def id(self):
        return self.name

class FlaskServer(object):
    def __init__(self):
        self.login_manager = LoginManager()
        self.server = Flask(__name__)
        self.server.secret_key = '123456'       
        self.server.config.update(PROPAGATE_EXCEPTIONS = True)
        self.login_manager.init_app(self.server)

        @self.login_manager.user_loader
        def load_user(userid):
            return User("test")

        @self.server.route('/api/login', methods=['POST'])
        @crossdomain(origin='*')
        def login():
            user = load_user(request.values.get('username'))
            if user:
                login_user(user)
                print(current_user)
                print(current_user.name)
                return 'ok'

        @self.server.route("/api/test", methods=['POST', 'GET'])        
        @crossdomain(origin='*')
        def test():
            print(current_user)
            return 'ok'

        self.server.run("0.0.0.0")
server = FlaskServer()

person Toast    schedule 24.11.2014    source источник
comment
Не используйте md5 для шифрования паролей. Не разрешайте междоменные входы в систему. Не разрешать вход с помощью get...   -  person Antti Haapala    schedule 24.11.2014
comment
Просто вставил исполняемый скрипт Python.   -  person Toast    schedule 25.11.2014


Ответы (2)


Если вы прочитали документацию по Flask-Login, вы увидим, что вам нужно определить загрузчик пользователя, который перезагружает пользователя при последующих запросах после входа в систему.

@login_manager.user_loader
def user_loader(id):
    # do whatever you need to to load the user object
    # a database query, for example
    user = MyUser.query.get(id)
    return user

Проблема также может заключаться в том, что междоменный домен неправильно ведет себя с файлом cookie для входа, установленным Flask-Login. Вам может потребоваться изменить домен файла cookie или другие функции безопасности, чтобы разрешить это. Однако это неправильный способ разрешить вход с других сайтов.


Есть и другие проблемы с кодом, который вы разместили.

Нет необходимости в классе сервера, все шаблоны в Flask предназначены для работы на уровне модулей. Все состояние может храниться в приложении и его конфигурации и передаваться с помощью current_app.

Сервер разработки (app.run()) предназначен только для локальной разработки. Если вы хотите выполнить развертывание в рабочей среде, используйте настоящий сервер приложений, например uWSGI или Gunicorn и настоящий веб-сервер, такой как Nginx или Apache. Они обеспечивают гораздо больше преимуществ в плане производительности и безопасности, чем сервер разработки.

Неплохо выставлять API, но плохо выставлять логин напрямую. В соответствии с вашими настройками удаленный сайт должен собирать и отправлять учетные данные. Рассмотрите возможность настройки поставщика OAuth, чтобы только ваш сайт обрабатывал учетные данные. Stack Exchange API является хорошим примером этого рабочего процесса, и существуют различные расширения Flask, такие как Flask-OAuthlib, которые реализуют это.

Вы не должны хешировать пароли с помощью MD5, это было невероятно небезопасно в течение десятилетия. Используйте настоящую реализацию хеширования, такую ​​как PBKDF2, BCrypt или SCrypt. Passlib предоставляет отличный интерфейс для этих алгоритмов, а также возможность со временем обновлять хэши.

person davidism    schedule 24.11.2014

flask-login, похоже, не работает с crossdomainflask. Решил это, отдав статические файлы на тот же сервер фляг.

person Toast    schedule 28.11.2014
comment
это не то, что это. API обычно использует KEY, который похож на очень долго работающий сеансовый ключ; и у вас не было бы этой проблемы в первую очередь. - person godDLL; 05.12.2014