rails,无法从url获取参数

问题描述:

我正在尝试使用Google联合登录REST API。我可以成功地接触到谷歌的服务器和验证用户,但我不能从返回URLrails,无法从url获取参数

拉参数,例如: http://mysite.com/login/return?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=id_res&openid.op_endpoint=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fud ...

所有在返回字符串变量是无法在params数组中访问。我不知道如何让他们出去。 requst.url,request.query_parameter,并且所有类似的调用都不返回查询字符串。

+0

他们应该是...当你在'return'行动中'raise params.inspect'时,你会得到什么? – Robin

+0

{“controller”=>“login”,“action”=>“return”} – vosmith

+0

我不知道他们为什么不可用。您可以使用新的omniauth(https://github.com/intridea/omniauth),使用此策略https://github.com/zquestz/omniauth-google-oauth2来实现同样的目标。稍后使用此方法添加新的身份验证服务将非常简单。 – Robin

我想我找到了问题。我正在使用open-uri库来调用Google的端点url,以便它可能已经超出了正常的rails响应/请求周期。我已经使用Net :: HTTP请求并解析响应中的信息。

+1

签出HTTParty,看起来比Net :: HTTP更可读 –

所以我有一个非常类似的问题,我实际上在构建一个基于Rails的openid 提供程序,但被另一个Rails应用程序使用。我基本上是改编自

代码整个网址是:

http://localhost:3000/openid?openid.assoc_handle=%7BHMAC-SHA1%7D%7B5193d33f%7D%7BdBrUwQ%3D%3D%7D&openid.claimed_id=http%3A%2F%2Flocalhost%3A3000%2Fopenid%2Fwarren&openid.identity=http%3A%2F%2Flocalhost%3A3000%2Fopenid%2Fwarren&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1&openid.realm=http%3A%2F%2Flocalhost&openid.return_to=http%3A%2F%2Flocalhost%2Fsession%3F_method%3Dpost%26return_to%3D&openid.sreg.required=nickname%2Cemail 

我在那里被报告是唯一的参数类似的问题:

{"action"=>"index", "controller"=>"openid"} 

所以,怀疑一些参数(也许一段时间?)导致它打嗝,我通过并逐一删除它们,直到我发现删除以下参数可以使整个事情正确地通过:

openid.mode=checkid_setup 

这让所有剩余的参数正确地被解析:

{"openid.assoc_handle"=>"{HMAC-SHA1}{5193d33f}{dBrUwQ==}", 
"openid.claimed_id"=>"http://localhost:3000/openid/warren", 
"openid.identity"=>"http://localhost:3000/openid/warren", 
"openid.ns"=>"http://specs.openid.net/auth/2.0", 
"openid.ns.sreg"=>"http://openid.net/extensions/sreg/1.1", 
"openid.realm"=>"http://localhost", 
"openid.return_to"=>"http://localhost/session?_method=post&return_to=", 
"openid.sreg.required"=>"nickname,email", 
"action"=>"index", 
"controller"=>"openid"} 

我现在试图找到为什么openid.mode导致此问题。即使我将其更改为openid.mode = 5,它也会失败,所以它是关键,而不是值,导致问题。

怀疑麻烦的字符串的“.mode”部分(也许“.mode”是一个文件类型或由路由解析的东西?)我期待这个职位允许期间,但它只适用于,而不是关键字:rails routing and params with a '.' in them

如果我找到更多信息,将会返回。我试过,在另一个Rails应用中,将?openid.mode = 0添加到URL的末尾 - “.mode”不会导致读取参数,而是“.modes =”确实如此“.mod =”。这证实“.mode”导致params解析错误。

更新2: yikes ...实际上“?a.mode = 0”确实有效。到目前为止,只有完整的字符串“openid.mode”不起作用,这是跨越各种Rails应用程序。 “?openid.mode”没有任何其他结果:参数:{“openid.mode”=> nil},但是“?openid.mode =”没有任何操作,“=”没有通过除动作&控制器之外的任何参数。很奇怪。

更新3: OK,理解了它,我相信 - 在PARAMS都拿到通过架OpenID的宝石消毒即删除,创业板的路径:/lib/openid.rb:168,“sanitize_query_string” 。这似乎与我正在使用的示例不兼容:https://github.com/openid/ruby-openid/tree/master/examples/rails_openid。要覆盖该方法。

最后更新:我换成这一行:

oidreq = server.decode_request(params) 

这一行,因为我们可以不再使用现在空PARAMS哈希:

oidreq = server.decode_request(Rack::Utils.parse_query(request.env['ORIGINAL_FULLPATH']))