Подтвердить что ты не робот

HTTP-аутентификация между приложением и приложением iphone

Я новичок в ruby ​​on rails, но хочу отправить данные из своей базы данных SQlite из своего приложения iphone в веб-приложение rails. Как услуга "sync".

Я использую программу для аутентификации для веб-приложения. Я включил базовую HTTP-аутентификацию, и я могу зависнуть на веб-сайте для данных xml или json. Я также могу загружать данные на веб-сайт, когда я устанавливаю заголовки сообщений в JSON и с именем пользователя и паролем.

Здесь, где я застрял.

1) Как мне войти в аккаунт после первого входа? Я использую HTTP-аутентификацию каждый раз, когда я отправляю данные на веб-сайт? Я читал об аутентификации токена, но я не уверен, как его использовать.

2) Я могу опубликовать данные JSON в виде http://localhost:3000/example с правильным именем пользователя и паролем. Тем не менее, он возвращает содержимое HTML, если имя пользователя и passowrd неверны. Должен ли я написать что-то, что возвращает данные json о успехе /fialure входа в систему?

3) Для связи между моим iphone-приложением и моим веб-приложением. Правильно ли я писал API RESTful на стороне веб-приложения? Нужно ли использовать активные ресурсы?

Я действительно зациклился на общей общей картине того, как все это работает. Спасибо!

4b9b3361

Ответ 1

Есть много способов сделать это. Что я сделал, чтобы заставить Devise возвращать ошибки в моем приложении iphone, которое я мог бы интерпретировать (например, 401), было создание пользовательского приложения для отказа:

# config/initializers/devise.rb
config.warden do |manager|
  manager.failure_app   = CustomFailure
end

# config/initializers/custom_failure.rb
class CustomFailure < Devise::FailureApp     
  def respond
    unless request.format.to_sym == :html
  http_auth
    else
  super
end
  end
end

В противном случае Devise просто возвращает HTML с кодом ответа на перенаправление независимо от того, была ли правильная или неправильная информация для входа.

Так как мое приложение требовало от пользователей аутентификации на моем брандмауэре rails, я реализовал простую систему входа в систему следующим образом:

#app/controllers/pages_controller.rb
before_filter :authenticate_user!, :only => [:login]
ssl_required :login # you have to set up ssl and ssl_requirement


def login
  @user = current_user
  respond_to do |format|
    format.html {render :text => "#{@user.id}"} 
    format.xml {render :text => "#{@user.id}" }   
  end
end

#config/routes.rb
match '/login',       :to => 'pages#login'

Затем в приложении iphone вы можете проверить, отправив запрос GET в /login, как это (я использую ASIHTTPRequest, потому что это потрясающе):

- (void) validate_login:(NSString*)name :(NSString*)pwd
{   
    NSURL *login_url = [NSURL URLWithString:@"https://mysite.com/login"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:login_url];
    [request setDelegate:self];
    [request setUsername:name];
    [request setPassword:pwd];  
    [request addRequestHeader:@"Accept" value:@"application/xml"]; 
    [request startAsynchronous];    
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
if ([request responseStatusCode] != 200) {
  [self requestFailed:request];
}
    else {
  // authentication successful, store credentials
        NSUSerDefaults* defaults = [NSUserDefaults standardUserDefaults];
    [defaults setValue:[request username] forKey:@"username"];
        [defaults setValue:[request password] forKey:@"password"];
    }
}


- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSLog(@"failed with error: %d %@", [request responseStatusCode], [error localizedDescription]);
    // tell user incorrect username/password    
}

Затем, когда вам нужно отправить данные в приложение, вы можете получить имя пользователя и пароль из пользовательских значений по умолчанию и приложить их к запросу. Если вам нужно быть более безопасным, вы можете сохранить их в цепочке ключей.

Я уверен, что есть лучшие способы сделать это, но, надеюсь, это может заставить вас задуматься о стратегиях аутентификации API.

Ответ 2

Я бы порекомендовал взглянуть на предоставленную здесь документацию

https://github.com/plataformatec/devise/blob/v1.1.6/README.rdoc

Возможно, вам также понадобятся две часовые ролики на экране.

Поскольку существует много различных способов обработки auth, вы должны лучше понять, что доступно, поскольку devise поддерживает basicAuth и токены на основе auth