devise 和 Rails 3 中的 http 身份验证
我有一个使用 devise on Rails 3 的应用程序。我想启用 http 身份验证,以便我可以从 iPhone 应用程序对我的 Web 应用程序进行身份验证。如何通过我的 iPhone 应用程序进行身份验证以进行设计?
这是安全的还是我应该以不同的方式进行身份验证?
I have an application which uses devise on rails 3. I would like to enable http authentication so that I can authenticate to my web app from an iPhone app. How can I authenticate from my iPhone app to devise?
Is this secure or should I be authenticating differently?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
从设计的角度来看,您有 3 个选项:
1) 使用基本的 http 身份验证:您的 iPhone 应用程序有一个秘密密钥(在您的 iPhone 应用程序代码中烘焙),用于对 Web 应用程序的每个请求进行身份验证。
Google 搜索:“设计基本的 http 身份验证”
2) 您可以通过在 iPhone 应用程序中拥有公共证书并在 Web 应用程序中拥有私有证书来使用 https。正确配置需要做很多工作,而且非常安全,因为您的 iPhone 应用程序和 Rails 服务器通过加密通道交换消息。由于身份验证是在传输级别完成的,因此安全性对于您的 Rails 代码也是透明的。
3) iPhone 应用程序使用 https 连接到 Web 应用程序,获取身份验证令牌,然后使用该令牌通过常规 http 调用 Web 应用程序。比 1 更安全,因为密钥可能会过期,需要实施大量工作并且非常可扩展。
(http://matteomelani.wordpress.com/2011/10 /17/authentication-for-mobile-devices/)
大多数应用程序都使用解决方案 1。
希望这会有所帮助。
编辑:要实现http身份验证(基本或摘要)我建议您查看:
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中。除非您使用共享密钥对其进行加密,否则不太安全。
您可以提供一个 https Web 服务,您的 iPhone 应用程序使用该服务来获取用户令牌。您的 iPhone 应用程序将在收到用户登录请求后立即发出请求。
抱歉,我无法通过一些真实的代码提供更多帮助。
From the design point of view you have got 3 options:
1) Use basic http authentication: your IPhone app has a secret key -which is baked in your IPhone app code - that uses to authenticate each request with the web app.
Google search: "Devise basic http authentication"
2) You can use https by having a public certificates in your IPhone app and a private certificates on your web app. This is a lot of work to configure right, it is very secure since your IPhone app and the Rails server are exchanging messages over an encrypted channel. The security is also transparent to your rails code since authentication is done at the transport level.
3) The IPhone app connects to the web app using https, get an authentication token that it then uses to make calls to the web app over regular http. More secure than 1 since the key can expire, quite a bit of work to implement and very scalable.
(http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/)
Most of apps use solution 1.
Hope this help.
EDIT: to implement http authentication (either basic or digest) I suggest you look at:
http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html
and
https://github.com/plataformatec/devise/wiki/How-To:-Use-HTTP-Basic-Authentication
The precise steps will depends on your Rails server stack.
EDIT 2: I do not think Devise provide a way to get the auth_token. I can see you can try several solutions:
when the user logs in the server retrieves the authentication_token and puts it in the cookie. Not very secure unless you encrypt it with a shared secret key.
you can provide a https web service that your IPhone app uses to get a user token. Your IPhone app would make the request right after receiving the user request to sign in.
Sorry I cannot be of more help with some real code.
这很大程度上取决于您如何在服务器端实现事物,但我们使用 Matteo 的第三个选项来实现这一点。我有一个使用 devise 的 Rails 3.1 实现。登录的路由是 /user/login.json 。首先使用如下代码构建用于登录的 JSON 正文:
生成此 JSON:
我使用如下代码发送 POST url 请求:
我得到的响应包含 JSON。我们将服务器端配置为返回 session_auth_token:
我们存储该 session_auth_token,然后将其与标头中的每个请求一起发送回来,如下所示:
该参数
[self sessionAuth]
包含 session_auth_token。如果您需要澄清,请告诉我。
This largely depends on how you are implementing things on the server side, but we implemented this using Matteo's 3rd option. I have a rails 3.1 implementation using devise. The route to the login is /users/login.json . First build up the JSON body for login with code like this:
which yields this JSON:
I send a POST url request with code like this:
The response I get back contains JSON. We configured the server side to return the a session_auth_token:
We store that session_auth_token and then send it back with every request in a header, something like this:
That parameter
[self sessionAuth]
contains the session_auth_token.Let me know if you need clarification.