我能够做得到不设置任何头,除了用SessionAuthentication和Tastypie工作content-type
到application/json
。 HTTP POST但是却偏偏没有,即使在标题中的Cookie具有会话ID。 它失败,出现401 AuthorizationHeader但它无关授权。 更改SessionAuthentication到BasicAuthentication并通过用户名/密码也可以。
有没有人得到了SessionAuthentication与岗位工作与Tastypie?
是的,我已经得到了它的工作。 所有你需要做的是通过捷克斯洛伐克令牌:
SessionAuthentication
该认证方案使用内置Django的会话来检查,如果用户登录。 在同一网站上使用时,通过JavaScript作为API托管在这通常是有用的。
它要求用户登录和有活动会话。 他们还必须有一个有效的CSRF令牌 。
这是如何做到这一点jQuery中:
// sending a csrftoken with every ajax request
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
crossDomain: false, // obviates need for sameOrigin test
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
}
}
});
$.ajax({
type: "POST",
// ...
请注意,说的部分$.cookie('csrftoken')
它得到的CSRF令牌从Django中设置一个cookie。
更新:
我有一些问题的Django不设置在Firefox和Opera的饼干。 把模板标签{% csrf_token %}
在模板中解决这个问题。 正确的解决办法可能是使用装饰ensure_csrf_cookie()
这里有一些补充丹的答案。 请纠正我,如果事情是错的,我还是有点困惑它自己。
我们继续之前,了解在Django CSRF保护 。 仔细阅读。 你需要把令牌从饼干到页眉X-CSRFToken
。 如果cookie是仅Http,那就是,这是行不通的,如果你已经设置CSRF-COOKIE-HTTPONLY = True
在settings.py
。 然后,你必须嵌入的cookie,当然,造成进一步的漏洞,通过使用降低了获得保护的文档中Httponly
。
至于我可以告诉大家,如果cookie不Httponly
,jQuery的将X-CSRFToken自动 。 纠正我,如果我错了,但是我刚刚花了几个小时摆弄它,这就是我一直获得。 这使我不知道,什么是Django文档中的建议的呢? 难道是jQuery的新功能?
进一步的讨论:
Tastypie禁用CSRF保护除与会话验证,它具有自定义代码在authentication.py
。 你必须同时通过cookie的csrftoken
饼干和头部X-CSRFToken
的认证工作。 (这是Tastypie的要求。)假设同一个域,浏览器会通过的cookie。 jQuery将通过标题为你,除非csrftoken Cookie是仅Http。 相反,如果cookie是仅Http,我无法甚至手动设置在头$.ajaxSetup{beforeSend...
。 看来,jQuery的自动设置X-CSRFToken到null
当csrftoken
Cookie是仅Http。 至少我能头X-CS_RFToken设置为我想要的东西,所以我知道我正确地传递价值。 我使用jQuery 1.10。
如果您使用的curl
进行测试,你必须通过两个cookie( sessionid
和csrftoken
),设置的标头X-CSRFToken
,如果该协议是HTTPS,还设置了Referrer
。
我在tastypie源代码中发现了这一点。 基本上意味着HTTP POST不SessionAuthentication支持。
class SessionAuthentication(Authentication):
"""
An authentication mechanism that piggy-backs on Django sessions.
This is useful when the API is talking to Javascript on the same site.
Relies on the user being logged in through the standard Django login
setup.
Requires a valid CSRF token.
"""
def is_authenticated(self, request, **kwargs):
"""
Checks to make sure the user is logged in & has a Django session.
"""
# Cargo-culted from Django 1.3/1.4's ``django/middleware/csrf.py``.
# We can't just use what's there, since the return values will be
# wrong.
# We also can't risk accessing ``request.POST``, which will break with
# the serialized bodies.
if request.method in ('GET', 'HEAD', 'OPTIONS', 'TRACE'):
return request.user.is_authenticated()
所以在这里回答我的问题,但如果有人能更好地解释,并提出一个好办法做到这一点,那将是巨大的。
编辑
我目前使用的一种变通方法https://github.com/amezcua/TastyPie-DjangoCookie-Auth/blob/master/DjangoCookieAuth.py基本上是提取了一个自定义验证方案session_id
从cookie并检查与后端如果它被验证。 也许不是最充分论证解决方案,但伟大工程。