HTTP摘要在PHP中进行身份验证

Jir*_*iri 3 php authentication http

我想在PHP脚本中使用HTTP摘要授权对另一个站点进行身份验证.

我的函数作为参数只是WWW-Authenticate头的内容,我想生成正确的响应(授权头).我找到了很多例子来解释如何以另一种方式实现这一点(浏览器对我的脚本进行身份验证)但不是这种方式.我缺少能够解析WWW-Authenticate标头内容和生成响应的功能.是否有一些标准功能或公共库实现这一点?

Jir*_*iri 6

好的,还没有答案,我已经调查了在这里撒谎的python实现并将其重写为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;
    }
Run Code Online (Sandbox Code Playgroud)

用法:

# TEST
$www_header = 'Digest realm="TEST", nonce="356f2dbb8ce08174009d53c6f02c401f", algorithm="MD5", qop="auth"';
print response($www_header, "user", "password", "POST", "/my_url_query");
Run Code Online (Sandbox Code Playgroud)