Tastypie 不发送 cookie
Posted
技术标签:
【中文标题】Tastypie 不发送 cookie【英文标题】:Tastypie not sending a cookie 【发布时间】:2013-09-24 18:14:48 【问题描述】:我正在使用 Tastypie 制作我的 API。我正在使用以下功能登录
def signin(self, request, **kwargs):
self.method_check(request, allowed=['post'])
data = self.deserialize(request, request.body, format=request.META.get('CONTENT_TYPE', 'application/json'))
username = data.get('username', '')
password = data.get('password', '')
try:
user = User.objects.get(username=data.get('username', ''))
if user.get_profile().status == 3 or user.get_profile().status == 4:
return self.create_response(request, 'success': False, 'reason': 'Account Disabled or Closed' )
user = authenticate(username=username, password=password)
if user:
if user.get_profile().status == 2:
return self.create_response(request, 'success': True,'is_verified':False )
return self.create_response(request, 'success': True,'is_verified':True )
else:
return self.create_response(request, 'success': False, 'reason': 'Wrong Email or Password' )
except User.DoesNotExist:
return self.create_response(request, 'success': False, 'reason':'Email not registered' )
但是当我使用 jQuery 登录时
<script type="text/javascript">
$(document).ready(function()
$( "#signin" ).click(function()
var username=$("#inputEmail1").val();
var password=$("#inputPassword1").val();
if (username.length == 0 || password.length == 0)
alert('enter email and password to login.')
else
$.ajax(
type: "POST",
url: "/api/v1/user/signin/",
data: JSON.stringify( 'username':username,'password':password ),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data, status, xhr)
$.cookie();
if (data.success)
if (data.is_verified)
alert('Logged in and is_verified');
else
alert('Logged in but not verified');
else
alert('Incorrect username or password');
,
failure: function(errMsg)
alert(errMsg);
);
;
);
)
</script>
但是当我尝试使用 $.cookie(); 获取我的 cookie 时在萤火虫中(使用jquery-cookie),但它返回一个空对象(Object )
我错过了什么吗?我应该添加一些东西吗?这确实适用于 ios。它以某种方式获取 cookie 并记住会话。但不在这里。
【问题讨论】:
你看萤火虫的反应了吗?你能看到一个 Set-Cookie 响应头吗? @TommasoBarbugli 不,我不能。 【参考方案1】:您的signin
方法没有设置任何cookie,因此没有jQuery 可以访问的cookie。我不知道这对您在 iOS 上有何作用(来自另一个会话/手动登录的剩余 cookie?)但除非您在嗅探到 iOS 的流量时可以看到 Set-Cookie 标头,否则问题出在signin
.
要在 Django 中设置会话 cookie,您需要将要保存的值添加到 request.session
:
request.session['success'] = true
return self.create_response(request, 'success': True,'is_verified':False )
顺便说一句,此代码中还有一个信息泄露漏洞,因为它允许攻击者确定用户名在系统上是否有效。通常,login
函数应该为无效的用户名或无效的密码返回相同的错误(同时)。
【讨论】:
您对漏洞的看法是完全正确的。我修好了。但事实证明,我又做了一件愚蠢的事。我没有登录用户,只是对他们进行了身份验证。我也应该登录(请求,用户)。之后一切正常 我假设login(request, user)
是一个设置会话cookie 的函数。所以是的,这可以解决问题。以上是关于Tastypie 不发送 cookie的主要内容,如果未能解决你的问题,请参考以下文章