【问题标题】:Set-Cookie response header not working using Angular 2 + django-rest-frameworkSet-Cookie 响应标头无法使用 Angular 2 + django-rest-framework
【发布时间】:2017-05-25 13:33:00
【问题描述】:

我正在开发一个使用 django-rest-framework 作为后端的 Angular 2 应用程序。我正在使用开发服务器(来自 angular-cli 的 ng 服务)和另一个用于 django(默认来自 manage.py)进行测试。两台服务器都可以从 127.0.0.1 访问,但在不同的端口上。

我的身份验证系统基于 django-rest-framework 提供的 cookie。使用 django-rest-framework 中的视图时一切正常。

当我尝试从 Angular 2 登录时,我收到带有 Set-Cookie 标头的有效响应。问题是 cookie 从未在浏览器中设置(在 chrome 和 firefox 中测试)。

这是一个 CORS 问题吗?我安装了带有以下参数的 corsheader 应用程序

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

【问题讨论】:

    标签: django angular cookies django-rest-framework


    【解决方案1】:

    据我了解 django-cors(基本上是一般的 cors),您不能同时设置全部允许和允许凭据,这是来自 cors 中间件:

    if conf.CORS_ORIGIN_ALLOW_ALL and not conf.CORS_ALLOW_CREDENTIALS:
                response[ACCESS_CONTROL_ALLOW_ORIGIN] = "*"
    else:
        response[ACCESS_CONTROL_ALLOW_ORIGIN] = origin
        patch_vary_headers(response, ['Origin'])
    

    所以基本上你需要正确设置原点 - 因为你有两个 Trues 去 else 块;

    你可以在这里阅读更多关于它的信息:MDN CORS,尤其是这个片段:

    "重要提示:在响应凭证请求时,服务器必须指定域,并且不能使用通配符。如果标头被通配符为:Access-Control-Allow-Origin: *,上述示例将失败。由于Access-Control-Allow-Origin 明确提到http://foo.example,将凭据识别内容返回给调用的Web内容。注意在第22行中,设置了进一步的cookie。如果失败,则异常,取决于API用过,被提升了。”

    【讨论】:

    • 这真的取决于 django-cors 版本。我查了这段代码,它没有出现在我使用的版本中。我也将它们都设置为 True,并且效果很好。
    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 2014-02-26
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2019-08-01
    • 2019-03-26
    相关资源
    最近更新 更多