2011-06-24 13 views
24

Jestem nowy w rubinach na szynach, ale chcę wysłać dane z mojej bazy danych SQlite z mojej aplikacji na iPhone do aplikacji internetowej rails. Jak usługa "synchronizacji".Uwierzytelnianie HTTP między aplikacją devise i iphone

Używam urządzenia do uwierzytelniania w aplikacji internetowej. Włączyłem podstawowe uwierzytelnianie HTTP i mogę zwinąć się w witrynie dla danych xml lub json. Mogę również przesłać dane do witryny po ustawieniu nagłówków postów na JSON oraz przy użyciu nazwy użytkownika i hasła.

Oto, gdzie utknąłem.

1) Jak zachować logowanie użytkownika po pierwszym zalogowaniu? Czy korzystam z uwierzytelniania http za każdym razem, gdy wysyłam dane do witryny? Czytałem o uwierzytelnianiu tokena, ale nie jestem pewien, jak go użyć.

2) Mogę wysłać dane JSON do czegoś takiego jak http://localhost:3000/example z poprawną nazwą użytkownika i hasłem. Jednak zwraca treść HTML, jeśli nazwa użytkownika i passowrd jest niepoprawna. Czy muszę napisać coś, co zwróci dane json dotyczące sukcesu logowania/fialury?

3) Do komunikacji między moją aplikacją na iPhone a moją aplikacją internetową. Czy poprawne jest pisanie RESTful API po stronie aplikacji webowej? Czy muszę korzystać z aktywnych zasobów?

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

Odpowiedz

22

Istnieje wiele sposobów można to zrobić. Co zrobiłem, aby uzyskać Devise powrotu błędów do mojego iPhone App że mogę zinterpretować (np 401) było stworzenie aplikacji niestandardowych awaria:

# 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 

Inaczej Opracować prostu zwraca HTML z kodem odpowiedzi przekierowania, niezależnie od tego, czy logowania informacja była poprawna lub niepoprawna.

Ponieważ moja aplikacja wymaga użytkowników do uwierzytelnienia przed moim szyn backend, I wdrożone prosty system logowania takiego:

#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 potwierdzić wysyłając żądanie GET do/login jak ta (używam ASIHTTPRequest bo to niesamowite):

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

Wtedy, kiedy trzeba dodawać dane do aplikacji można pobrać nazwę użytkownika i hasło z domyślnych użytkowników i dołączyć je do wniosku. Jeśli chcesz być bardziej bezpieczny, możesz przechowywać je w pęku kluczy.

Jestem pewien, że są lepsze sposoby na zrobienie tego, ale mam nadzieję, że może to zmusić cię do myślenia o strategiach uwierzytelniania API.

+0

Hej Johnny, włączam podstawową autoryzację http i próbowałem ją zaimplementować i za każdym razem, gdy próbuję uzyskać dostęp do http: // localhost: 3000/login? Użytkownik [email] [email protected]&user [hasło] = hasło, otrzymuję "{" error ":" Musisz się zalogować lub zarejestrować, zanim przejdziesz dalej. "}" Twoje myśli? – BeachRunnerFred

0

Polecam przyjrzeniu dokumentacji dostarczonej tutaj

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

kupili także dwa oglądać screencasts na devise.

Ponieważ istnieje wiele różnych sposobów obsługi uwierzytelniania, należy uzyskać lepsze zrozumienie tego, co jest dostępne od Devise obsługuje basicauth i Token auth oparty

+1

Dzięki Aaron. Czytałem readme wiele razy. Widziałem także screencasty na railscast. Potrzebuję tylko pewnego rodzaju ram, które mogę śledzić. Jest tak wiele pojęć, że ciężko mi je połączyć. –

Powiązane problemy