Authentication 在使用OpenID、OAuth和/或OAuth 2.0进行身份验证时,评估每个请求的登录状态

Authentication 在使用OpenID、OAuth和/或OAuth 2.0进行身份验证时,评估每个请求的登录状态,authentication,oauth,openid,oauth-2.0,Authentication,Oauth,Openid,Oauth 2.0,我正在为我的网站建立一个扩展的登录/注册区域,其中包括OpenID、OAuth(Twitter)和OAuth 2.0(Facebook)登录选项 一旦用户成功通过身份验证,并且我已将其访问令牌存储在我的数据库中,并编写了一个将用户链接到其登录状态的cookie,我应该使用什么最佳实践来确定用户的访问令牌仍然有效?似乎对我的站点的每一个请求都必须调用身份验证提供商会减慢用户的速度,我无法想象其他站点会这样做 我的猜测是,我应该存储一个仅对当前浏览器会话有效的cookie,因此,当用户关闭浏览器时,

我正在为我的网站建立一个扩展的登录/注册区域,其中包括OpenID、OAuth(Twitter)和OAuth 2.0(Facebook)登录选项

一旦用户成功通过身份验证,并且我已将其访问令牌存储在我的数据库中,并编写了一个将用户链接到其登录状态的cookie,我应该使用什么最佳实践来确定用户的访问令牌仍然有效?似乎对我的站点的每一个请求都必须调用身份验证提供商会减慢用户的速度,我无法想象其他站点会这样做

我的猜测是,我应该存储一个仅对当前浏览器会话有效的cookie,因此,当用户关闭浏览器时,cookie将过期,从而强制在下一个请求时生成新的访问令牌(以及要匹配的新cookie)。如果用户明确注销,我也会提前终止cookie

当然,我唯一的问题是,例如,如果用户在一个选项卡中打开了我的站点,然后他们在另一个选项卡中打开他们的身份验证提供商并注销该站点,但继续浏览我的站点,他们将不会从我的站点注销,即使从技术上讲,他们应该能够使用第三方提供商注销


这是一个“这真的不重要”的场景,还是我用了错误的方法来处理整件事?

如果您只是为了登录而使用OAuth/OpenId,我认为您不必担心任何问题。 您应该担心的是,您的用户是否就是他们所说的(OAuth/OpenId提供者)用户

如果你的网站打算与Twitter和Facebook进行互动,那是另一回事,但这基本上解决了问题。当您尝试与FB交互时,当您的用户已从那里注销时,FB将提示您的用户再次登录


总之,我认为这真的不是问题。

显然,服务提供商不希望您对您服务中的每个请求都ping他们的服务。即使是谷歌一想到这一点也会犹豫。您可以设置某种超时,每5分钟检查一次,但我认为您的会话cookie是最理想的。但是是的,这取决于你想要达到的目标

如果您只是使用这些服务让用户登录,仅此而已,那么在验证用户已登录并设置自己的会话或持久cookie后,请立即丢弃您拥有的访问令牌。您不再需要他们的访问令牌


如果您确实希望访问这些服务上的用户数据,那么当然要保留访问令牌。但是您可能仍然应该保留您自己关于用户是否登录的概念。如果我没记错的话,这些访问令牌通常是长期存在的(无论如何在OAuth 1.0a中),当用户返回时,它们不会帮助您确定用户是否是他们所说的那个人,除非您有自己的cookie或者您再次通过登录服务发送它们

在过去的几天里,我自己决定使用这种方法(扔掉访问令牌),但很高兴听到有人证实这是一种合法的做法。谢谢你的回答。