rails,无法从url获取params

时间:2011-12-12 19:18:17

标签: ruby-on-rails openid

我尝试使用Google Federated Login REST API。我可以成功地联系到谷歌服务器并验证用户,但我无法从返回网址中提取参数

  

例如:   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.urlrequest.query_parameter以及所有类似的调用都不会返回查询字符串。

2 个答案:

答案 0 :(得分:0)

我想我发现了这个问题。我正在使用open-uri库来调用google的端点url,因此它可能已经超出正常的rails响应/请求周期。我已经使用了Net :: HTTP请求并解析了响应中的信息。

答案 1 :(得分:0)

所以我有一个非常类似的问题,我实际上构建了一个基于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”是文件类型或路由解析的东西?)我正在考虑允许句点的这篇文章,但它只适用于 value ,而不是密钥: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:好的,想通了,我相信 - 这个参数正在被消毒,即被机架openid宝石删除,在宝石的路径中:/lib/openid.rb:168 ,“sanitize_query_string”。这似乎与我正在使用的示例不兼容:https://github.com/openid/ruby-openid/tree/master/examples/rails_openid。要覆盖该方法。

最终更新:我替换了这一行:

oidreq = server.decode_request(params)

这一行,因为我们不能再使用now-empty params hash:

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