如果我只是将provider
和uid
存储在Cookie中,它是否足够安全?或者我应该加密其中一个或两个?我应该使用安全令牌来增加provider
和uid
吗?
我是否还应考虑其他因素?
答案 0 :(得分:0)
您可以使用signed cookie。这些是加密签名的,因此无法在不使其无效的情况下更改其数据。这种cookie通常用于存储Rails会话ID /内容。
请注意,这些Cookie仍然可以被解码(它只是base64),但它不应该是一个问题provider
和uid
不要需要保守秘密。
如果您不希望Cookie的内容可读,则可以使用encrypted cookie。
中详细了解Rails提出的不同类型的Cookie答案 1 :(得分:0)
如果您在Cookie中存储了omniauth中的provider
和uid
值,则表示您可以在访问时将用户登录到您的网站。这样做的问题在于它作为身份验证的一种手段并不可靠。您想要实际验证您网站的用户吗?然后,您需要的不仅仅是允许您从数据库中检索唯一用户ID的数据,如您所知。您需要某种保证,即您与会话关联的用户ID代表您认为的用户。
"记住我"基本上依赖于用户代理(例如,浏览器)仅由您最初验证的用户 使用的假设。您或您的用户可以确定吗? (这就是为什么网站要求您选择加入"记住我" - 当您选中该框时,您承诺没有授权访问您的用户帐户的人可以访问对你的用户代理人来说。)不难看出这实际上是不安全的。您可以对您的Cookie进行签名或加密,但除非您知道用户代理只有您经过身份验证的用户才能访问,否则您不会知道下次访问您网站的用户有权访问原始用户& #39;帐户。
如果您正在使用omniauth
,那么您基本上依赖某些第三方为您验证您的用户,或者作为OpenID Connect定义的依赖方规范,或在OAuth 1或2之上使用某种非标准身份验证方案。您实际要问的是"我是否可以通过第三方安全地对用户进行身份验证然后安全地假设,只要同一个用户代理访问我的网站,它就是同一个用户?"
答案是否。
但诚然,安全和可用性之间存在权衡,有些人可能认为风险(如果用户的帐户不敏感)被可用性优势所抵消。但是,如果您依赖第三方提供商对用户进行身份验证,那么可用性差异几乎就是零。如果用户已经在谷歌,脸书或其他任何提供商上授权您的应用程序,并且如果他们与该提供商有当前会话,那么当他们点击"使用[提供商]"您网站上的链接可以登录,无需用户进行其他互动。没有密码或用户名记住和输入,没有。所以可能发生的最糟糕的事情是他们必须登录谷歌,脸谱或其他什么,如果他们还没有。
更重要的是,如果您这样做,您可以更多保证用户就是他们所说的人。每当您的用户签到"使用OpenID提供程序,您将获得一个id标记,该标记表明它们是谁,它们是由提供程序进行身份验证,何时发生身份验证事件等等。因此,您不仅仅是假设他们是特定提供商uid的用户,您信任提供商的断言他们是。当然,即使这不是完全安全的,因为用户的提供者帐户可能受到损害,或者理论上提供者可能是不值得信任的。但它仍然是一个改进,记住我。"
TL; DR"记住我"本质上不安全,并且与每次访问时通过OpenID提供商登录无关,并没有提供有意义的可用性改进。不要这样做。