2011-06-24 11 views
24

私はレール上で初めてですが、自分のiPhoneアプリケーションからSQliteデータベースのデータをレールウェブアプリケーションに送信したいと思います。 "同期"サービスのように。deviseとiphoneアプリの間のHTTP認証

私はウェブアプリケーションの認証にdeviseを使用しています。私は基本的なHTTP認証を有効にし、xmlまたはjsonデータのためにウェブサイトに巻き込むことができます。ポストヘッダをJSONに設定し、ユーザ名とパスワードを設定すると、ウェブサイトにデータをアップロードすることもできます。

ここで私は立ち往生しています。

1)最初のログイン後にユーザーをサインインしたままにするにはどうすればよいですか?ウェブサイトにデータを送信するたびにhttp認証を使用しますか?私はトークン認証について読んだことがありますが、私はそれをどのように使用するか分かりません。

2)正しいユーザー名とパスワードを使用してhttp://localhost:3000/exampleのようなものにJSONデータを投稿できます。ただし、ユーザー名とパスワードが正しくない場合はHTMLコンテンツを返します。ログイン成功/失敗に関するjsonデータを返すようなものを書く必要がありますか?

3)私のiPhoneアプリと私のWebアプリとの間でやり取りする。 Webアプリケーション側でRESTful APIを記述するのが正しいですか?アクティブなリソースを使用する必要がありますか?

私は本当にこのすべての仕組みの全体的な全体像に固執しています。ありがとう!

答えて

22

をトークンする必要があり、あなたがこれを行うことができます多くの方法があります。

# 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アプリ(例えば401)にエラーを返すように取得するためにやったことはカスタム障害アプリを作成しました情報が正しいか正しくない。

私のアプリは、私のレールのバックエンドに対して認証するユーザーを必要とするので、私はこのような単純なログインシステムを実装:

#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リクエストを送信することにより検証することができます(それは素晴らしいですので、私は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] =パスワードにアクセスしようとするたびに、 "{"エラー ":続行する前にサインインまたはサインアップする必要があります。"} "あなたの考えは? – BeachRunnerFred

0

私はここ

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

あなたはまた、2は工夫のスクリーンキャストを見たい場合があります提供された文書を見てみお勧めします。

認証を処理するためのさまざまな方法があるので、あなたは工夫がBASICAUTHをサポートしていますので、利用可能なものの理解を取得し、ベースの認証

+1

ありがとうございました。私はreadmeを複数回読んだ。私はレールキャストでのスクリーンキャストも見たことがあります。私は私が従うことができるフレームワークのいくつかの並べ替えが必要です。非常に多くのコンセプトがあり、一緒にまとめるのは難しいです。 –

関連する問題