«недопустимый токен CSRF (межсайтовый запрос подделки)» на некоторых маршрутах - PullRequest
0 голосов
/ 08 марта 2019

Я получаю эту ошибку при отправке формы.Форма имеет скрытое поле _csrf_token, как можно увидеть на снимке экрана ниже:

enter image description here

Однако, когда оно отправлено, токен не проходит проверку:

[debug] ** (Plug.CSRFProtection.InvalidCSRFTokenError) invalid CSRF (Cross Site Request 
Forgery) token, make sure all requests include a valid '_csrf_token' param or 
'x-csrf-token' header
    (plug) lib/plug/csrf_protection.ex:233: Plug.CSRFProtection.call/2

Мой код довольно стандартный:

router.ex

scope "/account" do
  pipe_through :browser

  get "/redeem/:token", MyAppWeb.Accounts.AccountController, :verify_invitation
  post "/redeem", MyAppWeb.Accounts.AccountController, :redeem_invitation
end

account_controller.ex

#renders the form
def verify_invitation(conn, %{"token" => token}) do
  conn
  |> put_status(:ok)
  |> put_flash(:info, "Invitation verified. Please choose a password.")
  |> put_view(MyAppWeb.Accounts.AccountView)
  |> render("redeem.html", invitation: invitation)
end

#simplified
def redeem_invitation(conn, %{"token" => token, "user" => %{"password" => password, "password_confirmation" => password_confirmation}}) do
  conn
  |> redirect(external: MyAppWeb.Router.Helpers.login_page_url(conn, MyAppWeb.Endpoint, :new) <> "?action=redeem")
end

redeem.html.eex

<%= form_for @conn, redeem_invitation_path(@conn, :redeem_invitation), fn f -> %>

  # stuff

  <%= submit "Create Account", class: "btn btn-indigo ml-0" %>

<% end %>

Почему токен CSRF не проходит проверку?

1 Ответ

1 голос
/ 10 марта 2019

У вас случайно не появился второй pipe_through: браузер в вашем router.ex?Если так, то это может быть причиной проблемы.

...