#django #facebook #csrf
#django #Facebook #csrf
Вопрос:
Я работаю с проектом Django. Цель состоит в том, чтобы импортировать информацию о пользователе из Facebook. Для начала я использую социальный плагин для регистрации, который предлагает Facebook. У меня есть базовый шаблон, который включает iframe для подключаемого модуля регистрации; именно так, как предлагает документация Facebook api. Представление, которое отображает этот шаблон, выглядит следующим образом:
def registration(request):
if (request.method == "POST"):
return HttpResponse("it posted!")
else:
return render_to_response("ui/registration.html", {},
context_instance=RequestContext(request))
Как только я нажимаю register в плагине и Facebook отправляет моему view подписанный запрос, Django жалуется на отсутствие токена csrf. Я также попытался явно включить csrf-токен, передав его в контекстный словарь с помощью csrf (request), однако это все еще не решает проблему.
Ответ №1:
Защита CSRF существует для предотвращения сообщений на разных сайтах. Однако в этом случае вы хотите принять сообщение от Facebook, поэтому вам следует использовать csrf_exempt
декоратор в вашем представлении, который принимает подписанный запрос. Смотрите раздел об исключениях CSRF: http://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#exceptions
Комментарии:
1. Я уже пробовал это решение, и да, это обходной путь. Однако facebook рекомендует использовать токен csrf. Проверьте конец страницы developers.facebook.com/docs/authentication .
2. Их метод передачи токена csrf отличается от Django, что означает, что вам придется использовать исключение и выполнить проверку самостоятельно.
Ответ №2:
Для этого вам нужно сделать несколько вещей:
- Вам нужно будет передать свой токен csrf в качестве параметра для вашего запроса facebook, как показано в конце их документации:
- Далее вам нужно будет украсить свой вид с помощью
@csrf_exempt
, как предложил Марк. - Наконец, на ваш взгляд, вы можете убедиться, что токен csrf в порядке. Вы можете украсть некоторую логику, взглянув на код промежуточного программного обеспечения django csrf, который можно найти здесь.
В качестве альтернативы, вместо шагов 2 и 3 вы можете написать собственное промежуточное программное обеспечение для проверки токенов csrf, поступающих из facebook.
Ответ №3:
ищите приложение fandjango, особенно промежуточное программное обеспечение. https://github.com/jgorset/fandjango это сделало это со мной