强制Omniauth / OAuth忽略浏览器缓存并重新进行身份验证?

时间:2013-02-27 17:48:39

标签: ruby-on-rails oauth omniauth

因此,在我的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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

我想,您需要的是每次从应用程序注销时都从Facebook注销。例如,检查此railscast以一种方式来处理:http://railscasts.com/episodes/360-facebook-authentication?view=asciicast。但是你必须单独处理每个提供商(twitter,...)。或者你可以尝试寻找&清除facebook的持久性cookie(afaik,facebook使用持久性cookie实现“记住我”,但我不是专家,我从不需要研究它)。

我唯一的另一个评论是,在生产中这样的行为是可取的 - 只要它是相同的操作系统用户,并且该用户仍在twitter / facebook等中进行身份验证,您的应用程序也会认为它是同一个用户。如果您需要更改用户 - 在您的操作系统中注销/登录,或者您可以访问此应用程序的下一个人,Facebook以及设置了“记住我”并且您尚未注销的所有其他Web服务。对于自动测试,您根本不应该遇到此问题,因为Cookie(会话和持久性)不会在测试之间持续存在。

我可以看到这对于手动测试来说可能是一个问题。但手动是手动的 - 只需从Facebook手动注销即可,你应该没问题。

根据您的描述,这只是我的猜测。所以,没有保证,但希望至少在某种程度上有所帮助。

答案 1 :(得分:0)

使用Facebook,您可以configure omniauth-facebook通过将auth_type设置为reauthenticate来强制重新认证。