Аутентификация PHP (новичок) - PullRequest
2 голосов
/ 07 января 2012

Я недавно начал изучать PHP. Я сделал простой веб-сайт и хотел в основном его пароль. Буду признателен, если кто-нибудь скажет мне, почему это не работает. Я знаю, что это не работает, потому что я попробовал это; Я просто не понимаю, почему.

<?php
$user='user';
$pass='pass';

header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm='.'hello');
if($_SERVER['PHP_AUTH_USER']==$user && $_SERVER['PHP_AUTH_PW']==$pass)
    echo 'Authorized';
else
    exit('Exiting');
?>
...
REST OF WEBSITE
...

Я знаю, что «правильный» способ сделать это так:

<?php
if(!isset($_SERVER['PHP_AUTH_USER']))
{
     header('HTTP/1.1 401 Unauthorized');
     header('WWW-Authenticate: Basic realm='.'hello');
     exit('Exiting');
}
else
{
    $user='user';
    $pass='pass';
    if($_SERVER['PHP_AUTH_USER']==$user && $_SERVER['PHP_AUTH_PW']==$pass)
        echo 'Authorized';
    else
    {
        header('HTTP/1.1 401 Unauthorized');
        header('WWW-Authenticate: Basic realm='.'hello');
        exit('Exiting');
    }
}
?>
REST OF WEBSITE

Буду признателен, если кто-нибудь хотя бы укажет мне правильное направление.

Ответы [ 2 ]

3 голосов
/ 07 января 2012

При использовании HTTP-аутентификации ваш скрипт запускается дважды: в первый раз $_SERVER['PHP_AUTH_USER'] сбрасывается, и вы должны сообщить браузеру, что страница требует аутентификации.Затем браузер перезагрузит страницу, хотя на этот раз $_SERVER['PHP_AUTH_USER'] содержит имя пользователя и $_SERVER['PHP_AUTH_PW'] пароль, предоставленный пользователем.Если это совпадает с правильными учетными данными ($user и $pass), вы отправите страницу в браузер.

Ваш код не различает эти два случая и, таким образом, сообщит браузеручто ему требуются имя пользователя и пароль, даже если правильные учетные данные уже отправлены.

3 голосов
/ 07 января 2012

Используя эту строку:

header('HTTP/1.1 401 Unauthorized');

сообщит браузеру, что запрос не выполнен.Поскольку вы используете его для каждого запроса, каждый запрос терпит неудачу.

Вот почему во втором примере он выполняется не всегда, а только условно.

Я создал небольшой демонстрационный пример .Появится окно входа в браузер, вы можете ввести все, что захотите, и нажать «Отмена», если хотите больше не отображать поле входа.

Затем вы увидите, какие данные предоставлены PHP-сценарию.

...