1. 程式人生 > >PHP獲取AUTHORIZATION認證驗證

PHP獲取AUTHORIZATION認證驗證

做介面認證的時候,我們可能會用到自定義header頭Authorization。 我們都知道php的自定義頭資訊都可以使用$SERVER['HTTP*']來獲取,如header('test: wzhtest');獲取的時候,我們可以使用$_SERVER['HTTP_TEST']來獲取。

  • 這裡說明下。Authorization可能是個例外。nginx沒問題,但是Apache下可能會出現一個問題。那就是我們使用$_SERVER['HTTP_AUTHORIZATION']可能就獲取不到值。

Apache伺服器下,我們需要開啟rewrite_module模組,然後編輯.htaccess檔案,在上面加入

#Authorization Headers
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

如果沒有開啟過rewrite_module模組,我們需要新建.htaccess 內容如下:

Options +FollowSymlinks -Multiviews
RewriteEngine On
#Authorization Headers
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

通過下面的方法我們可以相容的處理:

public function getBasicAuthorized(){
        $UserName = '';
        $PassWord = '';

        //Apache伺服器
        if (isset($_SERVER['PHP_AUTH_USER'])) {
            $UserName = $_SERVER['PHP_AUTH_USER'];
            $PassWord = $_SERVER['PHP_AUTH_PW'];
        }elseif(isset($_SERVER['HTTP_AUTHORIZATION'])){//其他伺服器如 Nginx  Authorization
            if (strpos(strtolower($_SERVER['HTTP_AUTHORIZATION']), 'basic') === 0) {
                $Authorization = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
                $UserName = isset($Authorization[0])?$Authorization[0]:'';
                $PassWord = isset($Authorization[1])?$Authorization[1]:0;
            }
        }

        return array($UserName,$PassWord);
    }