2009-06-10 7 views
3

PHPスクリプトでHTTPダイジェスト認証を使用して別のサイトに認証します。PHPで認証されたHTTPダイジェスト

私の関数は、パラメータとしてWWW認証ヘッダのコンテンツだけを持って、私は正しい応答(認証ヘッダ)を生成します。私はこれを他の方法(ブラウザが私のスクリプトに認証する)で実装する方法を説明する多くの例を見つけましたが、この方法ではありません。 WWW-Authenticateヘッダーの内容を解析して応答を生成できる関数がありません。これを実装するいくつかの標準関数または共通ライブラリがありますか?

+0

あなたがサイトに接続するために使うのですか?カール? –

+0

xmlrpcライブラリを使用して接続しています。リモートオブジェクトの特定の関数を呼び出すことによってWWW-Authenticateを受け取り、別の関数に標準的な応答を渡す必要があります。 – Jiri

+0

私のRESTfulクライアントを試すことができます。これは、基本的ではありますが、CI GETタイプのサポートを備えたPHPのクライアントです。 URL:https://github.com/corysus/restful_client – corysus

答えて

7

答えはまだありません。ここで嘘をついたPHPの実装を調査し、PHPに書き直しました。可能な限り単純なコードです。唯一MD5ハッシュはサポートしていますが、私の作品:

function H($param) { 
    return md5($param); 
} 
function KD($a,$b) { 
    return H("$a:$b"); 
} 
function parseHttpDigest($digest) { 
    $data = array(); 
    $parts = explode(", ", $digest); 

    foreach ($parts as $element) { 
     $bits = explode("=", $element); 
     $data[$bits[0]] = str_replace('"','', $bits[1]); 
    } 
    return $data; 
} 

function response($wwwauth, $user, $pass, $httpmethod, $uri) {   
     list($dummy_digest, $value) = split(' ', $wwwauth, 2);  
     $x = parseHttpDigest($value); 
     $realm = $x['realm'];   
     $A1 = $user.":".$realm.":".$pass;   
     $A2 = $httpmethod.":".$uri; 

     if ($x['qop'] == 'auth') { 
      $cnonce = time(); 
      $ncvalue = 1; 
      $noncebit = $x['nonce'].":".$ncvalue.":".$cnonce.":auth:".H($A2); 
      $respdig = KD(H($A1), $noncebit); 
     }else { 
      # FIX: handle error here 
     } 

     $base = 'Digest username="'.$user.'", realm="'; 
     $base .= $x['realm'].'", nonce="'.$x['nonce'].'",'; 
     $base .= ' uri="'.$uri.'", cnonce="'.$cnonce; 
     $base .= '", nc="'.$ncvalue.'", response="'.$respdig.'", qop="auth"'; 
     return $base; 
    } 

使用法:

# TEST 
$www_header = 'Digest realm="TEST", nonce="356f2dbb8ce08174009d53c6f02c401f", algorithm="MD5", qop="auth"'; 
print response($www_header, "user", "password", "POST", "/my_url_query"); 
+0

うーん。あなたは、www認証されたヘッダー、つまりnonceを取得する方法についてのポインタを与えることができますか?ありがとう! – roesslerj

+1

私はこれをちょっと検索しなければならなかったので、get_headers($ url)でwww-authenticateヘッダー(つまりnonce)を取得できます。 – roesslerj

1

既成のクライアントサイドのの実装がPHPで分かりません。あなたのスクリプトがリモートサーバーに認証されているかのように、the RFCを実装する必要があります。 Wikipedia's page on HTTP Digest has a nice example

(それはそんなに難しいことではありません - MD5のカップルはハッシュサーバー側を構築する際、私はenconteredいくつかの落とし穴:文字列の区切り文字は「」である(コロン)、リクエストメソッドもハッシュの一部です。)

+0

HTTPダイジェストの仕組みを知っています。さらに良くなるのはwikipediaより優れているRFC 2617(http://tools.ietf.org/html/rfc2617)ですが、これを処理できる関数/ライブラリが既に実装されています。 – Jiri

+0

@ジリ:あなたはそうだ、ソースに行った。何かが出てくるかどうかを見てみましょう。ダイジェストライブラリも私にとって役に立ちます。 – Piskvor

関連する問題