我已经实施了#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文档中,流程应该如下所示:
我的安全问题在于对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中看到这一点,因为用户并未参与该通信。如何查看/记录/验证正在进行通话?
答案 0 :(得分:2)
问题1:用户是否可以设置request.env值(例如,使用 类似cURL请求的内容)?
是。 request.env
包含许多内容,例如传入的标头和参数。但是,用户无法将request.env['omniauth.auth']
设置为填充服务器端请求提供给服务提供商的值。
使用env
和request.env
传递值是从Rack中间件向下传递数据的一种非常标准的方法。它不是一个巨大的安全漏洞,因为用户输入仅限于参数和标题。
问题2:如果是这样,是什么阻止恶意用户点击 应用程序的omniauth回调端点并设置request.env的值 所以他们可以模仿另一个用户?
用户接受的唯一输入是访问令牌,id令牌和一次性代码。获取这些将需要蛮力攻击(在提供者身上)或中间人攻击。
问题3:我的rails app服务器(我使用的是puma)似乎不是 记录图中步骤5的请求(交换代码) 令牌)。我无法从用户的角度在Chrome中看到这一点,因为 用户不参与该通信。我怎么能够 看/日志/确认正在进行通话?
日志中没有任何内容,因为调用是从rails服务器发送到提供程序的。您可以使用httplog之类的东西进行调试,但实际上您应该拥有涵盖Omniauth策略这些方面的测试。