質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

3447閲覧

Net::HTTP request BASIC認証について

kazuyakazuya

総合スコア193

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/08/01 07:35

Rubyのnet/httpを使ってbasic認証を突破したいです。
basic認証を実装したアプリをherokuでアップしたのでこちらのサーバーを相手とします。
認証は userとidです。

リンク内容

require 'open-uri' require 'net/http' params = {'deviceToken' => 'hoge', 'email' => '僕のあどれす','pwd' => 'マイパスワード','type'=>'normal'} url = URI.parse('http://www.hogehoge.api') req = Net::HTTP::Post.new(url.path) req.basic_auth 'basic認証ID', 'basic認証パス' req.set_form_data(params) res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) } case res when Net::HTTPSuccess, Net::HTTPRedirection p "OK" p res.body else res.value end

こちらを参考に作っています。

それで作ったコードがこちら

ruby

1require 'net/http' 2require 'uri' 3url = URI.parse('https://young-refuge-27377.herokuapp.com/') 4request = Net::HTTP::Post.new(url.path) 5request.basic_auth('user','id') 6http = Net::HTTP.new("young-refuge-27377.herokuapp.com",443) 7http.use_ssl = true #SSL通信をするため 8http.verify_mode = OpenSSL::SSL::VERIFY_NONE#SSL通信をするため 9a = http.request(request) 10puts a.code 11

こちらの実行結果で404が返ってきます。

質問1
実行すると404が返ってくるのですがなぜでしょうか?
送るメソッドが間違っているからでしょうか。
イメージ説明
仮に送るメソッドが間違っていたんだとしても
どうやればメソッドをしてすることができますか?
リファレンスをみる限り
requestメソッドの引数の中にメソッドを指定するような場所もない
と思うのですが・・・。

質問2

自分が参考にしたサイト
のコード

require 'open-uri' require 'net/http' params = {'deviceToken' => 'hoge', 'email' => '僕のあどれす','pwd' => 'マイパスワード','type'=>'normal'} url = URI.parse('http://www.hogehoge.api') req = Net::HTTP::Post.new(url.path) req.basic_auth 'basic認証ID', 'basic認証パス' req.set_form_data(params) res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) } case res when Net::HTTPSuccess, Net::HTTPRedirection p "OK" p res.body else res.value end

requestメソッドの引数(data)には
リファレンスによると

リクエストのボディを文字列で与えます。

上記のものを与えるとあるのですが
このリクエストのボディが指しているのは

Authorization: Basic dXNlcjppZA==

このようなヘッダーのことですか?

質問3(2が合っていたら)

require 'open-uri' require 'net/http' params = {'deviceToken' => 'hoge', 'email' => '僕のあどれす','pwd' => 'マイパスワード','type'=>'normal'} url = URI.parse('http://www.hogehoge.api') req = Net::HTTP::Post.new(url.path) req.basic_auth 'basic認証ID', 'basic認証パス' req.set_form_data(params) res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) } case res when Net::HTTPSuccess, Net::HTTPRedirection p "OK" p res.body else res.value end

ここで
Net::HTTP::Postクラスを使っていますが
わざわざNet::HTTP::Postクラスのbasic_authメソッドを使わなくても

requestの引数に直接

Authorization: Basic dXNlcjppZA==

上記のbasic認証のためのヘッダーを渡してもいけるのでしょうか?

分からないのでお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

送るメソッドが間違っているからでしょうか。

これだけの情報では誰にもわかりません。サーバサイドはどのようなリクエストに対して応答するように実装していますでしょうか。

(なお、「BASIC認証に失敗した」場合には401 Authorization Requiredを返しますので、BASIC認証は通過できていそうです)

このリクエストのボディが指しているのは(中略)このようなヘッダーのことですか?

いえ、違います。書いてあるとおり、Authorization:はリクエストヘッダとして与えるべきものです。

投稿2019/08/01 07:43

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/08/01 07:47

以前から指摘があったかと思いますが、HTTPリクエストの構造を理解していれば、質問2のような疑問は出ないかと思います。
kazuyakazuya

2019/08/01 08:03

ありがとございます。 今考えてみればボディに対してと書いてありますね。。。 では、自分が参考にしたサイトのコードをもとに言うならば requestの引数に与えているものはなんですか? その引数に与えたもの(basicの何か)は ボディ にセットさるのですよね? Authorization: Basic dXNlcjppZA== これをヘッダーにセットしないと basic認証を突破できないと思うのですが
maisumakun

2019/08/01 08:10

> では、自分が参考にしたサイトのコードをもとに言うならば requestの引数に与えているものはなんですか? その引数に与えたもの(basicの何か)は ボディ にセットさるのですよね? そのとおりです。Basic認証とは全く無関係です。
kazuyakazuya

2019/08/01 08:21

最後にひとつお願いします。 参考にしたサイトのコードと仮定して・・・ Net::HTTP::Postクラスのインスタンス に対してbasic_authメソッドで basic認証するための何かをヘッダーにセットしているのですよね? でも、実際にサーバーサイドに送っているのは Net::HTTP::Postのインスタンスではなく Net::HTTPクラスのインスタンスだと思うのですが ではresponseの引数が実は関係ないならば どうやってNet::HTTPのインスタンスに対して basicの情報を載せているのですか? そもそも考え方がずれていますでしょうか? 分からないのでお願いします。
maisumakun

2019/08/01 08:24

> でも、実際にサーバーサイドに送っているのは Net::HTTP::Postのインスタンスではなく Net::HTTPクラスのインスタンスだと思うのですが この考え方がそもそもおかしいです。あくまで、HTTP通信で送れるのは「HTTPリクエスト」であって、Net::HTTPやNet::HTTP::Postは、それを組み立てるための道具に過ぎないのです。
kazuyakazuya

2019/08/01 08:29

やっと理解できました。 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問