JSON参数在请求哈希中不可用(Rails,omniauth-google-oauth2 gem)

时间:2015-06-04 16:00:49

标签: ruby-on-rails json omniauth rack

概述

我想使用Omniauth Google OAuth2 Gem(0.2.6)实现Google OAuth2服务器端(混合)。但是,我发送到我的应用程序的代码参数不会添加到request.params哈希。因此,OmniAuth会抛出错误,因为它无法找到代码。

详细

从Google检索身份验证代码后,我将其发送到服务器(通过AJAX):

// Send the code to the server
    $.ajax({
      type: 'POST',
      url: '/auth/google_oauth2/callback',
      contentType: 'application/json',
      success: function(result) {
        // Handle or verify the server response.
      },
      processData: false,
      data: JSON.stringify(password_result)
    });

这会引发错误:

"error" : "invalid_request",
"error_description" : "Missing required parameter: code"

经过筹码后,我想出了以下内容:

  1. 只要我有' application / json'设置为内容类型,Rack正确解析params并且env对象包含已解析的参数:

    "action_dispatch.request.request_parameters"=>{"code"=>"<sent_in_code>"}
    
  2. 但是,request.params哈希值仍为空。由于OmniAuth检查request.params['code'],因此这是错误的来源。

  3. request.POST为空,从查看Rack的源代码是空request.params hash的根本原因。

  4. data:"code="+authResult['code']标准格式发送代码时,该参数在request.params哈希中可用。 (然后我得到一个奇怪的未定义路由错误,但这是一个不同的问题。)

  5. 问题

    现在,即使我可以通过不使用JSON来避免这个问题,我仍然可以回答以下问题:

    1. 为什么code.参数在request.POST/request.params中不可用,即使它被正确解析了?
    2. 有没有办法解决这个问题,所以我仍然可以将JSON中的auth代码发送到我的应用程序?
    3. 我花了两个下午试图自己得到答案,但到目前为止还没有得到一个好的结论。

1 个答案:

答案 0 :(得分:2)

omniauth-google-oauth2尝试从Rack::Request.params哈希中获取身份验证代码。但是,Rack显然没有内置的JSON解析。 Params拨打POST,然后拨打form_data?,仅查找application/x-www-form-urlencodedmultipart/form-data。然后它还会尝试parseable_data?,它也不会解析JSON。看起来像Rack不支持开箱即用的JSON,也看看this answer

"action_dispatch.request.request_parameters"=>{"code"=>"<sent_in_code>"}哈希是有效的,因为这是由rails ActionDispatch :: Request完成的,它是Rack :: Request的子类。但是因为omniauth gem作为Rack中间件包含在您的应用程序中,所以它不知道ActionDispatch请求对象。

问题仍然是this example使用JSON的原因。

可能的解决方案:

  • money-Patch JSON支持到机架 - 不推荐
  • 只需使用application/x-www-form-urlencoded - 推荐