2010-08-18 1 views
2

나는 OpenID 프로토콜을 가지고 놀고 있습니다. Discovery 요청을 보내고 Google에서 XRDS 문서를 검색하려고합니다. 나는 컬을 사용하여 터미널에서 작업을 수행 할 때, 나는 다음과 같은 출력Ruby를 사용하여 OpenID에서 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를 얻는 이유는 서로 다른 출력을 보여주는 방법. 누군가가 그것을 설명 할 수 있습니까? 감사합니다

+0

답변 해 주셔서 감사합니다 :) – felix

답변

3

Google은 https 프로토콜을 사용합니다. 그러나 루비 예제에서는 http를 사용하므로 302 오류가 발생합니다.

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

당신이 루비에서 문서를 가져올 때, 볼 수 있듯이, 당신이 location 헤더보고처럼, 그것을 따라야 즉, 302 상태 코드를 반환 : 다음 코드는 당신에게 xrds 문서를 얻어야한다 곱슬 곱슬합니다.

또 다른 답변은 올바른 URL을 하드 코딩하는 것이 좋지만 Google이 302를 반환하고 문서를 다른 곳으로 옮길 수 있기 때문에 올바른 해결책은 아닙니다.

URL에서 XRDS 문서를 가져 오기를 바라지 않고 전체 Yadis 검색을 수행해야한다는 것은 말할 필요도 없습니다. 예를 들어 Google이 OpenID에 대한 설명을위한 좋은 위치라고 판단하고 XRDS 어딘가에 X-XRDS-Location 헤더 사용).