HTTP身份验证无法启用CGI

时间:2015-06-22 12:08:58

标签: php .htaccess authentication

我使用PHP documentation中提供的示例#2使用HTTP身份验证 我已经成功配置了脚本,现在我可以使用我定义的凭据通过HTTP登录。但是如果在我的MAMP中我将模式从Identical PHP version for all hosts (module)切换到Individual PHP version for every host (CGI),即使用户名和密码正确,脚本也会无限地询问我是否有正确的用户名和密码。

enter image description here

为什么会这样?

1 个答案:

答案 0 :(得分:0)

在阅读了几十页有关此问题的内容后,我得出结论,使用CGI进行HTTP摘要身份验证没有解决方法。

但是,如果您能够使用HTTP基本身份验证,则有一种解决方法。所以我在Server API运行CGI的情况下实现了异常,并在服务器运行Apache Module时保留了我的摘要式身份验证。

我已经关注了@sanderbee提供的linklink也帮助了我。

使用预定义的常量PHP_SAPI我设法检查Server API是否正在运行CGI,如果是,我运行基本的HTTP身份验证:

function admin_digest_auth(){
    if (substr(PHP_SAPI, 0, 3) == 'cgi') {
        return admin_basic_auth();
    }

    // You HTTP Digest authentication code ...
}

function admin_basic_auth(){
    // split the user/pass parts
    if(isset($_SERVER['REDIRECT_HTTP_AUTH']) && !empty($_SERVER['REDIRECT_HTTP_AUTH'])){
        list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = 
            explode(':' , base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTH'], 6)));
    }

    // open a user/pass prompt
    if (!isset($_SERVER['PHP_AUTH_USER'])) {
        header('WWW-Authenticate: Basic realm="My Realm"');
        header('HTTP/1.0 401 Unauthorized');

        exit('Unauthorized');

    // validate submited user / pass
    } else {
        if($_SERVER['PHP_AUTH_USER'] !== 'admin' ||
            $_SERVER['PHP_AUTH_PW'] !== 'mypassword'){
            header('HTTP/1.1 401 Unauthorized');
            admin_basic_auth();
        }
    }
    return TRUE;
}

总而言之,您必须在.htaccess

中添加此行
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTH:%{HTTP:Authorization},L]