web-dev-qa-db-ja.com

RubyでHTTPSを介した基本認証を行う方法は?

よく調べたところ、うまくいくように見えても、私には役に立たない解決策がいくつか見つかりました...

たとえば、次のスクリプトがあります。

require 'net/http'
require "net/https"

@http=Net::HTTP.new('www.xxxxxxx.net', 443)
@http.use_ssl = true
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
@http.start() {|http|
    req = Net::HTTP::Get.new('/gb/PastSetupsXLS.asp?SR=31,6')
    req.basic_auth 'my_user', 'my_password'
    response = http.request(req)
    print response.body
}

実行すると、認証を要求するページが表示されますが、ブラウザーで次のURLを書き込むと、問題なくWebサイトにアクセスできます。

https://my_user:[email protected]/gb/PastSetupsXLS.asp?SR=31,6

私もopen-uriを試しました:

module OpenSSL
    module SSL
        remove_const :VERIFY_PEER
    end
end
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

def download(full_url, to_here)
    writeOut = open(to_here, "wb") 
    writeOut.write(open(full_url, :http_basic_authentication=>["my_user", "my_password"]).read) 
    writeOut.close 
end

download('https://www.xxxxxxx.net/gb/PastSetupsXLS.asp?SR=31,6', "target_file.html")

しかし結果は同じで、サイトはユーザー認証を求めています。私が間違っていることのヒントはありますか?パスワードをBase 64でエンコードする必要がありますか?

Net :: HTTP docs の例に基づいてコードを記述し、ローカルのWAMPサーバーでテストしました-正常に動作します。ここに私が持っているものがあります:

require 'net/http'
require 'openssl'

uri = URI('https://localhost/')

Net::HTTP.start(uri.Host, uri.port,
  :use_ssl => uri.scheme == 'https', 
  :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|

  request = Net::HTTP::Get.new uri.request_uri
  request.basic_auth 'matt', 'secret'

  response = http.request request # Net::HTTPResponse object

  puts response
  puts response.body
end

そして、私の.htaccessファイルは次のようになります。

AuthName "Authorization required"
AuthUserFile c:/wamp/www/ssl/.htpasswd
AuthType basic
Require valid-user

私の.htpasswdは、パスワード "secret"のhtpasswd -c .htpasswd mattで生成された1つのライナーです。コードを実行すると、「200 OK」とindex.htmlのコンテンツが表示されます。 request.basic_auth行を削除すると、401エラーが発生します。

UPDATE:

コメントの@stereoscottで示されているように、例で使用した:verify_mode値(OpenSSL::SSL::VERIFY_NONE)は、本番環境では安全ではありません。

OpenSSL :: SSL :: SSLContext のドキュメントに記載されているすべての利用可能なオプションは、VERIFY_NONE、VERIFY_PEER、VERIFY_CLIENT_ONCE、VERIFY_FAIL_IF_NO_PEER_CERTのうち、( OpenSSL docs に従って)最初の2つはクライアントモードで使用されます。

したがって、本番環境ではVERIFY_PEERを使用する必要があります。これは デフォルト btwなので、完全にスキップできます。

40
Matt