Ruby on rails Desive和iphone应用程序之间的HTTP身份验证

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身份验证?我读过关于令牌身份验证的内容,但不知道如何使用它

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

我正在使用Desive对web应用进行身份验证。我启用了基本的HTTP身份验证,可以卷曲到网站中查找xml或json数据。当我将帖子标题设置为JSON并使用用户名和密码时,我还可以将数据上传到网站

这就是我被困的地方

1) 如何让用户在第一次登录后继续登录?我是否每次向网站发送数据时都使用http身份验证?我读过关于令牌身份验证的内容,但不知道如何使用它

2) 我可以使用正确的用户名和密码将JSON数据发布到类似的位置。但是,如果用户名和密码不正确,它将返回HTML内容。我是否必须编写一些返回关于登录成功/fialure的json数据的东西

3) 在我的iphone应用程序和我的web应用程序之间进行通信。我在web应用程序端编写RESTful API是否正确?我需要使用活动资源吗


我真的被这一切如何运作的大局所困扰。谢谢

我建议您看看这里提供的文档

你可能还需要两个人来观看这个装置的屏幕


由于有许多不同的方法来处理身份验证,您应该更好地了解可用的方法,因为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    
}