.htaccessを使用した認証について

[上に] [前に] [次に]
まめ 2000/03/16(木) 16:19:37
過去のトピックを参照したのですが、具体的な方法が見つからなかったので書き込みさせて頂きました。

現在、.htaccessを利用してユーザー認証をするようにしています。
ユーザー名とパスワードを入力して認証が許可された後、ブラウザを一度終了しないと再度ユーザー認証をしてくれません。
過去のトピック(.htaccess でのユーザー認証をクリアするにはで、「.htaccessに入ってるユーザー名かパスワードを毎回かえないとだめだと思います。」という意見があったのですが具体的な方法が記述されていないので、その方法を教えてください。また、ほかに簡単な方法がありましたらご教授お願いいたします。

たくぽん 2000/03/16(木) 16:49:08
まず大前提として、
>ユーザー名とパスワードを入力して認証が許可された後、
>ブラウザを一度終了しないと再度ユーザー認証をしてくれません。
これが正式な仕様です。ですから、これを変更するにはそれなりのリスクがあります。

>「.htaccessに入ってるユーザー名かパスワードを毎回
>かえないとだめだと思います。」
HTMLにSSIか画像型CGIを埋め込んで、直接.passwordを書き換えるのでは?
現実的な方法ではないと思いますが・・・

まめ 2000/03/16(木) 17:03:36
>HTMLにSSIか画像型CGIを埋め込んで、直接.passwordを書き換えるのでは?
直接.passwordを書き換えることができるんですか?
よろしければご教授お願いします。

たくぽん 2000/03/16(木) 17:13:19
単なるファイルの更新ですから、原理的には可能です。
しかし、実際には.passwordは暗号化されていますから、同等の暗号化ロジックを自前で用意する必要があります。
そして、CGIで書き換えるには、一般的にnobody権限で該当ファイルが更新できる必要がありますから、.passwordを無防備な状態で晒しておく必要があります。
以上のようなことを踏まえて、「現実的ではない」としたのです。
後者はともかく、前者(暗号化ロジック)は私にはわかりませんので、方法を示すことはできません。

たくぽん 2000/03/16(木) 17:14:53
あ、あともう一つ、毎回パスワードが変更されたら、
それをどうやって毎回ユーザに通知するのかという問題もありますね。

まめ 2000/03/16(木) 17:25:00
>.passwordを無防備な状態で晒しておく必要があります。
なるほど。
>「現実的ではない」としたのです
確かにそうですね。
認証する意味がなくなってしまいますよね。

入力したユーザー名、パスワードはどこにあるんでしょうか。
シェルとか言うところに保存されているのでしょうか。
それともブラウザが覚えているのでしょうか。
もしそうだとしたらクリアーできないのでしょうか。
ご教授お願いします。

ポンタ [E-Mail] 2000/03/16(木) 18:25:38
まず、毎回パスワードを入力する事自体ユーザーは迷惑な話です。
しかし、何らかの事情で行う必要があるのでしょう。

パスワードによる認証は、
.htaccess          というファイルを作り、

AuthUserFile       /***/***/.password

という行を書くと.htaccessの存在するディレクトリのみもしくは、
そのディレクトリ配下のディレクトリ全てが認証の対象となります。
(httpdの版数と、定義によって(つまりサーバによって)異なる)
そこで、他のディレクトリで移った時に再度認証を行いたければ、
そのディレクトリに .htaccess を作り、
AuthUserFile       /***/***/.password2
のようにパスワードファイルを別のファイルにするとIDと
聞いてきます。

そこで、.password と .password2 の中身が同じならば、
同じパスワードにできます。
(私は、コピーをして同じファイルにしていますが、リンクでOKかは
  不明です。)

回答になりましたでしょうか?

まめ 2000/03/16(木) 19:59:29
ポンタさん、ご意見ありがとうございます。
他のディレクトリについてはそういう方法があるのかと勉強になりました。
私がお聞きしたいのは、例えば以下のようにしたいということなのです

1.トップページからユーザー認証付のページにログインする
2.ユーザー認証付のページを観覧する、掲示版などがあれば書き込みをする
3.ユーザー認証付のページからトップページに戻る
4.再びユーザー認証付のページを観覧しようと試みる。

4の時に再びログインダイヤログボックスが出てほしいのです。
しかし、一度認証しているのでブラウザを起動しなおさないと出てきてくれません。

どうかご教授お願いいたします。

kensu7 [E-Mail] 2000/03/16(木) 21:26:49
リターンコード 401 を受けたときに認証キャッシュ消すみたいなんで、

HTTP/1.0  401  Unauthorized

ってヘッダー送ればいいんでないかな。

ただし、

この動作は、HTTP Basic認証の標準に基づいていません。 よって、この機能に依存しないように注意する必要があります。

なのでよろしく。

気まぐれ 2000/03/17(金) 00:16:11
>リターンコード 401 を受けたときに認証キャッシュ消すみたいなんで
WINネットスケープ4.6ではうまくいきましたが
IE4 IE5ではダメでした。

#!/usr/local/bin/perl
$|=1;
print "Status: 401\n";
print "Content/Type: text/plain\n\n";

この方法(認証キャンセル)どなたか知りませんか?

? 2000/03/17(金) 02:32:17
> IE4 IE5ではダメでした。
> #!/usr/local/bin/perl
> $|=1;
> print "Status: 401\n";
> print "Content/Type: text/plain\n\n";
RFCくらい読めよ。

RFC 2616                        HTTP/1.1                       June 1999


10.4.2 401 Unauthorized

   The request requires user authentication. The response MUST include a
   WWW-Authenticate header field (section 14.47) containing a challenge
   applicable to the requested resource. The client MAY repeat the
   request with a suitable Authorization header field (section 14.8). If
   the request already included Authorization credentials, then the 401
   response indicates that authorization has been refused for those
   credentials. If the 401 response contains the same challenge as the
   prior response, and the user agent has already attempted
   authentication at least once, then the user SHOULD be presented the
   entity that was given in the response, since that entity might
   include relevant diagnostic information. HTTP access authentication
   is explained in "HTTP Authentication: Basic and Digest Access
   Authentication" [43].

まめ 2000/03/17(金) 09:47:06
?さん、ご意見ありがとうございます。
私、英語は苦手なので読めないんですが・・・。すみません。
よろしければ日本語で説明していただきたいのですが。

やはりユーザーがブラウザを終了する以外、ほかに方法はないのでしょうか?
ご教授お願いいたします。

kensu7 2000/03/17(金) 12:41:24
僕は Perl あまり詳しくないんで分からないですが、
PHP ならこんな感じでいけます。

function authenticate() {
  header("WWW-authenticate:  basic  realm=\"Test  Authentication  System\"");
  header("HTTP/1.0  401  Unauthorized");
  echo "このリソースにアクセスする際には有効なログイン ID とパスワードを入力する必要があります。\n";
  exit;
}

if(!isset($PHP_AUTH_USER) || ($SeenBefore ==  1  &&  !strcmp($OldAuth,  $PHP_AUTH_USER))) {
  authenticate();
}
else {
  echo "ようこそ:  $PHP_AUTH_USER<BR>\n";
  echo "Old:  $OldAuth\n";
  echo "<form action=\"$PHP_SELF\" method=\"POST\">\n";
  echo "<input type=\"hidden\" name=\"SeenBefore\" value=\"1\">\n";
  echo "<input type=\"hidden\" name=\"OldAuth\" value=\"$PHP_AUTH_USER\">\n";
  echo "<input type=\"submit\" value=\"ログアウト\">\n";
  echo "</form>\n";
}

ログアウトボタン押せば再び認証できます。
ただし Lynx はこれで認証キャッシュクリアしないみたいです。

まめ 2000/03/17(金) 13:45:08
kensu7さんご意見ありがとうございます。
ちょっと話がそれてしまうんですが、重大な問題が出たので質問させていただきます。

現象は以下のとうりです。

1.トップページからユーザー認証付のディレクトリ(wwwboard.cgi)にアクセスする。
2.ログインをキャンセルする。
3.401.htmlが表示される。
4.ブラウザの戻るボタンで前のページ(トップページ)に戻る。
5.ブラウザの進むボタンをおす。
すると掲示版(wwwboard.cgi)が表示されてしまいます。
なぜでしょうか。
ソースのリンク部分は
<A href="../cgi-bin/board/wwwboard.cgi">
と書いています。
アクセスするファイルがcgiだからなのでしょうか。
だれかご教授お願いいたします。

? 2000/03/18(土) 01:13:01
> すると掲示版(wwwboard.cgi)が表示されてしまいます。
> なぜでしょうか。
キャッシュに残ってるんでしょ。

apache1.3.11, IE5.01&NN4.7にて動作確認
.htaccess
-----------------------------------------------
AuthType basic
AuthUserFile /foo/bar/.htpasswd
AuthName "fuck me!"
AuthGroupFile /foo/bar/.htgroup

<Files logout.html>
require group logout
</Files>

require group users

index.html
-----------------------------------------------
<html>
<head>
</head>
<body>
test
<a href="http://logout:logout@fuck.me/~u/logout.html">logout</a>
</body>

.htgroup
-----------------------------------------------
users: u1 u2
logout: logout

[上に] [前に] [次に]