こんにちは、sheepman です。

WEBrick の Digest 認証 WEBrick::HTTPAuth::DigestAuth に関してです。

RFC 2617 によれば Digest 認証が成功した時にサーバが返す、Authentication-Info ヘッダに
含まれるハッシュ値 rspauth はサーバが保持するクライアントのパスワードのハッシュ値と 
サーバが返すエンティティボディなどから計算することになっています。

このようなハッシュ値をレスポンスに添付することでレスポンスのエンティティボディが
通信経路上で改変されていないことが保証されます。パスワードのハッシュ値を知って
いるのはサーバとクライアントだけですから、正しい rspauth を計算できるのもサーバと
クライアントだけです。

RFC 2617 3.2.3 の以下の式の entity-body はサーバが返すレスポンスのエンティティボディだと
思います。

  A2       = ":" digest-uri-value ":" H(entity-body)

というわけで、 httpauth/digestauth.rb は以下のように変える必要があると思います。

でも、authenticate(req, res) を呼んだ時には普通 res.body は空のはずですから
このままで良いのかは良く分かりません。

Index: httpauth/digestauth.rb
===================================================================
RCS file: /src/ruby/lib/webrick/httpauth/digestauth.rb,v
retrieving revision 1.3
diff -u -r1.3 digestauth.rb
--- httpauth/digestauth.rb      18 Dec 2004 06:16:01 -0000      1.3
+++ httpauth/digestauth.rb      1 Jan 2005 08:32:56 -0000
@@ -178,7 +178,7 @@
         elsif auth_req['qop'] == "auth-int"
           ha2 = hexdigest(req.request_method, auth_req['uri'],
                           hexdigest(req.body))
-          ha2_res = digest("", auth_req['uri'], hexdigest(req.body))
+          ha2_res = digest("", auth_req['uri'], hexdigest(res.body))
         end
 
         if auth_req['qop'] == "auth" || auth_req['qop'] == "auth-int"



-- 
sheepman / TAMURA Takashi
sheepman / tcn.zaq.ne.jp http://sheepman.parfait.ne.jp/