我尝试使用Google Federated Login REST API。我可以成功地联系到谷歌服务器并验证用户,但我无法从返回网址中提取参数
在params数组中无法访问该返回字符串中的所有变量。我不知道如何把它们拿出来。 requst.url
,request.query_parameter
以及所有类似的调用都不会返回查询字符串。
答案 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']))