我想使用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"
经过筹码后,我想出了以下内容:
只要我有' application / json'设置为内容类型,Rack正确解析params并且env对象包含已解析的参数:
"action_dispatch.request.request_parameters"=>{"code"=>"<sent_in_code>"}
但是,request.params哈希值仍为空。由于OmniAuth检查request.params['code']
,因此这是错误的来源。
request.POST为空,从查看Rack的源代码是空request.params hash的根本原因。
以data:"code="+authResult['code']
标准格式发送代码时,该参数在request.params哈希中可用。 (然后我得到一个奇怪的未定义路由错误,但这是一个不同的问题。)
现在,即使我可以通过不使用JSON来避免这个问题,我仍然可以回答以下问题:
我花了两个下午试图自己得到答案,但到目前为止还没有得到一个好的结论。
答案 0 :(得分:2)
omniauth-google-oauth2
尝试从Rack::Request.params
哈希中获取身份验证代码。但是,Rack显然没有内置的JSON解析。 Params拨打POST,然后拨打form_data?,仅查找application/x-www-form-urlencoded
或multipart/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的原因。
可能的解决方案:
application/x-www-form-urlencoded
- 推荐