设计和iPhone应用程序之间的HTTP身份validation

我是ruby on rails的新手,但我想将我的SQlite数据库中的数据从我的iphone应用程序发送到rails web应用程序。 就像“同步”服务一样。

我正在使用设计进行Web应用程序的身份validation。 我启用了基本的HTTP身份validation,我可以卷入xml或json数据的网站。 当我将post标题设置为JSON并使用用户名和密码时,我也可以将数据上传到网站。

这就是我被困住的地方。

1)如何在第一次登录后让用户登录? 每次向网站发送数据时都使用http身份validation吗? 我已阅读有关令牌身份validation但我不确定如何使用它。

2)我可以使用正确的用户名和密码将JSON数据发布到http:// localhost:3000 / example之类的内容。 但是,如果用户名和passowrd不正确,它将返回HTML内容。 我是否必须写一些返回有关登录成功/ fialure的json数据的内容?

3)在我的iPhone应用程序和我的网络应用程序之间进行通信。 我是否正确在Web应用程序端编写RESTful API? 我需要使用有效资源吗?

我真的很难全面了解这一切是如何运作的。 谢谢!

有很多方法可以做到这一点。 我做了什么让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后端进行身份validation,因此我实现了一个简单的登录系统,如下所示:

 #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应用程序中,您可以通过向/ login发送GET请求来validation(我使用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身份validation策略。

我建议您查看此处提供的文档

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

您可能还需要两个观看设备上的截屏video。

由于有许多不同的方法来处理身份validation,因此您应该更好地了解可用的内容,因为设计支持basicAuth和基于令牌的身份validation