繁体   English   中英

没有设计的OmniAuth:如何安全地实现“记住我”?

[英]OmniAuth without Devise: How can I securely implement Remember Me?

如果我仅将provideruid存储在cookie中,是否足够安全? 还是我应该加密其中之一? 我应该使用安全令牌扩充provideruid吗?

还有其他我应该考虑的因素吗?

您可以使用签名的cookie 这些都是经过加密签名的,因此无法在不使数据无效的情况下更改其数据。 这种cookie通常用于存储Rails会话ID /内容。

请记住,这些cookie仍可以被解码(只是base64),但这不应该成为问题,因为provideruid不需要保密。

如果您不希望cookie的内容可读,则可以使用加密的cookie

您可以在ActionDispatch :: Cookies文档中阅读有关Rails建议的不同类型的Cookie的更多信息。

您说如果用户将您从omniauth获得的provideruid值存储在cookie中,则可以在用户访问网站时对其进行登录。 这样做的问题是,它作为身份验证手段并不可靠。 您是否要实际验证您网站的用户? 这样,您将需要的不仅仅是数据,这将使您能够从数据库中检索唯一的用户ID。 您需要某种方式保证与会话关联的用户ID代表您认为的用户。

“记住我”实质​​上是基于这样的假设,即用户代理(例如浏览器) 由您最初进行身份验证的用户使用。 您或您的用户可以确定吗? (这就是为什么网站要求您选择“记住我”的原因-当您选中此框时,您承诺没有授权访问您的用户帐户的任何人都不能访问您的用户代理。)很难看出这在本质上是不安全的。 您可以对Cookie进行签名或加密,但是除非您知道只有经过身份验证的用户才能访问用户代理,否则您不知道下次访问您网站的用户有权访问原始用户的帐户。

如果您使用的是omniauth ,那么您实质上是依靠某个第三方来验证您的用户身份,或者作为OpenID Connect规范中定义的依赖方,或者在顶部使用某种非标准的身份验证方案OAuth 1或2。实际上,您要问的是:“我能否通过一次第三方安全地对用户进行身份验证,然后安全地假设任何时候同一用户代理访问我的网站,就是同一用户?”

答案是否定的

但不可否认,在安全性和可用性之间需要权衡取舍,有些人可能会认为可用性带来的好处超过了风险(如果用户的帐户不是那么敏感)。 但是,如果您依靠第三方提供程序来验证用户身份,则可用性差异几乎为零 如果用户已经在google,facebook或任何其他提供者上授权了您的应用程序,并且与该提供者进行了当前会话,则当他们单击您网站上的“使用[提供者登录]”链接时,他们可以登录,无需用户进行任何其他交互。 无需记住和输入密码或用户名,什么都没有。 因此,可能发生的最糟糕的情况是他们必须登录google,facebook或其他(如果尚未登录)。

更重要的是,如果你这样做,你会得到更多的保证用户是谁,他们说他们是。 每次您的用户使用OpenID提供程序“登录”时,您都会获得一个ID令牌,该令牌表明他们是谁,提供程序对他们进行了身份验证,何时发生了身份验证事件等。因此,您不仅在假设他们是具有特定提供者uid的用户,则您信任提供者的身份。 当然,即使这也不是完全安全的,因为用户的提供者帐户可能会受到损害,或者从理论上讲,提供者可能是不可信的。 但这仍然比“记住我”要好。

TL; DR“记住​​我”本质上是不安全的,并且与每次访问时都要求通过OpenID提供程序登录相比,没有提供有意义的可用性改进。 不要这样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM