Получение документа XRDS в OpenID с использованием Ruby - PullRequest
2 голосов
/ 18 августа 2010

Я просто играю с протоколом OpenID. Я пытаюсь отправить запрос на обнаружение и получить документ XRDS из Google. Когда я пытаюсь сделать это из терминала, используя curl, я получаю следующий вывод

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>

Когда я пытаюсь сделать то же самое из кода ruby, он выдает ошибку 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 через код и почему он показывает разные результаты. Может кто-нибудь объяснить это? Спасибо

Ответы [ 2 ]

3 голосов
/ 18 августа 2010

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}"
1 голос
/ 18 августа 2010

Как вы можете видеть, когда вы извлекаете документ из ruby, он возвращает код состояния 302, что означает, что вы должны искать заголовок location и следовать ему, как делает curl.

Другой предложенный ответпросто жестко закодировать действительный URL, но это не является правильным решением, поскольку Google может заставить его вернуть также 302. и переместить документ в другое место.

Не говоря уже о том, что вы должны выполнить полный Yadis обнаружение вместо того, чтобы надеяться, что вы получите документ XRDS из URL (потому что, например, Google может решить, что это хорошее место для объяснения OpenID, и переместить XRDS куда-нибудь еще, используя заголовок X-XRDS-Location).

...