Rails 3 - 基本的http身份验证 vs iPhone身份验证令牌

4
起初,我使用基本的http身份验证来验证用户,并遵循这个指南使用devise:http://jessehowarth.com/2011/04/27/ajax-login-with-devise。我成功地验证了一个用户,但是会话一直保持登录状态,没有办法销毁用户的会话。实际上,在我的create方法中添加了devise的user_signed_in?方法后,即使通过json退出登录,它也总是返回true。因此,我得出结论:使用基本的http身份验证无法结束会话。你只能检查用户是否已经登录并将状态代码作为json发送回客户端。
然后,我尝试了身份验证令牌路由,它允许你使用身份验证令牌创建会话,然后通过删除该身份验证令牌来销毁会话,并且用户必须重新登录才能访问需要身份验证的页面,如下所示:Devise and Authentication with CURL !。不足之处在于,您必须为每个需要身份验证的页面输入这个非常长的字符串,这似乎有点不理想。我希望有一种最佳的解决方案,就像在Web浏览器中一样可以登录和注销。
我不确定我所说的一切是否准确,但它似乎符合这篇文章的要求:http authentication in devise and rails 3。在那篇文章中,他说身份验证令牌比基本的http身份验证更安全,因为密钥可以过期。我认为他的意思是,一旦使用基本的身份验证登录,那就是全部,你永远都是登录状态,而身份验证令牌可以过期并强制用户重新登录。这个解释准确吗?
谢谢您的回复!

我注意到你将HTTP方法设置为POST,并设置了X-HTTP-Method-Override标头,而不是将HTTP方法设置为DELETE。你尝试过使用以下命令吗?curl -H 'Content-Type: application/json' \ -H 'Accept: application/json' -X DELETE \ http://localhost:3000/users/sign_out \ -d '{"remote": "true", "commit": "Sign Out", "utf8": "✓", "user": {"remember_me": "1", "password": "password", "email": "email@email.com"}}' \ -c cookie - Nils Landt
我重新格式化了问题,现在它只是一个是或否的问题。尽管如此仍然没有回应。 - JohnMerlino
1个回答

0

HTTP身份验证的工作方式是,一旦浏览器登录(即发送WWW-Authenticate头),它将保持登录状态,直到其HTTP身份验证缓存过期(通常在退出浏览器时)。

由于浏览器在HTTP身份验证中继续发送有效凭据(没有“HTTP注销”),这就是为什么您看到用户仍然登录的原因。

我的建议是使用Devise中的authentication_token功能,并将?auth_token传递给您的API。请记住,即使是POST / DELETE / PUT等,也必须将它们作为URL的一部分传递(这是可能已经修复的Devise错误)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接