2010-08-18 3 views
2

Je ne fais que jouer avec le protocole OpenID. J'essaie d'envoyer une demande de découverte et de récupérer le document XRDS de google. Lorsque je tente de le faire à partir du terminal en utilisant la boucle, je reçois la sortie suivanteRécupération de document XRDS dans OpenID en utilisant Ruby

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> 

Lorsque je tente de faire la même chose à partir du code rubis, il me donne une erreur 302 et l'URL pour laquelle il a déplacé des points à la même URL de demande.

<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> 

code

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}" 

Comment obtenir les XRDS par le code et pourquoi est-il montrant différentes sorties. Quelqu'un peut-il l'expliquer? Merci

+0

Merci pour les réponses :) – felix

Répondre

3

Google attend le protocole https, bien que dans votre exemple ruby ​​vous utilisez http, d'où l'erreur 302. L'extrait suivant devrait vous obtenir le document 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

Comme vous pouvez le voir, quand vous allez chercher le document de Ruby, il renvoie le code d'état 302, ce qui signifie que vous devriez chercher location en-tête et de le suivre, comme Curl fait. Une autre réponse suggérait de coder en dur l'URL valide, mais ce n'est pas une solution correcte, puisque Google pourrait aussi renvoyer 302 et déplacer le document ailleurs. Sans compter que vous devez effectuer une recherche complète Yadis au lieu d'espérer obtenir un document XRDS à partir de l'URL (parce que, par exemple, Google peut décider qu'il s'agit d'un bon emplacement pour l'explication de OpenID et déplacer le document XRDS ailleurs utilisant l'en-tête X-XRDS-Location).

Questions connexes