我想用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就会正确解析参数,并且env对象包含已解析的参数:
"action_dispatch.request.request_parameters"=>{"code"=>"<sent_in_code>"}
但是,request.params哈希保持为空。由于OmniAuth检查request.params['code']
,因此这是错误的根源。
request.POST是空的,从Rack的源代码来看,这是空的request.params哈希的根本原因。
当以的标准格式发送代码时data:"code="+authResult['code']
,该参数在request.params哈希中可用。(然后,我收到一个奇怪的未定义路由错误,但这是一个不同的问题。)
现在,即使我可以通过不使用JSON来避免此问题,但我对以下问题的答案仍然非常感兴趣:
我花了两个下午试图自己找到答案,但是到目前为止,还没有真正得出一个好的结论。
omniauth-google-oauth2
尝试从Rack::Request.params
哈希中获取身份验证代码。但是,Rack显然没有内置的JSON解析。参数调用POST,然后调用form_data?只寻找application/x-www-form-urlencoded
或multipart/form-data
。然后,它还会尝试parseable_data吗?,也不会解析JSON。似乎Rack不支持开箱即用,也请查看此答案。
该"action_dispatch.request.request_parameters"=>{"code"=>"<sent_in_code>"}
散列工作,因为这是由轨道ActionDispatch ::请求,其子类货架::请求完成。但是,由于omniauth gem作为Rack中间件包含在您的应用程序中,因此它不知道ActionDispatch请求对象。
问题仍然是为什么该示例使用JSON。
可能的解决方案:
application/x-www-form-urlencoded
-推荐本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句