在测试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会话,怎么能确保?
欢迎举例!
答案 0 :(得分:1)
幸运的是,有一个名为force_login
的{{3}}可以承担这种风险。有两种方法可以使用它:
将此选项添加到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。
或者您可以根据具体情况将此选项添加到URL。例如:
http://myapp.com/auth/twitter
的行为正常。
http://myapp.com/auth/twitter?force_login=true
将强制用户退出Twitter。
顺便说一句,这都在Twitter OAuth option。
最后一点说明:此选项仅适用于omniauth-twitter。其他OmniAuth提供商可能有类似的选项,但其他人可能根本没有。例如,Facebook有auth_type
选项,当设置为reauthenticate
时,会要求用户在尝试登录时输入密码。但是,这不会从Facebook注销用户。有时候这就是你想要的,有时却不是。从其他服务注销用户可能非常麻烦。我真的很喜欢,如果所有提供商都有这两个选项,那么我们可以选择使用哪一个(从外部服务注销用户或只是再次询问密码)但我想我们必须满足于我们的有。例如,据我所知,谷歌没有保护这种风险。