2013-07-28 51 views
4

我可以很容易地在命令行中使用捲曲事:捲曲和網絡的Http紅寶石

curl --digest -u "user:password" [url] 

但我試圖使用Ruby的Net :: HTTP。有沒有辦法在嘗試使用Net :: HTTP GET API時提供用戶名和密碼?

我試過basic_auth方法,但它不起作用。

這裏是我的代碼塊

基本身份驗證

uri = URI("https://www.commcarehq.org/a/chanderi/api/v0.4/form/?xmlns=http://openrosa.org/formdesigner/C3B60561-F631-4D4C-8611-10E975EF8B44") 

res = Net::HTTP.start(uri.hostname, uri.port) {|http| 
    req = Net::HTTP::Get.new(uri) 
    req.basic_auth 'myusername', 'mypassword' 
    http.request(req) 
} 
puts res.body 

淨:: HTTP :: digestauth

digest_auth = Net::HTTP::DigestAuth.new 

uri = URI.parse 'http://localhost:8000/' 
uri.user = CGI.escape('[email protected]') 
uri.password = 'password' 
h = Net::HTTP.new uri.host, uri.port 
req = Net::HTTP::Get.new uri.request_uri 
res = h.request req 

網:: HTTPBadResponse:錯誤狀態行: 「」

我正在關注http://docs.seattlerb.org/net-http-digest_auth/Net/HTTP/DigestAuth.html

+1

定義「不起作用」。發生了什麼,除了發生什麼事情?你收到錯誤信息了嗎?發佈你的確切代碼和它的輸出。 –

+0

我在我的問題中添加了一些信息 – Nich

+0

@Nich你是否在'uri.user ='方法中傳遞電子郵件? –

回答

0

這裏是:Net::HTTP記錄。

在不打開TCP連接或HTTP會話的情況下創建新的Net :: HTTP對象。

地址應該是DNS主機名或IP地址,端口是服務器運行的端口。如果沒有給出端口,則使用HTTP或HTTPS的默認端口。

如果沒有給出任何p_參數,則代理主機和端口將從http_proxy環境變量(或其大寫等效項)中提取(如果存在)。如果代理需要認證,您必須手動提供。有關來自環境的代理檢測的詳細信息,請參閱URI :: Generic#find_proxy。要禁用代理檢測,請將​​p_addr設置爲零。

如果您要連接到自定義代理,請使用p_addr代理主機的DNS名稱或IP地址,p_port用於訪問代理的端口,p_user和p_pass如果需要授權才能使用用戶名和密碼代理人。

1

basic_auth方法是提供用戶名和密碼的正確方法,但只有當服務器要求身份驗證的這種形式。如果,正如你的捲曲片段所暗示的那樣,如果期待摘要式驗證,那麼基本身份驗證確實不起作用。

Net :: HTTP不支持摘要身份驗證內置,但net-http-digest_auth增加了對它的支持。寶石包括一些example usage

+0

雅我試過這個...但是當我在我的控制檯嘗試,它給了我錯誤,當我試圖做uri.user ='用戶名' uri.password ='密碼' – Nich

+1

然後描述你做了什麼,以及如何出錯。 –

+0

我更新了我的問題和代碼和錯誤 – Nich

1

這是我用:

#The URL 
uri = URI.parse("http://lab") 
http = Net::HTTP.new(uri.host, uri.port) 
#Request URL 
request = Net::HTTP::Get.new(uri.request_uri) 
#Basic authentication 
request.basic_auth("userid", "secret") 
response = http.request(request) 
1

有基本身份驗證在我的紅寶石網爲例:: HTTP小抄:https://github.com/augustl/net-http-cheat-sheet/blob/master/basic_auth.rb

發佈代碼在這裏,爲了完整性:

require "net/http" 
require "uri" 

uri = URI.parse("http://google.com/") 

http = Net::HTTP.new(uri.host, uri.port) 
request = Net::HTTP::Get.new(uri.request_uri) 
request.basic_auth("username", "password") 
response = http.request(request) 

這適用於我。也許你正在與一個非標準的服務器通話?

+0

這是適用於摘要驗證? – Nich

+0

可能不是,我從來沒有使用過或聽說過摘要認證,實際上。只需瀏覽維基百科文章,看起來像digest auth和basic auth是完全不同的野獸。您正在使用摘要還是基本的服務器?您可以通過查看回復中「WWW-Authenticate」標題的第一個單詞來判斷。 –

+0

他們是消化,所以我試圖去看看https://rubygems.org/gems/net-http-digest_auth,但它不能工作以及 – Nich

0

去DigestAuth,你應該做到底是對http://docs.seattlerb.org/net-http-digest_auth/Net/HTTP/DigestAuth.html請求兩次寫,因爲第二個請求(200)使用的第一個請求錯誤(401)。檢查auth變量:

require 'uri' 
require 'net/http' 
require 'net/http/digest_auth' 

digest_auth = Net::HTTP::DigestAuth.new 

uri = URI.parse 'http://localhost:8000/' 
uri.user = 'username' 
uri.password = 'password' 

h = Net::HTTP.new uri.host, uri.port 

req = Net::HTTP::Get.new uri.request_uri 

res = h.request req 
# FIRST REQUEST: res is a 401 response with a WWW-Authenticate header 

auth = digest_auth.auth_header uri, res['www-authenticate'], 'GET' 

# create a new request with the Authorization header 
req = Net::HTTP::Get.new uri.request_uri 
req.add_field 'Authorization', auth 

# SECOND REQUEST: re-issue request with Authorization 
res = h.request req