Токен CSRF отсутствует в сообщении Facebook «подписанный запрос»

#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:

Для этого вам нужно сделать несколько вещей:

  1. Вам нужно будет передать свой токен csrf в качестве параметра для вашего запроса facebook, как показано в конце их документации:
  2. Далее вам нужно будет украсить свой вид с помощью @csrf_exempt , как предложил Марк.
  3. Наконец, на ваш взгляд, вы можете убедиться, что токен csrf в порядке. Вы можете украсть некоторую логику, взглянув на код промежуточного программного обеспечения django csrf, который можно найти здесь.

В качестве альтернативы, вместо шагов 2 и 3 вы можете написать собственное промежуточное программное обеспечение для проверки токенов csrf, поступающих из facebook.

Ответ №3:

ищите приложение fandjango, особенно промежуточное программное обеспечение. https://github.com/jgorset/fandjango это сделало это со мной