【问题标题】:Django REST Framework SessionAuthentication does not seem to work?Django REST Framework SessionAuthentication 似乎不起作用?
【发布时间】:2013-10-12 13:47:22
【问题描述】:

我为 AJAX Web 应用程序(以及未来的本地客户端)配置了 Django REST API 用于 SessionAuthentication、TokenAuthentication 和 OAuth2Authentication。

Token en OAuth2 身份验证工作正常,但 SessionAuthentication 的行为还没有像我希望的那样工作。

我目前有两个配置相同的 REST API:

http://api.sandbox.dev:8080/http://www.sandbox.dev:8080/api/

我的 AJAX 网络应用位于 http://www.sandbox.dev:8080

代码:

每当我从 www.sandbox.dev 对 api.sandbox.dev 上的 API 进行 AJAX 调用时,我都会收到“403 Forbidden”错误。我认为我做了所有正确的事情来让事情跨域工作还是我错过了什么?

提前感谢任何帮助或提示!

亲切的问候, 克里斯托夫

【问题讨论】:

    标签: django rest session authentication frameworks


    【解决方案1】:

    如果您使用 Apache mod_wsgi 来提供服务,您可能需要将以下内容添加到您的 VirtualHost 配置文件中,因为授权标头已被 mod_wsgi 剥离。您需要将以下内容添加到您的 VirtualHost 配置中:

    WSGIPassAuthorization On
    

    进一步参考:http://django-rest-framework.org/api-guide/authentication.html#unauthorized-and-forbidden-responses

    【讨论】:

    • 谢谢,但我使用的是 Django 的内置 Web 服务器(通过“python manage.py runserver”)。我会记住它,因为它把所有东西都投入生产了。
    【解决方案2】:

    这应该可行:

    jquery.rest.js

    $.ajax({
        xhrFields: {withCredentials: true},
        ...
    });
    

    settings.py:

    CORS_ALLOW_CREDENTIALS = True
    CORS_ORIGIN_WHITELIST = ('www.sandbox.dev:8080', )
    
    SESSION_COOKIE_DOMAIN = '.sandbox.dev'
    CSRF_COOKIE_DOMAIN = '.sandbox.dev'
    

    【讨论】:

    • 感谢 mariodev - 我现在几乎可以正常工作了,但是通过这些附加设置,我只能通过 AJAX 从 www.sandbox.dev 上的 api.sandbox.dev 获取(读取)数据。当我尝试 POST、PUT 或 DELETE 某些内容时,我总是在响应“{“detail”:“CSRF 失败:CSRF 令牌丢失或不正确。”} 中收到“403 FORBIDDEN”作为消息。我还在 api.sandbox.dev 上为相同的 API 添加了具有 OAuth2 和令牌身份验证的页面,并在 AJAX REST 客户端中添加了相同的 CSRF 令牌,但没有问题。
    • 我还更新了上面列出的 GitHub 中最重要的文件。
    • 查看更新后的帖子,这两个域名是我对您最新的 repo 所做的唯一更改,并且 POST 工作正常..
    • 感谢您的提示,mariodev!这确实是拼图中最后缺失的一块。 :-) 现在一切正常(会话、OAuth2 和令牌身份验证),太棒了!
    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 2016-02-28
    • 2015-10-24
    • 2013-08-07
    • 1970-01-01
    • 2019-09-15
    • 2013-02-16
    • 2019-07-13
    相关资源
    最近更新 更多