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

Kei*_*ahn 24 api ruby-on-rails http-authentication titanium devise

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

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

这就是我被困的地方.

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

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

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

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

Dav*_*vid 22

有很多方法可以做到这一点.我做了什么让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
Run Code Online (Sandbox Code Playgroud)

否则,Devise只返回带有重定向响应代码的HTML,无论登录信息是正确还是不正确.

由于我的应用程序要求用户对我的rails后端进行身份验证,因此我实现了一个简单的登录系统,如下所示:

#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'
Run Code Online (Sandbox Code Playgroud)

然后在iphone应用程序中,您可以通过向/ login这样的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    
}
Run Code Online (Sandbox Code Playgroud)

然后,只要您需要将数据发布到应用程序,您就可以从用户默认值中检索用户名和密码,并将它们附加到请求中.如果您需要更安全,可以将它们存储在钥匙串中.

我确信有更好的方法可以做到这一点,但希望这可以让你考虑API身份验证策略.