Wysłanie formularza z zewnątrz

Witam wszystkich,

do tej pory byłem “czytaczem”, ale pora coś napisać :slight_smile: Mam napisaną aplikację w Rails i potrzebuję z zewnętrznego skryptu dodać dane. Nie chcę robić tego bezpośrednio do bazy, bo dane są obrabiane przez aplikację. W tym konkretnym przypadku potrzebuję dodać zamówienie (model Order), a więc zgodnie z REST wysyłam dane POSTem do www.mojaaplikacja.com/orders.

Niestety dostaję komunikat:
ActionController::InvalidAuthenticityToken

Oczywiście zapewne chodzi o zabezpieczenie w rodzaju Cross-Site. Zauważyłem, że Rails w swoich formularzach dodaje klucz authenticity_token typu hidden z hashem zabezpieczającym - skopiowałem ten hash do swojego wywołania POST, ale to nie pomaga. Gdzieś w sieci czytałem, że być może chodzi jeszcze o jakieś zabezpieczenie cookie, ale nic konkretniejszego nie było napisane.

Czy ktoś wie w jaki sposób przesłać te dane? Nie chciałbym też wyłączać tego zabezpieczenia, no chyba, że to będzie ostateczność.

Pozdrawiam!

http://apidock.com/rails/ActionController/RequestForgeryProtection/ClassMethods

Proponuje wyłączyć to zabezpieczenie natomiast razem z danymi przesyłaj jakiś unikalny token, który będziesz sprawdzał w kontrolerze. Jak token się zgadza znaczy, że żądanie przyszło z tej drugiej aplikacji.

Zmienianie saltu to jest bez sensu bo i tak go znam i podaje, a wyłączać też bym nie chciał :confused:

Mi nie chodzi o zmienianie saltu, tylko żebyś zrobił osobny hash do komunikacji z tą drugą aplikacją.

W obu możesz trzymać jakiś klucz np. ‘moj-super-tajny-klucz’ :). Teraz przy wysyłaniu zapytania pobierasz aktualny np. aktualny czas, dodajesz go do tego klucza i to wszystko razem hashujesz jakąś funkcją i razem z danymi wysyłasz ten hash i czas. Teraz w Railsach w akcji, która obsługuje tą akcję odczytujesz czas, dodajesz do tego samego tajnego klucza, hashujesz znowu i sprawdzasz czy się zgadzają hashe. I wtedy dla tej wybranej akcji możesz wyłączyć to wbudowane railsowe zabezpieczenie, dla wszystkich innych ono będzie.

A jak chcesz zrobić po railsowemu, to ten token jest trzymany albo w sesji albo w cookies więc trzeba albo ustanawiać sesje, albo przesyłać ciasteczka, żeby działało. przynajmniej tak mi się wydaje.

A żeby wyłączyć to zabezpieczenie dla jednej akcji trzeba dodać coś takiego do kontrolera

skip_before_filter :verify_authenticity_token, :only => :nazwa_akcji

Ronin wielkie dzięki za pomoc - póki co wyłączyłem na jednej akcji sprawdzanie railsowego tokenu i dodałem własny - tak jak proponowałeś. w przyszłości jak znajdę czas to może się pobawię rozgryzienie tego jak przechwycić ten railsowy token (prawdopodobnie cookie).

Doszedłem do ciekawej rzeczy - jeśli dane wyśle się np. XMLem, nie ma weryfikacji :slight_smile: