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

时间:2013-11-15 08:05:56

标签: ruby-on-rails authentication twitter ruby-on-rails-3.2 omniauth

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

我有两个用户: Aurelien和John

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

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

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

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

例如,如果需要使用myapplication的其他用户登录Twitter而不是使用之前打开的Twitter会话,怎么能确保?

欢迎举例!

1 个答案:

答案 0 :(得分:1)

幸运的是,有一个名为force_login的{​​{3}}可以承担这种风险。有两种方法可以使用它:

  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。

  3. 顺便说一句,这都在Twitter OAuth option

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