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选项可以涵盖这种风险。 有两种方法可以使用它:
-
将此选项添加到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。
-
顺便说一句,这都是omniauth-twitter gem的自述文件 。
最后一点说明:此选项仅适用于omniauth-twitter。 其他OmniAuth提供商可能有类似的选项,但其他人可能根本没有。 例如,Facebook有一个auth_type
选项,当设置为reauthenticate
会要求用户在尝试登录时输入密码。但是,这不会从Facebook注销用户。 有时候这就是你想要的,有时却不是。 从其他服务注销用户可能非常麻烦。 我真的很喜欢,如果所有提供商都有这两个选项,那么我们可以选择使用哪一个(从外部服务注销用户或只是再次询问密码)但我想我们必须满足于我们的有。 例如,据我所知,谷歌没有保护这种风险。
- 使用Koala(Ruby)收集用户的新闻源
- WEBrick:RequestURITooLarge:我应该更新或使用其他服务器吗?
- OmniAuth before_filter要求登录
- 路由错误未初始化的常量用户
- 为什么twitter oauth访问令牌无效/过期(rails 3)
- 设计:新用户注册问题,PG :: ProtocolViolation。 Rails4,Postgres
- Devise中的ArgumentError :: RegistrationsController#新错误的参数个数(2个为0..1)
- 将设计和omniauth处理为失败的Google oauth2
- 使用google_oauth2获取“错误:redirect_uri_mismatch”