Как заставить 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 ответ:
Маркер подлинности отличается для каждой страницы/запроса, поэтому вам нужно найти способ отправить его через канал каким-то другим способом.
Может быть, попробовать отправить его через заголовки, например:
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.