2011-06-24 46 views
24

我是Ruby on Rails的新手,但我想從我的iPhone應用程序將數據從SQlite數據庫發送到Rails Web應用程序。就像一個「同步」服務。設計和iPhone應用程序之間的HTTP身份驗證

我正在使用devise進行Web應用程序的身份驗證。我啓用了基本的HTTP身份驗證,並且可以在網站上查找xml或json數據。當我將帖子標題設置爲JSON並使用用戶名和密碼時,我也可以將數據上傳到網站。

這裏是我卡住的地方。

1)如何在第一次登錄後讓用戶登錄?每次向網站發送數據時,我都使用http身份驗證嗎?我已閱讀關於令牌認證,但我不知道如何使用它。

2)我可以用正確的用戶名和密碼發佈JSON數據到類似http://localhost:3000/example的東西。但是,如果用戶名和密碼不正確,它將返回HTML內容。我是否必須編寫一些能夠返回有關登錄成功/拒絕的json數據的內容?

3)在我的iPhone應用程序和我的網絡應用程序之間進行通信。我是否正確地在Web應用程序端編寫了一個RESTful API?我需要使用活動資源嗎?

我真的停留在所有這些工作的整體大局。謝謝!

回答

22

有很多方法可以做到這一點。我做了什麼讓設計迴歸錯誤,我的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 

否則設計只是一個重定向響應代碼返回HTML無論是否登錄信息是正確的或不正確的。在iPhone應用程序,你可以通過發送GET請求,這樣/登錄驗證

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

然後:

由於我的應用程序需要用戶對我的rails後臺驗證,我實現了一個簡單的登錄系統,這樣(我用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認證策略。

+0

嘿約翰尼,我啓用了基本的HTTP身份驗證,我試圖實現這一點,每次我嘗試訪問http:// localhost:3000/login?user [email] [email protected]&user [password] = password,我得到一個「{」error「:」您需要先登錄或註冊才能繼續。「}」您的想法? – BeachRunnerFred

0

我建議考慮看看文檔這裏

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

提供您可能還希望兩家鐘錶上設計出截屏。

由於有許多不同的方式來處理身份驗證,你應該得到一個更好地瞭解什麼是可用的,因爲色器件支持BASICAUTH和基於令牌的身份驗證

+1

謝謝Aaron。我多次閱讀了自述文件。我也看到了railscast上的截屏視頻。我只需要一些我可以遵循的框架。我覺得很難把它放在一起。 –

相關問題