我想把我的iOS应用程序中的数据发布到我的Django服务器上-在URL中编码是不切实际的。我想在不使用表单的情况下完成此操作,只需发送JSON数据并将JSON数据输出。当我尝试时,我遇到了这个错误:
Forbidden (CSRF token missing or incorrect.)
对于开发,我目前正在通过声明我的视图方法为@csrf_exempt
来解决这个问题,但我担心这对生产不安全。如果我同时声明方法@login_required
,是吗?
假设它是不安全的,我怎么解决这个问题?我理解在HTML模板中使用{% csrf_token %}
的方法——我在其他Django应用中也使用过这种方法——但我实际上并没有使用表单,也不希望使用表单。我只是在JSON字典中编码我的请求数据,然后得到一个JSON字典。以下是客户端的相关部分:
下面是相关的服务器部分:
@login_required
def my_server_method(request):
data = simplejson.loads(request.body)
R = {}
# Do stuff with the data here and generate a response with JSON data in R
....
return HttpResponse(json.dumps(R), content_type="application/json")
根据我对CSRF机制的了解,CSRF令牌在整个会话中都是有效的。所以我想我可以通过以下方式实现这一点:a)在进行身份验证时,将CSRF令牌传递给iOS客户端,然后b)在我发布数据时包含该令牌。下面是我如何尝试的。在
在服务器上进行身份验证后,我找到带有此标记的CSRF令牌并将其发送到客户端:
session_csrf_token = django.middleware.csrf.get_token(request)
我试着通过修改上面的客户机代码来传递它。首先,我用我的session_csrf_token
(登录时在客户机上存储为_csrfToken
)来扩充发送的数据:
NSMutableDictionary *dictCSRF = [NSMutableDictionary dictionaryWithDictionary:dictWithMyData];
[dictCSRF setObject:_csrfToken forKey:@"csrfmiddlewaretoken"];
NSData *data = [NSJSONSerialization dataWithJSONObject:dictCSRF options:NSJSONWritingPrettyPrinted error:error];
然后我增加请求头,如下所示:
[request setValue:_csrfToken forHTTPHeaderField:@"X-CSRF-Token"];
但它不起作用。我得到同样的“CSRF令牌丢失或不正确”错误。在
有什么办法让它发挥作用吗?
目前没有回答
相关问题 更多 >
编程相关推荐