Как выборочно отключить проверку CSRF в фреймворке Phoenix

Я пытаюсь создать вкладку страницы Facebook, которая указывает на мой сайт. Facebook отправляет HTTP-запрос POST на URL-адрес моего сайта. Проблема здесь в том, что сервер имеет встроенную проверку CSRF и возвращает следующую ошибку:

(Plug.CSRFProtection.InvalidCSRFTokenError) invalid CSRF (Cross Site  Forgery Protection) token, make sure all requests include a '_csrf_token' param or an 'x-csrf-token' header`

Сервер ожидает токен CSRF, который не может быть у Facebook. Итак, я хочу выборочно отключить CSRF для пути www.mywebsite.com/facebook.

Как я могу сделать это в Phoenix Framework?


person N. Sola    schedule 15.09.2015    source источник


Ответы (1)


Plug.CSRFProtection включен на вашем маршрутизаторе с помощью protect_from_forgery. Это установлено по умолчанию в конвейере browser. После того, как плагин был добавлен, его невозможно отключить, вместо этого его нужно не устанавливать в первую очередь. Вы можете сделать это, переместив его из browser и включив его только тогда, когда это необходимо.

defmodule Foo.Router do
  use Foo.Web, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    #plug :protect_from_forgery - move this
  end

  pipeline :csrf do
    plug :protect_from_forgery # to here
  end

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/", Foo do
    pipe_through [:browser, :csrf] # Use both browser and csrf pipelines

    get "/", PageController, :index
  end

  scope "/", Foo do
    pipe_through :browser # Use only the browser pipeline

    get "/facebook", PageController, :index #You can use the same controller and actions if you like
  end

end
person Gazler    schedule 15.09.2015