2016-02-03 11 views
29

chcę zrobić POST request do mojego lokalnego dev, tak:szyn: Nie można zweryfikować autentyczności tokenu CSRF podczas dokonywania żądania POST

HTTParty.post('http://localhost:3000/fetch_heroku', 
       :body => {:type => 'product'},) 

Jednak z konsoli serwera raportów to

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 mój kontroler i ustawienia trasy, to całkiem 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 z pewnością zadziałałoby, ale uważam, że powinienem popełnić błąd podczas tworzenia takiego API.

Czy muszę wykonać inne ustawienia?

+3

Dla interfejsów API jest ogólnie akceptowane wyłączanie sprawdzania tokenu _CSRF_.Używam 'protect_from_forgery with:: null_session'. – dcestari

Odpowiedz

39

Fałszywe odwołanie do witryny krzyżowej to sytuacja, gdy złośliwa strona internetowa nakłania użytkowników do wykonania żądania, które nie jest przeznaczone na przykład za pomocą skryptozakładek, elementów iframe lub po prostu utworzenie strony wystarczająco podobnej wizualnie, aby oszukać użytkowników.

Urządzenie jest przeznaczone dla "klasycznych" aplikacji internetowych - po prostu daje pewność, że żądanie pochodzi z Twojej aplikacji internetowej. Token CSRF działa jak sekret, który zna tylko twój serwer - Rails generuje losowy token i zapisuje go w sesji. Twoje formularze wysyłają token przez ukryte dane wejściowe, a Railsi weryfikują, czy każde żądanie niezwiązane z GET zawiera token odpowiadający zawartości zapisanej w sesji.

Jednak interfejs API zazwyczaj jest z definicji przekierowywany i ma być używany w więcej niż w aplikacji internetowej, co oznacza, że ​​cała koncepcja CSRF nie ma zastosowania.

Zamiast tego należy użyć strategii opartej na tokenie uwierzytelniania żądań interfejsu API za pomocą klucza API i tajnego klucza, ponieważ sprawdza się, czy żądanie pochodzi od zatwierdzonego klienta interfejsu API - a nie z własnej aplikacji.

Można wyłączyć CSRF jak podkreślił @dcestari:

class ApiController < ActionController::Base 
    protect_from_forgery with: :null_session 
end 

aktualizowana. W Rails 5 można generować tylko API aplikacji za pomocą opcji --api:

rails new appname --api 

Nie obejmują one middleware CSRF i wiele innych elementów, które są superflouus.

+0

Dzięki, postanawiam wyłączyć część CSRF z: http://stackoverflow.com/questions/5669322/turn-off-csrf-token-in-rails-3 – cqcn1991

22

Innym sposobem, aby wyłączyć CSRF, że nie odda null sesji jest dodanie:

skip_before_action :verify_authenticity_token w Rails kontrolera. To zapewni, że nadal będziesz mieć dostęp do informacji o sesji.

Znowu upewnij się, że robisz to tylko w kontrolerach API lub w innych miejscach, w których ochrona CSRF nie ma zastosowania.

Powiązane problemy