0

因此,在我的 Rails 应用程序中使用 Omniauth 设置 OAuth 时,我遇到了以下意外行为。

当用户之前已通过 OAuth 提供者(例如 Facebook)进行身份验证时,凭据将存储在浏览器中的某个位置。如果其他用户尝试在同一个浏览器中发出 OAuth 请求,它将使用第一个用户的存储数据!

有没有办法强制 OAuth 请求不使用存储的凭据并让用户每次都授权应用程序?

我尝试no-cache使用下面的代码将标头添加到控制器,但它当然没有做任何事情,因为请求是针对提供者 OAuth 端点而不是我的应用程序内部的任何地方。

  before_filter :set_cache_buster

  def set_cache_buster
    p "CACHE BBBBUSTED!"
    response.headers["Cache-Control"] = "no-cache, no-store, max-age=0,must-revalidate"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
    request.headers["Cache-Control"] = "no-cache, no-store, max-age=0,must-revalidate"
    request.headers["Pragma"] = "no-cache"
    request.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
  end

有任何想法吗?

4

2 回答 2

1

如果我猜对了,您可以通过 Omniauth 使用 Facebook 凭据登录。在您离开您的应用程序后,用户仍然通过Facebook进行身份验证(不是您的应用程序,不是 OAuth,因此转储您的 cookie 无济于事)。因此,下次当您尝试登录您的应用程序时(点击“使用 facebook 登录”链接/按钮),Facebook 不会询问任何内容(用户已获得 facebook 授权,应用程序权限也已到位)并简单地返回凭据,以便您的应用程序继续前进并让您以前的用户进入。

我想,您需要的是每次从应用程序注销时从 Facebook 注销。例如,检查这个 railscast 的一种处理方法:http ://railscasts.com/episodes/360-facebook-authentication?view=asciicast 。但是您必须分别与每个提供者(推特,...)打交道。或者您可以尝试在您的浏览器中查找和清除 facebook 的持久 cookie(afaik,facebook 使用持久 cookie 来实现“记住我”,但我不是专家,我从来不需要研究它)。

我唯一的其他评论是,在生产中,这种行为是可取的——只要它是同一个操作系统用户并且该用户在 twitter/facebook 等中保持身份验证,你的应用程序也假定它是同一个用户。如果您需要更改用户 - 在您的操作系统中注销/登录,或者您授予下一个人访问此应用程序、facebook 和所有其他设置了“记住我”但您尚未注销的网络服务的权限。对于自动测试,您根本不应该有这个问题,因为 cookie - 会话和持久性 - 不会在测试之间持续存在。

不过,我可以看到这对于手动测试来说是个问题。但是手动是手动的 - 只需手动从 facebook 注销就可以了。

这一切只是我根据你的描述的猜测。因此,不能保证,但希望至少在某种程度上有所帮助。

于 2013-02-27T21:50:47.483 回答
0

使用 facebook,您可以通过设置auth_typereauthenticate.

于 2014-02-06T04:25:37.613 回答