diff --git a/ajax-sosp-cors-csrf.html b/ajax-sosp-cors-csrf.html index b3932ab..cd8d2b4 100644 --- a/ajax-sosp-cors-csrf.html +++ b/ajax-sosp-cors-csrf.html @@ -205,6 +205,139 @@ CORS_ORIGIN_REGEX_WHITELIST = ( views.
+ +Para resolver URLs, usamos a tag {% url vew_id %}
+ para retornar a URL da view.
O problema é que é retornada a URL absoluta para a view, + sem considerar o domínio da view.
+
+<a href='/view/'>
+
+
+ em http://outrosite.com
vira
+ http://outrosite.com/view/
.
Mas se a view estiver num domínio diferente, o mesmo + não é considerado.
+http://outrosite.com
carregar o conteúdo
+ de http://api.outrosite.com
http://api.outrosite.com
tiver uma view
+ com URL absoluta /view/
http://outrosite.com/view/
http://api.outrosite.com/view/
.Solução: considerar que SITE_URL
(do
+ settings.py
) está correto e usar nas URLs.
+<a href='{{ settings.SITE_URL }}{% url "view_id" %}'>
+
+ Resumo:
+ +Problema: Informações do token é passada num cookie.
+ +
+Set-Cookie: "csrftoken=t5HBi8EbkPk340nnpkdb8qxQsy2n8LwY;
+ expires=Tue, 04-Aug-2015 16:40:38 GMT; Max-Age=31449600; Path=/"
+
+
+ Cookies não são processados durante requisições AJAX.
+Solução correta:
+ +Ao receber uma requisição AJAX, processar os headers também, + verificar a existência de "Set-Cookie", verificar se "csrftoken" + está na lista, guardar o valor e usar nas requisições seguintes.
+Solução utilizada:
+ +
+from django.views.decorators.csrf import csrf_exempt
+
+@csrf_exempt
+def minha_view(request):
+ ....
+
+
+class MinhaView(View):
+ @csrf_exempt
+ def post(self, request):
+ ....
+
+
+ ... não funciona.
+É preciso aplicar decorators no dispatch da view:
+ +
+ @csrf_exempt
+ def dispatch(self, *args, **kwargs):
+ u"""Altera o dispatch para dispensar CSRF (por cauxa do AJAX)."""
+ return super(MinhaView, self).dispatch(*args, **kwargs)
+
+