2014-11-24 4 views
2

Я создаю сервер склянки с Колба-Войти, как это:Как сделать Колба запомнить логин сессии

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

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

Это мой файл питона, используя 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() 
+3

Не используйте md5 для «шифрования» паролей. Не допускайте перекрестный домен для входа в систему. Не разрешать вход с помощью get ... –

+0

Просто вставил исполняемый скрипт python. – Toast

ответ

-2

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

+0

У меня теперь есть рабочее решение без crossdomain. Почему это плохая идея, чтобы сайт на одном сервере использовал API на другом сервере? – Toast

+0

Это не то, что это. API обычно использует KEY, который похож на очень длительный сеансовый ключ; и у вас не было бы этой проблемы в первую очередь. – godDLL

13

Если вы read the docs for 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 

Проблема также может заключаться в том, что crossdomain не ведет себя корректно с помощью файла 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 обеспечивает превосходный интерфейс для этих алгоритмов, а также возможность обновления хэшей с течением времени.

+0

У меня был пользовательский загрузчик и добавил его к вопросу. Что касается других недостатков, это было быстро взломано, чтобы увидеть, работает ли флажок-логин, и как только он сработает, я с радостью реализую каждое из предлагаемых вами улучшений. – Toast

+0

Так как у меня есть рабочее решение, я беру на себя вопросы из вашего ответа. Почему сервер не должен иметь собственный класс? Как я могу получить доступ к нему из другого места, кроме моей собственной сети (0.0.0.0)? И в чем проблема с потоками? Мой проект не работает иначе. – Toast

+0

вы не хотите использовать сервер разработки, так как он доступен только для вашей собственной пробной версии. Помимо всех проблем безопасности, это просто непрактично, и вы должны перезагружаться, как и все 24 часа, так как он не может справиться с более продолжительным временем. Нет реальной обработки кеша и так далее. Вместо этого вы хотите привязать свое приложение к веб-серверу, например, к apache. – muthan

Смежные вопросы