2013-02-27 64 views
0

因此,在我的Rails应用程序中使用Omniauth设置OAuth时,我遇到了以下意外行为。强制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 

任何想法?

+0

我有同样的问题,但与google_oauth2。实际上,我希望让用户决定是否要重置自动登录。你是如何解决这个问题的? – 2013-04-11 21:24:59

+0

@FernandoFabreti这些是我似乎工作的google_oauth2 Omniauth设置:''::scope =>“userinfo.email,userinfo.profile,plus.me”, :approval_prompt =>“force”, :access_type =>“离线“''' – thoughtpunch 2013-04-12 16:20:27

回答

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实现“记住我”,但我不是专家,我从来没有必要去研究它)。

我唯一的其他的评论是,生产这种行为是可取 - 只要是相同的操作系统用户和用户保持在叽叽喳喳/ Facebook的等你的应用程序还假定它是相同的用户身份验证。如果您需要在操作系统中更改用户 - 注销/登录,或者您可以访问下一个应用,脸书以及设置了“记住我”的其他Web服务,并且您尚未注销。对于自动测试,根本不应该有这个问题,因为cookie(会话和持久性)不会在测试之间持续存在。

虽然,我可以看到这可能是一个手动测试的问题。但手动是手动 - 只需手动从Facebook登出,你应该没问题。

这一切只是我的猜测根据您的描述。所以,没有保证,但希望有所帮助,至少在某些方面。