是Rails Gem&#om; omniauth-google-oauth2'安全/ request.env如何工作?

时间:2017-04-29 19:11:06

标签: ruby-on-rails devise omniauth-google-oauth2

我已经实施了#omniauth-google-oauth2'使用https://github.com/zquestz/omniauth-google-oauth2上给出的示例模式在我的rails / devise app中创建gem。但是,我担心这种模式不安全。

我试图查看git hub上的源代码以及https://developers.google.com/identity/sign-in/web/devconsole-project上的官方google文档,但是我无法说服自己这种模式是安全的。

从Google文档中,流程应该如下所示:

Google OAuth Flow

我的安全问题在于对request.env的工作原理没有很好的理解。

问题1 :用户是否可以设置request.env值(例如,使用类似cURL的请求)?

问题2 :如果是这样,是什么阻止恶意用户点击应用的omniauth回调端点并设置request.env的值,以便他们可以冒充其他用户?例如,在github上显示的示例中,控制器中的回调端点是:

  

类Users :: OmniauthCallbacksController<设计:: OmniauthCallbacksController

     

def google_oauth2

 # You need to implement the method below in your model (e.g. app/models/user.rb)

 @user = User.from_omniauth(request.env["omniauth.auth"])

 if @user.persisted?

   flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Google"

   sign_in_and_redirect @user, :event => :authentication

 else

   session["devise.google_data"] = request.env["omniauth.auth"].except(:extra) #Removing extra as it can overflow some session stores

   redirect_to new_user_registration_url, alert: @user.errors.full_messages.join("\n")

 end
     

     

问题3 :我的rails应用服务器(我使用的是puma)似乎没有记录图中步骤5的请求(交换令牌代码)。我无法从用户的角度在Chrome中看到这一点,因为用户并未参与该通信。如何查看/记录/验证正在进行通话?

1 个答案:

答案 0 :(得分:2)

  

问题1:用户是否可以设置request.env值(例如,使用   类似cURL请求的内容)?

是。 request.env包含许多内容,例如传入的标头和参数。但是,用户无法将request.env['omniauth.auth']设置为填充服务器端请求提供给服务提供商的值。

使用envrequest.env传递值是从Rack中间件向下传递数据的一种非常标准的方法。它不是一个巨大的安全漏洞,因为用户输入仅限于参数和标题。

  

问题2:如果是这样,是什么阻止恶意用户点击   应用程序的omniauth回调端点并设置request.env的值   所以他们可以模仿另一个用户?

用户接受的唯一输入是访问令牌,id令牌和一次性代码。获取这些将需要蛮力攻击(在提供者身上)或中间人攻击。

  

问题3:我的rails app服务器(我使用的是puma)似乎不是   记录图中步骤5的请求(交换代码)   令牌)。我无法从用户的角度在Chrome中看到这一点,因为   用户不参与该通信。我怎么能够   看/日志/确认正在进行通话?

日志中没有任何内容,因为调用是从rails服务器发送到提供程序的。您可以使用httplog之类的东西进行调试,但实际上您应该拥有涵盖Omniauth策略这些方面的测试。