Ruby on rails Desive和iphone应用程序之间的HTTP身份验证
我是RubyonRails新手,但我想将SQlite数据库中的数据从iphone应用程序发送到rails web应用程序。就像一个“同步”服务 我正在使用Desive对web应用进行身份验证。我启用了基本的HTTP身份验证,可以卷曲到网站中查找xml或json数据。当我将帖子标题设置为JSON并使用用户名和密码时,我还可以将数据上传到网站 这就是我被困的地方 1) 如何让用户在第一次登录后继续登录?我是否每次向网站发送数据时都使用http身份验证?我读过关于令牌身份验证的内容,但不知道如何使用它 2) 我可以使用正确的用户名和密码将JSON数据发布到类似的位置。但是,如果用户名和密码不正确,它将返回HTML内容。我是否必须编写一些返回关于登录成功/fialure的json数据的东西 3) 在我的iphone应用程序和我的web应用程序之间进行通信。我在web应用程序端编写RESTful API是否正确?我需要使用活动资源吗Ruby on rails Desive和iphone应用程序之间的HTTP身份验证,ruby-on-rails,api,devise,titanium,http-authentication,Ruby On Rails,Api,Devise,Titanium,Http Authentication,我是RubyonRails新手,但我想将SQlite数据库中的数据从iphone应用程序发送到rails web应用程序。就像一个“同步”服务 我正在使用Desive对web应用进行身份验证。我启用了基本的HTTP身份验证,可以卷曲到网站中查找xml或json数据。当我将帖子标题设置为JSON并使用用户名和密码时,我还可以将数据上传到网站 这就是我被困的地方 1) 如何让用户在第一次登录后继续登录?我是否每次向网站发送数据时都使用http身份验证?我读过关于令牌身份验证的内容,但不知道如何使用它
我真的被这一切如何运作的大局所困扰。谢谢 我建议您看看这里提供的文档 你可能还需要两个人来观看这个装置的屏幕
由于有许多不同的方法来处理身份验证,您应该更好地了解可用的方法,因为Desive支持basicAuth和基于令牌的身份验证有许多方法可以做到这一点。为了让Desive将错误返回到我可以解释的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
然后在iphone应用程序中,您可以通过向发送GET请求/登录进行验证,如下所示(我使用GET请求是因为它很棒):
然后,无论何时需要向应用程序发布数据,都可以从用户默认值中检索用户名和密码,并将其附加到请求中。如果您需要更安全,可以将它们存储在钥匙链中
我相信有更好的方法可以做到这一点,但希望这能让您考虑API身份验证策略。谢谢Aaron。我已经把自述读了好几遍了。我也看过railscast上的视频。我只需要一些我可以遵循的框架。有太多的概念,我觉得很难把它们放在一起。嘿,约翰尼,我启用了基本的http身份验证,我尝试实现它,每次我尝试访问时,我都会得到一个“{”错误:“你需要登录或注册才能继续。”}“你的想法是什么?
#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'
- (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
}