编写php应用程序实现摘要式身份验证的方法详解
程序员文章站
2023-04-07 17:33:04
通基本身份认证一样,也可以使用php网页处理http请求报头字段来匹配摘要式身份验证信息。例如下边的代码使用header()函数要求客户端使用digest验证,它在http...
通基本身份认证一样,也可以使用php网页处理http请求报头字段来匹配摘要式身份验证信息。例如下边的代码使用header()函数要求客户端使用digest验证,它在http消息报头中增加了一个www-authenticate字段:
header('www-authenticate:digest realm="myrealm",nonce="47alf7cf25ce7",algorithm=md5,qop="auth"');
--------------------------------------------------------------------------------
下边代码描述的是一个使用摘要式身份验证的网页(首先取消apache验证配置)。
<?php
$realm="myrealm";
//如果没有验证信息,则发送报头要求浏览器使用摘要式身份验证
if(!isset($_server['php_auth_digest'])){
header("www-authenticate:digest realm=/"$realm/",nonce=/"".uniqid()."/",algorithm=md5,qop=/"auth/"");
header("http/1.0 401 unauthorization required");
echo "账号/密码错误!";
exit;
}else{
//使用函数http_digest_parse解析验证信息
$data=http_digest_parse($_server["php_auth_digest"]);
if(!$data){
header("http/1.0 401 unauthorization required");
echo "账号/密码错误!";
exit;
}else{
//根据http协议,自己构建一个response值
$a1=md5('admin:'.$realm.':password');
$a2=md5($_server['request_method'].':'.$data['uri']);
$valid_response=
md5($a1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$a2);}
//将自己构建的response值与浏览器构建并发送过来的response值对比,如果相同那么就证明用户名和密码输入是正确的
if($data['response']==$valid_response){
echo "验证通过!";
}else{
header("http/1.0 401 unauthorization required");
echo("账号/密码错误!");
exit;
}
}
function http_digest_parse($digest_str){
$needed_parts=array('nonce'=>1,'nc'=>1,'cnonce'=>1,'qop'=>1,'username'=>1,'uri'=>1,'response'=>1);
//使用正则表达式解析authorization报头的内容
preg_match_all('@(/w+)=([/'"]?)([a-za-z0-9=.//_-]+)/2@',$digest_str,$result,preg_set_order);
//将结果填充$data数组,并返回
$data=array();
foreach($result as $m){
$data[$m[1]]=$m[3];
unset($needed_parts[$m[1]]);
}
return $needed_parts?false:$data;
}
?>
header('www-authenticate:digest realm="myrealm",nonce="47alf7cf25ce7",algorithm=md5,qop="auth"');
--------------------------------------------------------------------------------
下边代码描述的是一个使用摘要式身份验证的网页(首先取消apache验证配置)。
复制代码 代码如下:
<?php
$realm="myrealm";
//如果没有验证信息,则发送报头要求浏览器使用摘要式身份验证
if(!isset($_server['php_auth_digest'])){
header("www-authenticate:digest realm=/"$realm/",nonce=/"".uniqid()."/",algorithm=md5,qop=/"auth/"");
header("http/1.0 401 unauthorization required");
echo "账号/密码错误!";
exit;
}else{
//使用函数http_digest_parse解析验证信息
$data=http_digest_parse($_server["php_auth_digest"]);
if(!$data){
header("http/1.0 401 unauthorization required");
echo "账号/密码错误!";
exit;
}else{
//根据http协议,自己构建一个response值
$a1=md5('admin:'.$realm.':password');
$a2=md5($_server['request_method'].':'.$data['uri']);
$valid_response=
md5($a1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$a2);}
//将自己构建的response值与浏览器构建并发送过来的response值对比,如果相同那么就证明用户名和密码输入是正确的
if($data['response']==$valid_response){
echo "验证通过!";
}else{
header("http/1.0 401 unauthorization required");
echo("账号/密码错误!");
exit;
}
}
function http_digest_parse($digest_str){
$needed_parts=array('nonce'=>1,'nc'=>1,'cnonce'=>1,'qop'=>1,'username'=>1,'uri'=>1,'response'=>1);
//使用正则表达式解析authorization报头的内容
preg_match_all('@(/w+)=([/'"]?)([a-za-z0-9=.//_-]+)/2@',$digest_str,$result,preg_set_order);
//将结果填充$data数组,并返回
$data=array();
foreach($result as $m){
$data[$m[1]]=$m[3];
unset($needed_parts[$m[1]]);
}
return $needed_parts?false:$data;
}
?>
上一篇: 深入PHP curl参数的详解
下一篇: 探讨方法的重写(覆载)详解