设计和rails 3中的http身份validation

我有一个在rails 3上使用devise的应用程序。我想启用http身份validation,以便我可以通过iPhone应用程序对我的Web应用程序进行身份validation。 如何从我的iPhone应用程序进行身份validation?

这是安全的还是我应该以不同方式进行身份validation?

从设计的角度来看,您有3个选择:

1)使用基本的http身份validation:您的iPhone应用程序有一个密钥 – 它在您的iPhone应用程序代码中出现 – 用于通过Web应用程序validation每个请求。 谷歌搜索:“设计基本的http身份validation”

2)您可以通过在iPhone应用程序中使用公共证书和在Web应用程序上使用私有证书来使用https。 这是配置正确的大量工作,因为您的IPhone应用程序和Rails服务器通过加密通道交换消息,所以它非常安全。 由于身份validation是在传输级别完成的,因此安全性对您的rails代码也是透明的。

3)iPhone应用程序使用https连接到Web应用程序,获取一个身份validation令牌,然后通过常规http调用Web应用程序。 由于密钥可以过期,因此比1更安全,实现相当多的工作并且非常可扩展。 ( http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/

大多数应用使用解决方案1。

希望这有帮助。

编辑:实现http身份validation(基本或摘要)我建议你看看:

http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html和https://github.com/plataformatec/devise/wiki/How-To:-Use-HTTP-Basic-Authentication

具体步骤取决于您的Rails服务器堆栈。

编辑2:我不认为Devise提供了获取auth_token的方法。 我可以看到你可以尝试几种解决方案:

  • 当用户登录服务器时,检索authentication_token并将其放入cookie中。 除非您使用共享密钥对其进行加密,否则不太安全。

  • 您可以提供您的iPhone应用程序用于获取用户令牌的https Web服务。 您的iPhone应用程序将在收到用户登录请求后立即发出请求。

对不起,我对一些真正的代码无法提供更多帮助。

这在很大程度上取决于您在服务器端如何实现,但我们使用Matteo的第三个选项实现了这一点。 我有一个使用设计的rails 3.1实现。 登录的路由是/users/login.json。 首先使用以下代码构建JSON主体以进行登录:

NSMutableDictionary *loginDictionary = [NSMutableDictionary dictionary]; NSMutableDictionary *usernamePasswordDictionary = [NSMutableDictionary dictionary]; [usernamePasswordDictionary setObject:username forKey:@"email"]; [usernamePasswordDictionary setObject:password forKey:@"password"]; [loginDictionary setObject:usernamePasswordDictionary forKey:@"user"]; NSData *data = [NSJSONSerialization dataWithJSONObject:loginDictionary options:0 error:&error]; 

产生这个JSON:

 {"user":{"password":"blahblahblah","email":"admin@*****.com"}} 

我发送一个POST url请求,代码如下:

 NSString *postUrlString = [NSString stringWithFormat:@"%@users/login.json", kServerAPIBaseURL]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:postUrlString] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:kTimeoutInterval]; [request setHTTPMethod:@"POST"]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-type"]; [request setHTTPBody:data]; 

我得到的回复包含JSON。 我们配置服务器端以返回session_auth_token:

 { admin = 1; "created_at" = "2012-01-25T00:15:58Z"; "current_sign_in_at" = "2012-04-04T04:29:15Z"; "current_sign_in_ip" = "75.163.148.101"; email = "admin@******.com"; "encrypted_password" = "*****"; "failed_attempts" = 0; id = 1; "last_sign_in_at" = "2012-04-03T03:37:18Z"; "last_sign_in_ip" = "75.163.148.101"; "locked_at" = ""; name = "Joe Smith"; "remember_created_at" = "2012-03-29T20:35:43Z"; "reset_password_sent_at" = ""; "reset_password_token" = ""; "session_auth_token" = "3FRgX6CYlzQJGC8tRWwqEjFaMMFKarQAYKTy3u84M0U="; "sign_in_count" = 145; status = 1; "unlock_token" = ""; "updated_at" = "2012-04-04T04:29:15Z"; } 

我们存储了session_auth_token,然后将其与标头中的每个请求一起发回,如下所示:

 NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self postUrlString]]... [postRequest setHTTPMethod:@"POST"]; [postRequest setValue:@"application/json" forHTTPHeaderField:@"Content-type"]; [postRequest setValue:[self sessionAuth] forHTTPHeaderField:@"X-CSRF-Token"]; [postRequest setHTTPBody:data]; 

该参数[self sessionAuth]包含session_auth_token。

如果您需要澄清,请告诉我。