• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

javascript – PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

php 搞代码 4年前 (2022-01-22) 24次浏览 已收录 0个评论
文章目录[隐藏]

<body>

php摘要认证(digest)firefox 中 或 ie浏览器 中都能够正常弹出认证窗口,但是在 chrome内核的浏览器(例如:360安全浏览器) 中无法弹出认证窗口(广告过滤插件等已经关掉了)。

<code>PHP 代码:    $realm  = 'ftl.com';    $qop    = 'auth';    $nonce  = md5(time());    header('WWW-Authenticate: Digest realm=' . $realm . ' qop=' . $qop . ' nonce=' . $nonce);    header('HTTP/1.1 401 Unauthorized');    echo '你取消了验证!';    exit;</code>

上面这段代码在 360安全浏览器中 显示:

查看头部信息:

Request Headers 中没有 Authorization 头的相关信息。

然而在 firefox本文@来#源gaodai$ma#com搞$$代**码网搞代gaodaima码 中同一段代码的显示界面如下:

验证成功后查看头部信息如下:

在请求头中也有 Authorization 头。

怎样在 chrome 内核的浏览器中完成 digest 认证(PHP 官网教程的代码在也会出现这个问题)??

最后,贴出完整的测试代码:

Javscript 部分:

<code>var url = 'php/xhr.php';var xhr = new XMLHttpRequest();xhr.open('post' , url , true , 'test' , '123456');xhr.setRequestHeader('Content-Type' , 'Application/x-www-form-urlencoded');xhr.send(null);xhr.onload = function(){    console.log('服务端反馈会数据:' , this.response);}</code>

PHP 部分:

<code>$users = array('test' => '123456');if (!isset($_SERVER['PHP_AUTH_DIGEST'])) {    authenticate();    exit;}$digest = explode(',' , trim_all($_SERVER['PHP_AUTH_DIGEST'] , true));$rel = array();array_walk($digest , function($val){    global $rel;    $arr = explode('=' , $val);    $rel[$arr[0]] = $arr[1];    unset($arr);});unset($digest);// 安全部分$secure_part = $rel['username'] . ':' . $rel['realm'] . ':' . $users[$rel['username']];// 报文部分$header_part = $_SERVER['REQUEST_METHOD'] . ':' . $rel['uri'];// 摘要计算$response = md5($secure_part) . ':' . $rel['nonce'] . ':' . $rel['nc'] . ':' . $rel['cnonce'] . ':' . $rel['qop'] . ':' . md5($header_part);$response = md5($response);// 验证if ($rel['response'] === $response) {    echo '验证成功!';} else {    //authenticate();    echo '验证失败!';}// 认证函数function authenticate(){    $realm  = 'ftl.com';    $qop    = 'auth';    $nonce  = md5(time());    header('WWW-Authenticate: Digest realm=' . $realm . ' qop=' . $qop . ' nonce=' . $nonce);    header('HTTP/1.1 401 Unauthorized');    echo '你取消了验证!';    exit;}/* * 过滤 * 基本过滤:空格 \r \n 字符串 * 加强过滤:单引号 双引号 */function trim_all($str = '' , $isStripQuote = false){    $str = preg_replace('/^( |\r|\n)+/'       ,  ''   , $str);    $str = preg_replace('/( |\r|\n)+$/'       ,  ''   , $str);    $str = preg_replace('/(\W)( |\r|\n)+/' ,  '$1' , $str);    $str = preg_replace('/( |\r|\n)+(\W)/' ,  '$2' , $str);    if ($isStripQuote) {        $str = preg_replace('/"|\'/' , '' , $str);    }    return $str;}</code>

回复内容:

<body>

php摘要认证(digest)firefox 中 或 ie浏览器 中都能够正常弹出认证窗口,但是在 chrome内核的浏览器(例如:360安全浏览器) 中无法弹出认证窗口(广告过滤插件等已经关掉了)。

<code>PHP 代码:    $realm  = 'ftl.com';    $qop    = 'auth';    $nonce  = md5(time());    header('WWW-Authenticate: Digest realm=' . $realm . ' qop=' . $qop . ' nonce=' . $nonce);    header('HTTP/1.1 401 Unauthorized');    echo '你取消了验证!';    exit;</code>

上面这段代码在 360安全浏览器中 显示:

查看头部信息:

Request Headers 中没有 Authorization 头的相关信息。

然而在 firefox 中同一段代码的显示界面如下:

验证成功后查看头部信息如下:

在请求头中也有 Authorization 头。

怎样在 chrome 内核的浏览器中完成 digest 认证(PHP 官网教程的代码在也会出现这个问题)??

最后,贴出完整的测试代码:

Javscript 部分:

<code>var url = 'php/xhr.php';var xhr = new XMLHttpRequest();xhr.open('post' , url , true , 'test' , '123456');xhr.setRequestHeader('Content-Type' , 'Application/x-www-form-urlencoded');xhr.send(null);xhr.onload = function(){    console.log('服务端反馈会数据:' , this.response);}</code>

PHP 部分:

<code>$users = array('test' => '123456');if (!isset($_SERVER['PHP_AUTH_DIGEST'])) {    authenticate();    exit;}$digest = explode(',' , trim_all($_SERVER['PHP_AUTH_DIGEST'] , true));$rel = array();array_walk($digest , function($val){    global $rel;    $arr = explode('=' , $val);    $rel[$arr[0]] = $arr[1];    unset($arr);});unset($digest);// 安全部分$secure_part = $rel['username'] . ':' . $rel['realm'] . ':' . $users[$rel['username']];// 报文部分$header_part = $_SERVER['REQUEST_METHOD'] . ':' . $rel['uri'];// 摘要计算$response = md5($secure_part) . ':' . $rel['nonce'] . ':' . $rel['nc'] . ':' . $rel['cnonce'] . ':' . $rel['qop'] . ':' . md5($header_part);$response = md5($response);// 验证if ($rel['response'] === $response) {    echo '验证成功!';} else {    //authenticate();    echo '验证失败!';}// 认证函数function authenticate(){    $realm  = 'ftl.com';    $qop    = 'auth';    $nonce  = md5(time());    header('WWW-Authenticate: Digest realm=' . $realm . ' qop=' . $qop . ' nonce=' . $nonce);    header('HTTP/1.1 401 Unauthorized');    echo '你取消了验证!';    exit;}/* * 过滤 * 基本过滤:空格 \r \n 字符串 * 加强过滤:单引号 双引号 */function trim_all($str = '' , $isStripQuote = false){    $str = preg_replace('/^( |\r|\n)+/'       ,  ''   , $str);    $str = preg_replace('/( |\r|\n)+$/'       ,  ''   , $str);    $str = preg_replace('/(\W)( |\r|\n)+/' ,  '$1' , $str);    $str = preg_replace('/( |\r|\n)+(\W)/' ,  '$2' , $str);    if ($isStripQuote) {        $str = preg_replace('/"|\'/' , '' , $str);    }    return $str;}</code>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:javascript – PHP http Digest认证在 chrome 内核浏览器中不弹出认证框怎么解决??

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址