编写php应用程序实现摘要式身份验证的方法详解

前端技术 2023/09/05 PHP
通基本身份认证一样,也可以使用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;
}
?>

本文地址:https://www.stayed.cn/item/12570

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。