Uwierzytelnianie HTTP między aplikacją devise i iPhone

Jestem nowy w ruby on rails, ale chcę wysłać dane z mojej bazy danych SQlite z mojej aplikacji na iphone ' a do aplikacji internetowej rails. Jak usługa "synchronizacji".

Używam devise do uwierzytelniania aplikacji internetowej. Włączyłem podstawowe uwierzytelnianie HTTP i mogę zwijać się w witrynie dla danych xml lub json. Mogę również przesłać dane do strony internetowej, gdy ustawiam nagłówki postów na JSON i z nazwą użytkownika i hasłem.

Tu utknąłem.

1) Jak utrzymać zalogowanego użytkownika po pierwszy login? Czy używam uwierzytelniania http za każdym razem, gdy wysyłam dane do witryny? Czytałem o uwierzytelnianiu tokenowym, ale nie jestem pewien, jak z niego korzystać.

2) mogę wrzucić dane JSON do czegoś takiego jak http://localhost:3000/example z prawidłową nazwą użytkownika i hasłem. Zwraca jednak zawartość HTML, jeśli nazwa użytkownika i passowrd są nieprawidłowe. Czy muszę napisać coś, co zwróci dane json o sukcesie logowania/fialure?

3) aby komunikować się między moją aplikacją iphone i moja aplikacja internetowa. Czy mam rację pisząc RESTful API po stronie aplikacji internetowej? Czy muszę korzystać z aktywnych zasobów?

Naprawdę utknąłem w ogólnym ogólnym obrazie tego, jak to wszystko działa. Dzięki!

Author: brainjam, 2011-06-25

2 answers

Można to zrobić na wiele sposobów. To, co zrobiłem, aby Devise zwrócił błędy do mojej aplikacji na iphone ' a, które mogłem zinterpretować (np.]}

# 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

W Przeciwnym Razie Devise po prostu zwraca HTML z kodem odpowiedzi przekierowania, niezależnie od tego, czy dane logowania były poprawne czy nieprawidłowe.

Ponieważ moja aplikacja wymagała od użytkowników uwierzytelniania za pomocą mojego backendu rails, zaimplementowałem prosty system logowania, taki jak ten:

#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'

Następnie w aplikacji iphone można można zweryfikować Wysyłając zapytanie GET do / login w ten sposób (używam ASIHTTPRequest ponieważ jest super):

- (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    
}

Następnie za każdym razem, gdy musisz opublikować dane do aplikacji, możesz pobrać nazwę użytkownika i hasło z domyślnych ustawień użytkownika i dołączyć je do żądania. Jeśli chcesz być bardziej bezpieczny, możesz przechowywać je w Pęku Kluczy.

Jestem pewien, że istnieją lepsze sposoby, aby to zrobić, ale mam nadzieję, że to może skłonić cię do myślenia o strategiach uwierzytelniania API.

 22
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-26 09:43:04

Polecam zapoznanie się z dokumentacją podaną tutaj

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

Możesz też chcieć dwóch oglądających screencasty na devise.

Ponieważ istnieje wiele różnych sposobów obsługi auth, powinieneś lepiej zrozumieć, co jest dostępne, ponieważ devise obsługuje basicauth i token based auth

 0
Author: Aaron Saunders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-25 00:24:06