2

我已经使用https://github.com/zquestz/omniauth-google-oauth2上给出的示例模式在我的 rails/devise 应用程序中实现了“omniauth-google-oauth2”gem 。但是,我担心这种模式不安全。

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

从谷歌文档,流程应该是这样的:

谷歌 OAuth 流程

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

问题 1:用户可以设置 request.env 值(例如,使用 cURL 请求之类的东西)吗?

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

类用户::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 中无法从用户的角度看到这一点,因为用户没有参与该通信。我怎样才能看到/记录/验证呼叫正在发生?

4

1 回答 1

3

问题 1:用户可以设置 request.env 值(例如,使用 cURL 请求之类的东西)吗?

是的。request.env包含一堆东西,比如传入的标头和参数。但是用户不能将request.env['omniauth.auth']其设置为填充了服务器端请求提供者获取的值。

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

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

用户接受的唯一输入是访问令牌、id 令牌和一个时间码。获得这些将需要暴力攻击(对提供者)或中间人攻击。

问题 3:我的 rails 应用服务器(我正在使用 puma)似乎没有记录图中第 5 步的请求(交换代码以获取令牌)。我在 Chrome 中无法从用户的角度看到这一点,因为用户没有参与该通信。我怎样才能看到/记录/验证呼叫正在发生?

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

于 2017-04-29T21:18:14.460 回答