Chcę napisać POST request
do mojego lokalnego dewelopera w następujący sposób:
HTTParty.post('http://localhost:3000/fetch_heroku',
:body => {:type => 'product'},)
Jednak z konsoli serwera to raportuje
Started POST "/fetch_heroku" for 127.0.0.1 at 2016-02-03 23:33:39 +0800
ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations".* FROM "schema_migrations"
Processing by AdminController#fetch_heroku as */*
Parameters: {"type"=>"product"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 1ms
Oto konfiguracja mojego kontrolera i tras, jest to dość proste.
def fetch_heroku
if params[:type] == 'product'
flash[:alert] = 'Fetch Product From Heroku'
Heroku.get_product
end
end
post 'fetch_heroku' => 'admin#fetch_heroku'
Nie jestem pewien, co muszę zrobić? Wyłączenie CSRF na pewno by się udało, ale myślę, że to powinien być mój błąd podczas tworzenia takiego API.
Czy muszę wykonać jakąś inną konfigurację?
ruby-on-rails
cqcn1991
źródło
źródło
protect_from_forgery with: :null_session
.Odpowiedzi:
Fałszerstwo żądań między lokacjami (CSRF / XSRF) ma miejsce, gdy złośliwa strona internetowa nakłania użytkowników do wykonania żądania, które nie jest przeznaczone, na przykład za pomocą bookmarkletów, ramek iframe lub po prostu tworząc stronę, która jest wizualnie na tyle podobna, aby oszukać użytkowników.
Ochrona Szyny CSRF jest dla „klasycznych” aplikacji internetowych - to po prostu daje stopień pewności, że żądanie pochodzi z własnej aplikacji internetowej. Token CSRF działa jak sekret, który zna tylko twój serwer - Railsy generują losowy token i przechowuje go w sesji. Twoje formularze wysyłają token przez ukryte wejście, a Railsy sprawdzają, czy każde żądanie inne niż GET zawiera token, który pasuje do tego, co jest przechowywane w sesji.
Jednak interfejs API jest zwykle z definicji między witrynami i ma być używany nie tylko w Twojej aplikacji internetowej, co oznacza, że cała koncepcja CSRF nie do końca ma zastosowanie.
Zamiast tego powinieneś użyć strategii opartej na tokenach, polegającej na uwierzytelnianiu żądań API za pomocą klucza API i klucza tajnego, ponieważ weryfikujesz, czy żądanie pochodzi od zatwierdzonego klienta API, a nie z Twojej własnej aplikacji.
Możesz dezaktywować CSRF, jak wskazał @dcestari:
class ApiController < ActionController::Base protect_from_forgery with: :null_session end
Zaktualizowano. W Railsach 5 możesz generować aplikacje tylko dla API używając
--api
opcji:rails new appname --api
Nie obejmują one oprogramowania pośredniczącego CSRF ani wielu innych komponentów, które są superflouusem.
źródło
Innym sposobem na wyłączenie CSRF, który nie wyrenderuje sesji zerowej, jest dodanie:
skip_before_action :verify_authenticity_token
w kontrolerze Rails. Zapewni to, że nadal będziesz mieć dostęp do informacji o sesji.
Ponownie upewnij się, że robisz to tylko w kontrolerach API lub w innych miejscach, w których ochrona CSRF nie ma zastosowania.
źródło
protect_from_forgery except: [:my_method_name]
?Odpowiednie informacje na temat konfiguracji CSRF w odniesieniu do kontrolerów API można znaleźć na api.rubyonrails.org :
źródło
protect_from_forgery
jest to nadal konieczne dla interfejsów API, a źródłami, które twierdzą, że tak nie jest. Co się stanie, jeśli interfejs API jest przeznaczony dla aplikacji z pojedynczą stroną, która używa pliku cookie sesji do uwierzytelniania użytkownika?Od Rails 5 możesz także utworzyć nową klasę za pomocą :: API zamiast :: Base:
class ApiController < ActionController::API end
źródło
Jeśli chcesz wykluczyć przykładową akcję kontrolera próbki
class TestController < ApplicationController protect_from_forgery :except => [:sample] def sample render json: @hogehoge end end
Możesz bez problemu rozpatrywać wnioski z zewnątrz.
źródło
Najprostszym rozwiązaniem tego problemu jest wykonanie standardowych czynności w kontrolerze lub bezpośrednie umieszczenie go w ApplicationController
class ApplicationController < ActionController::Base protect_from_forgery with: :exception, prepend: true end
źródło