Rails не может проверить подлинность токена CSRF в ShopifyAPI :: Product.delete (), но работает в ShopifyAPI :: Product.find () ` - PullRequest
1 голос
/ 01 июня 2019

Я создаю общедоступное встроенное приложение для Shopify с простой целью: получить список товаров, которых нет в наличии, и дать владельцу возможность удалить их. Я делаю запрос API, чтобы найти продукты, которых нет в наличии, который работает нормально. Хотя, когда я пытаюсь удалить продукты, я получаю сообщение «не могу подтвердить CSRF ...»

Я использую rails 5.2.3 и ruby ​​2.5.0, я пытался использовать другую версию rails, убедился, что у меня есть <% csrf meta ...%> в моем макете, и у приложения есть 'write_products разрешения в URL авторизации.

Я новичок в рельсах, поэтому я надеюсь, что это результат простой ошибки, которую я совершаю.

Вот мои маршруты.рб:

Rails.application.routes.draw do
  root :to => 'home#index'
  mount ShopifyApp::Engine, at: '/'
  post '/destroy', to: 'home#destroy'
end

home_controller:

class HomeController < AuthenticatedController
  def index
    @products = ShopifyAPI::Product.find(:all, params: { limit: 10 })
    @webhooks = ShopifyAPI::Webhook.find(:all)
  end

  def destroy
    params[:product_ids].each do |product_id|
      puts product_id
      ShopifyAPI::Product.delete(product_id)
    end
  end
end

и HTML-форма, отправляющая почтовый запрос:

<form action="destroy" method="post">
<% @products.each do |product| %>
  <% if product.variants.all? { |variant| variant.inventory_quantity == 0 } %>
    <input type="checkbox" name="product_ids[]" value="<%=product.id%>"><%= product.title %></input>
  <% end %>
<% end %>
<button type="submit">delete products</button>
</form>

Форма POST выбирает product_id для маршрута уничтожения, что вызывает вызов API для удаления каждого продукта.

Соответствующий вывод журналов Heroku:

2019-06-01T16:47:00.028409+00:00 app[web.1]: I, [2019-06-01T16:47:00.028316 #4]  INFO -- : [f88f9c69-7c6c-4a31-a386-f6916c295700] Started POST "/destroy" for 24.96.97.148 at 2019-06-01 16:47:00 +0000
2019-06-01T16:47:00.029561+00:00 app[web.1]: I, [2019-06-01T16:47:00.029496 #4]  INFO -- : [f88f9c69-7c6c-4a31-a386-f6916c295700] Processing by HomeController#destroy as HTML
2019-06-01T16:47:00.029628+00:00 app[web.1]: I, [2019-06-01T16:47:00.029573 #4]  INFO -- : [f88f9c69-7c6c-4a31-a386-f6916c295700]   Parameters: {"product_ids"=>["1594488094775"]}
2019-06-01T16:47:00.029867+00:00 app[web.1]: W, [2019-06-01T16:47:00.029808 #4]  WARN -- : [f88f9c69-7c6c-4a31-a386-f6916c295700] Can't verify CSRF token authenticity.

EDIT:

Я обновил свой маршрут до: post '/home', to: 'home#destroy'

и использовал метод form_tag для создания моей формы, которая добавила в форму маркер аутентификации:

<%= form_tag(home_path) do %>
<% @products.each do |product| %>
  <% if product.variants.all? { |variant| variant.inventory_quantity == 0 } %>
    <input type="checkbox" name="product_ids[]" value="<%=product.id%>"><%= product.title %></input>
  <% end %>
<% end %>
<button type="submit">delete products</button>
<% end %>
</form>

И это решило мою проблему.

1 Ответ

0 голосов
/ 01 июня 2019

Я думаю, что вы забыли = в вашем csrf_meta_tag.

<%= csrf_meta_tag %>

<%= указывает, что выходные данные команды должны быть напечатаны в html, тогда как <% - это просто операция без печати в html.

...