Как заставить Ruby on Rails работать с ASIHTTPRequest? - PullRequest
2 голосов
/ 22 декабря 2010

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

Я настроил токен подлинности в application.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 Ответ

4 голосов
/ 22 декабря 2010

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

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

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.

...