Rails – 避免OmniAuth和共享计算机风险的策略

在测试Omniauth并关注流行的Ryan Bates的video时,我认为存在一个重大的安全漏洞。 这是一个例子

我有两个用户:Aurelien和John

约翰在早上登录到Twitter但忘记退出。 然后他继续我的应用程序并通过http://myapplication.com/auth/twitter连接到Twitter服务。 他被自动分配到Twitter身份validation,因为Twitter记得约翰已登录。约翰去上class。

与此同时,他的兄弟Aurelien使用相同的计算机并使用我的应用程序。 他决定发布我的应用程序的推文并继续访问http://myapplication.com/auth/twitter ,通过OmniAuth登录他的Twitter帐户。 多么惊喜! 他不需要登录,但是当重定向到回调URL时,他发现他当前以John身份登录!

现在我想相信大多数用户不共享他们的电脑/桌面/电话,但我确信这是一个经常出现的问题。

您可以遵循什么策略或逻辑来防止这种情况发生?

例如,如何确保当需要与myapplication不同的用户登录Twitter而不是使用之前打开的Twitter会话时?

欢迎举例!

幸运的是,有一个名为force_login的Twitter OAuth选项可以涵盖这种风险。 有两种方法可以使用它:

  1. 将此选项添加到OmniAuth配置:

     Rails.application.config.middleware.use OmniAuth::Builder do provider :twitter, ENV["TWITTER_KEY"], ENV["TWITTER_SECRET"], { :authorize_params => { :force_login => 'true' } } end 

    每当有人通过http://myapp.com/auth/twitter连接到Twitter服务时,他就会自动退出Twitter。

  2. 或者您可以根据具体情况将此选项添加到URL。 例如:

    • http://myapp.com/auth/twitter将正常运行。

    • http://myapp.com/auth/twitter?force_login=true将强制用户退出Twitter。

顺便说一句,这都是omn​​iauth-twitter gem的自述文件 。

最后一点说明:此选项仅适用于omniauth-twitter。 其他OmniAuth提供商可能有类似的选项,但其他人可能根本没有。 例如,Facebook有一个auth_type选项,当设置为reauthenticate会要求用户在尝试登录时输入密码。但是,这不会从Facebook注销用户。 有时候这就是你想要的,有时却不是。 从其他服务注销用户可能非常麻烦。 我真的很喜欢,如果所有提供商都有这两个选项,那么我们可以选择使用哪一个(从外部服务注销用户或只是再次询问密码)但我想我们必须满足于我们的有。 例如,据我所知,谷歌没有保护这种风险。