如何使Flask记住登录会话

3
我正在使用Flask-Login创建一个Flask服务器,代码如下:
登录功能正常(能够正确打印用户信息)。但是在此之后,我进行了一个测试请求,每次都返回一个匿名用户而非刚刚登录的用户。
这些请求由一个HTML页面发起,该页面位于与Flask服务器相同的IP地址上,但端口不同的HTTP服务器上。
以下是我的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()

3
请勿使用 MD5 来“加密”密码。不要允许跨域登录。不要允许使用 GET 方式登录。 - Antti Haapala -- Слава Україні
刚刚粘贴了一个可运行的Python脚本。 - Toast
2个回答

15
如果您阅读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

问题可能是由于Flask-Login设置的登录cookie与跨域不正确,您可能需要更改cookie的域或其他安全功能以允许此类操作。然而,这并不是允许从其他站点登录的正确方式。


您发布的代码存在其他问题。

不需要服务器类,Flask中的所有模式都设计为在模块级别上完美运行。所有状态都可以保存在应用程序及其配置中,并使用current_app代理。

开发服务器(app.run())仅适用于本地开发。当您想要部署到生产环境时,请使用真正的应用程序服务器,例如uWSGIGunicorn,以及真正的Web服务器,例如NginxApache。它们提供的性能和安全性优势远远超过开发服务器。

公开API并没有什么不好,但直接公开登录却不好。您已经设置好了,远程站点必须收集和发送凭据。考虑设置OAuth提供程序,以使只有您的站点处理凭据。 Stack Exchange API提供了一个很好的示例,有各种Flask扩展可以实现这一点,例如Flask-OAuthlib

不应使用MD5哈希密码,它已经不安全了十年。使用真正的哈希实现,例如PBKDF2、BCrypt或SCrypt。Passlib提供了这些算法的出色接口,同时还能随时间升级哈希。


-2

flask-login 似乎无法与跨域 Flask 一起使用。 通过使用相同的 Flask 服务器提供静态文件来解决此问题。


这不是那样的。API通常会使用KEY,就像一个非常长时间运行的会话密钥;因此你在第一次使用时就不会遇到这个问题。 - godDLL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接