【问题标题】:Set a Cookie in flask Redirect to external URL在烧瓶中设置 Cookie 重定向到外部 URL
【发布时间】:2019-08-29 10:51:31
【问题描述】:

我想将用户从我的烧瓶应用程序重定向到带有标头(编码会话对象)的客户端应用程序,浏览器可以将其存储为 cookie 以供进一步请求。

我正在使用不同的服务器对用户进行身份验证,并且在成功登录后,他将被重定向到我的烧瓶应用程序,在该应用程序中我在数据库和会话对象中设置了用户。而且,在这完成之后,我需要将请求重定向到我的客户端应用程序。因此,我使用 flask.redirect 将用户重定向到我的客户端应用程序。现在,为了让浏览器存储用户信息,我想将会话对象作为 cookie 发送给浏览器。

TLDR; 这就是我想要做的:

  1. 客户端到达内容服务器。
  2. 客户端没有活动会话,被重定向到身份验证服务器并回调到内容服务器。
  3. 内容服务器创建会话并使用会话 cookie 重定向回客户端。
  4. 客户端到达内容服务器。
  5. 内容服务器验证会话 cookie 并允许访问客户端。

身份验证在单独的服务器上,但内容服务器和客户端都需要通过 cookie 跟踪会话。我无法做的部分是让客户端 (localhost:3000) 跟踪会话。

以下是我尝试过的:

resp = flask.make_response()
resp.set_cookie('Set-Cookie', 'this is the session cookie I want the browser to set for further requests')
return flask.redirect('http://localhost:3000/', Response=resp)

这给了我错误:

File "/home/shaily/.virtualenvs/venv/lib/python3.6/site-packages/werkzeug/utils.py", line 507, in redirect

mimetype="text/html",

TypeError: __call__() got an unexpected keyword argument 'mimetype'

是否有替代方法或方法可以解决此问题?

【问题讨论】:

    标签: session authentication redirect flask cookies


    【解决方案1】:

    “重定向功能”可以通过以下方式重构。

        resp = redirect("http://localhost:5001")
        resp.set_cookie('a', 'x')
        return resp
    

    引用对this 问题的评论,我们无法将“响应”对象传递给重定向。响应必须是另一个 (在 werkzeug.Response 的包装类时很有用)写为here

    【讨论】:

      【解决方案2】:

      根据 Flask 中会话的实现方式,在 http 请求的生命周期内对会话对象进行任何更改时,编码的会话对象将作为 cookie 在对该请求的 http 响应中发送。所以,我不再需要显式发送它。

      我无法使用 document.cookie 在我的客户端应用程序中读取 cookie,因为默认情况下,会话 cookie 是 httpOnly,即,出于安全原因,它们不能通过 javascript 应用程序访问。 httpOnly 允许您做的是让您的浏览器存储 cookie,以便进一步向服务器发出 http 请求。如果出于某种原因,您仍想在 javascript 中读取会话 cookie,则不能在服务器配置中将 SESSION_COOKIE_HTTPONLY 设置为 False。

      要发送带有 http 响应的 cookie,这个解决方案对我来说效果很好:In Flask, set a cookie and then re-direct user

      【讨论】:

        猜你喜欢
        • 2012-07-31
        • 1970-01-01
        • 2015-06-13
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多