可以制作不使用客户端会话/ cookie的烧瓶登录系统吗?

时间:2014-02-22 00:11:28

标签: python session flask flask-login

我正在使用Flask应用程序供医疗客户使用。他们的IT部门在安全方面非常紧张,他们在网络范围内禁用cookie和脚本。

幸运的是,wtf-forms能够通过表单输入的服务器端验证解决其中一个问题。

然而,我在登录系统上被挂断了。我已经实现了flask-login,但这显然需要客户端数据,因为在禁用这些功能的浏览器中进行测试时我无法登录。

有没有办法创建一个零客户端数据的登录?

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

你当然可以不用cookies来做。您只需要在每次请求时获得身份验证。

这是example in flask using only Basic HTTP Auth。如果您没有100%使用HTTPS,那么您应该使用Digest Auth这是安全的。

答案 1 :(得分:1)

由于没有零客户端数据这样的限制,您可以在html页面中呈现的每个链接的GET参数中传递会话令牌。

或者您只能使用隐藏的令牌输入创建POST视图(确实可能更安全)。

答案 2 :(得分:1)

另一种让我回想起使用trans-sid的PHP旧时代的方法,就是在url中传递session_id并将会话存储在后端以防止url参数进入大(在大型会话商店的情况下)。

您可以结合使用@app.url_defaults@app.url_value_preprocessor信号(也称为Flask's URL preprocessors)来实现此目的。

这取决于你对url_for的正确使用,因为那是会附加会话ID的地方。让我们做一个简短的概念验证:

@app.url_defaults
def add_session_id(endpoint, values):
    if 'session_id' in values:
        # Allows to manually override the session_id, might not be wanted.
        return
    if g.session_id:
        values['session_id'] = g.session_id

@app.url_value_preprocessor
def pull_session_id(endpoint, values):
    g.session_id = values.pop('session_id', None)

现在,您需要做的就是将会话存储在有用的地方(例如使用数据库或Redis,并使用g.session_id = session_id_here设置session_id。

在每个后续请求中,g.session_id应该是相同的会话ID,因为url_for应该将?session_id=yoursessionid附加到网址。您的身份验证应检查是否存在g.session_id并采取相应措施。

请注意,如果您的会话保持较小,您可能会将整个会话存储在url参数中而不是id。

答案 3 :(得分:-1)

不。对于纯HTTP而言,这几乎是不可能的。 HTTP是无状态协议,这意味着为了保留状态,客户端必须能够在每个请求上标识自己。

可能能够做的是通过HTTPS进行HTTP基本身份验证,然后在服务器端访问该身份验证。