From: sheepman Date: 2005-01-01T17:41:30+09:00 Subject: [ruby-list:40480] WEBrick Digest auth and qop=auth-int こんにちは、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/