参考:https://qiita.com/mpyw/items/bb8305ba196f5105be15

function BasicAuth()
{
    // パスワードとIDのリスト(パスワードはハッシュ化したもの)
    $list = [
        'user' => 'password',
    ];

    if (
        !isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) ||
        !password_verify(
            $_SERVER['PHP_AUTH_PW'],
            isset($list[$_SERVER['PHP_AUTH_USER']])
                ? $list[$_SERVER['PHP_AUTH_USER']]
                : '$2y$10$abcdefghijklmnopqrstuv' // ユーザ名が存在しないときだけ極端に速くなるのを防ぐ
        )
    ) {
        // 初回時または認証が失敗したとき
        header('WWW-Authenticate: Basic realm="Enter username and password."');
        header('Content-Type: text/plain; charset=utf-8');
        exit('認証失敗');
    }
}

ちなみによく聞くのが、生のパスワードをその送信するとかで、望ましくないとされているが、HTTPS環境であれば、暗号化されるため問題ない。