- PR -

URLにIDとパスワード指定

投稿者投稿内容
kouziii
会議室デビュー日: 2003/12/02
投稿数: 11
投稿日時: 2004-08-06 11:40
いつも利用させていただいています。
現在、ある認証機能付きのページをアクセスするときに、URL中にユーザidとパスワードを含めてhttpのgetを実行したいのですが、下記のようなエラーになります。

★エラー
java.io.IOException: Server returned HTTP response code: 401 for URL:http://USERxx:PASSyy@www.testsite/〜
エラーの内容はそのリソースは認証を受けなければならないというものだと思います。
これは、サーバ側の設定の問題なのでしょうか?それともこのようなURLを送信する場合は他の方法をとるべきなのでしょうか?

javaのコードは単純なもので、GETしたHTMLをlogファイルに書くというものです。
★コード
public void doGet(String inurl) throws Exception, IOException {
url = inurl;
URL urlObj;
HttpURLConnection urlCon;
BufferedReader urlIn;
String str;
// URLオブジェクトの作成
urlObj = new URL(url);
// URL接続
urlCon = (HttpURLConnection) urlObj.openConnection();
urlCon.setRequestMethod("GET");
urlIn = new BufferedReader(new InputStreamReader(urlCon
.getInputStream()));
// HTMLソースの表示
logger.log(Level.INFO, inurl);
while ((str = urlIn.readLine()) != null) {
logger.log(Level.INFO, str);
}
// URL切断
urlIn.close();
urlCon.disconnect();
}

どなたかわかる方回答よろしくお願いいたします。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-08-06 12:48
Basic認証でアクセス制限されたサイトにアクセスするときの流れは、
通常次のようになります。

1. ユーザーがクライアント(IE等のWebブラウザ)に目的のURLを入力する。
2. クライアントが、Authorization: ヘッダを付加しないで、
目的のコンテンツにアクセスする。
3. サーバーは、401 Authorization Required のレスポンスを返して、
クライアントに認証が必要である旨を伝える。
4. クライアントがユーザーに ID/PW の入力を求める
(IE等のブラウザが、ポップアップウインドウを出して、
 ID/PW の入力をユーザーに求めるアレです。)
5. ユーザーが ID/PW を入力する。
6. クライアントが、Authorization: ヘッダに ID/PW の情報を付加
して目的のコンテンツに再度アクセスする。
7. サーバが ID/PW を解析して、認証OKであればコンテンツをクライ
アントに返す。
8. クライアントがコンテンツを表示して、ユーザーがそれを閲覧する。

このような感じが仕様になっています。
ネットワークをキャプチャすると一目瞭然です。

ではどうすればいいかですが
ConnectionのsetRequestPropertyを使って
AuthorizationをキーにしてUSERxx:PASSyyをBase64の値でセットして
アクセスすれば認証通るとおもいます。

一応どのような値がAuthorizationにセットされているか
キャプチャして見ることをお勧めします。
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-08-06 13:14
ブラウザが IE だと仮定して、

http://username:password@www.example.com

形式は使用できなくなったという記憶がありますが、関係あります?

kouziii
会議室デビュー日: 2003/12/02
投稿数: 11
投稿日時: 2004-08-06 13:33
いっきゅうさん、回答ありがとうございます。
Authorizationヘッダーについて調査したらいろいろ情報がありますね。
とても参考になりました。
Base64値に変換する方法を調査中ですが、どうやら作りこむ必要があるみたいです。
kouziii
会議室デビュー日: 2003/12/02
投稿数: 11
投稿日時: 2004-08-06 13:37
顔爺さん、こんにちは。
ブラウザはIEですが、サーブレットからURLを発行しようとしていますので、おそらく関係ないと思われます。説明不足ですみません。
kouziii
会議室デビュー日: 2003/12/02
投稿数: 11
投稿日時: 2004-08-06 13:47
自己レスです。
jakartaプロジェクトのcommonsライブラリを使って、Base64エンコードができそうです。
commons-codec-1.3.jar
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-08-06 14:06
(勘違いのため削除)

[ メッセージ編集済み 編集者: Cluster 編集日時 2004-08-06 14:08 ]
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-08-06 14:45
<補足>
Tomcat5.5でテストした結果ですが

コード:
urlCon.setRequestProperty("Referer","www.testsite");
urlCon.setRequestProperty(
  "Authorization",
  "Basic " + new String(Base64.encodeBase64("USERxx:PASSyy".getBytes()))
);


こんな感じにRefererのセットと
AuthorizationにはBasic認証を示す必要があります。

ちなみにDigest認証も同じような方法でできました、、
(Authorizationの値が複雑ですが、、)

スキルアップ/キャリアアップ(JOB@IT)