Как заставить Ruby on Rails работать с ASIHTTPRequest?


Я создаю приложение iOS с бэкендом Ruby on Rails. Я получил свою логику настройки и работы в Rails, и проверил путем тестирования в веб-браузере. Мое приложение Rails не будет должным образом реагировать на мое приложение iOS, говоря что-то о маркере подлинности.

Я установил маркер подлинности в приложении.rb со следующим кодом (я сделал перезагрузку сервера после добавления этого):

protect_from_forgery :secret => 'some_secret_here'

Я передаю маркер подлинности с iOS на Rails с помощью ASIHTTPRequest использует следующий код:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"some_secret_here" forKey:@"authenticity_token"];
[request setPostValue:@"some value" forKey:@"some_parameter"];
[request setDelegate:self];
[request startAsynchronous];
Есть ли что-то, что я упускаю или делаю неправильно?

Этот же код прекрасно работает с allow_forgery_protection, установленным в false, поэтому я предполагаю, что ошибка заключается в том, как я пытаюсь передать маркер подлинности.

1 2

1 ответ:

Маркер подлинности отличается для каждой страницы/запроса, поэтому вам нужно найти способ отправить его через канал каким-то другим способом.

Может быть, попробовать отправить его через заголовки, например:

class ApplicationController < ActionController::Base
    before_filter :send_form_authenticity_token

    private
      def send_form_authenticity_token
        response.headers['X-Authenticity-Token'] = form_authenticity_token
      end
end

При обратном ответе на ваш первый(и последующие) запрос (ы), вам нужно сделать:

NSString *authenticityToken = [[request responseHeaders] objectForKey:@"X-Authenticity-Token"];

Это означает, что первый запрос, который вы делаете, - это GET.

Было бы лучше иметь глобальную переменную состояния, но это основная концепция.

Кстати, и именно так вы знаете,вам не нужна защита от подделок, если ваше приложение rails - это просто бэкенд-приложение.

Защита от подделок существует, чтобы избежать атак XSS, и это не произойдет на iPhone.