2

私はOpenIDプロトコルで遊んでいます。ディスカバリーリクエストを送信し、GoogleからXRDSドキュメントを取得しようとしています。カールを使用してターミナルから実行しようとすると、次の出力が得られます

curl --url "https://www.google.com/accounts/o8/id"
    <?xml version="1.0" encoding="UTF-8"?>
    <xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
      <XRD>
      <Service priority="0">
      <Type>http://specs.openid.net/auth/2.0/server</Type>
      <Type>http://openid.net/srv/ax/1.0</Type>
      <Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
      <Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
      <Type>http://specs.openid.net/extensions/pape/1.0</Type>
      <URI>https://www.google.com/accounts/o8/ud</URI>
      </Service>
      </XRD>
    </xrds:XRDS>

ルビーコードから同じことを行おうとすると、302エラーが発生し、移動先のURLが同じリクエストURLを指します。

<HTML>
<HEAD>
<TITLE>Moved Temporarily</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Moved Temporarily</H1>
The document has moved <A HREF="https://www.google.com/accounts/o8/id">here</A>.
</BODY>
</HTML>

コード

  require 'net/http'
  require 'net/https'
  require 'uri'
  http = Net::HTTP.new(uri.host, uri.port)

  response =  Net::HTTP.get_response(URI.parse("http://www.google.com/accounts/o8/id"))
  puts "#{response.read_body}"

コードを介してXRDSを取得する方法と、異なる出力が表示されるのはなぜですか。誰かがそれを説明できますか?

4

2 に答える 2

3

Google は https プロトコルを想定していますが、Ruby の例では http を使用しているため、302 エラーが発生します。次のスニペットで xrds ドキュメントを取得できます。

require 'net/http'
require 'net/https'
require 'uri'

uri = URI.parse('https://www.google.com/accounts/o8/id')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)
puts "#{response.read_body}"
于 2010-08-18T09:43:37.777 に答える
1

ご覧のとおり、Ruby からドキュメントをフェッチすると、302 ステータス コードが返されます。これはlocation、curl のようにヘッダーを探してそれに従う必要があることを意味します。

別の回答は、有効な URL をハードコーディングすることを提案しましたが、Google が 302 を返してドキュメントを別の場所に移動できるため、それは正しい解決策ではありません。

言うまでもなく、URL から XRDS ドキュメントを取得することを期待するのではなく、 Yadisの完全な検出を実行する必要があります (たとえば、Google が OpenID の説明に適した場所であると判断し、XRDS を別の場所に移動する可能性があるため)X-XRDS-Locationヘッダ)。

于 2010-08-18T10:28:25.060 に答える