Pode-se utilizar a função
header() para enviar uma mensagem de "Authentication Required"
para o navegador cliente, causando o aparecimento de uma janela para a entrada de Nome de Usuário/Senha.
Uma vez que o usuário preencha um nome de usuário e uma senha,
a URL contendo o script PHP será chamada mais uma vez com as
variáveis predefinidas
PHP_AUTH_USER, PHP_AUTH_PW,
e AUTH_TYPE para determinar o nome de usuário, senha e
tipo da autenticação, respectivamente. Estas variáveis predefinidas são encontradas
no array $_SERVER. Somente
o métodos de autenticação "Basic" é suportado. Consulte a função
header() para mais informação.
Um exemplo de fragmento de script que forçaria a autenticação do cliente em uma página:
Exemplo #1 Exemplo de Autenticação HTTP "Basic"
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Texto enviado caso o usuário clique no botão Cancelar';
exit;
} else {
echo "<p>Olá, {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Você digitou {$_SERVER['PHP_AUTH_PW']} como sua senha.</p>";
}
?>Nota: Nota sobre compatibilidade
Por favor, seja cauteloso ao codificar as linhas do cabeçalho HTTP. Para garantir máxima compatibilidade com todos os clientes, a palavra-chave "Basic" deve ser escrita com um "B" maiúsculo, a string realm deve ser envolvida por aspas duplas (nunca por aspas simples), e apenas um espaço deve preceder o código 401 na linha do cabeçalho HTTP/1.0 401. Parâmetros de autenticação precisam ser separados por vírgula.
Ao invés de simplesmente exibir PHP_AUTH_USER e PHP_AUTH_PW, como no exemplo acima, talvez queira verificar a validade do nome de usuário e senha. Talvez enviando uma consulta a um banco de dados, ou procurando o usuário em um arquivo dbm.
Cuidado com navegadores Internet Explorer bugados por aí. Eles
parecem muito minuciosos sobre a ordem dos cabeçalhos. Enviar
o cabeçalho WWW-Authenticate antes do
cabeçalho HTTP/1.0 401 parece resolver isso
por enquanto.
Nota: Nota de configuração
PHP usa uma diretiva chamada
AuthTypepara determinar se a autenticação externa está em efeito.
Perceba, entretanto, que a diretiva citada acima não previne que alguém que controle uma URL não autenticada roube senhas de URLs autenticadas no mesmo servidor.
Tanto o Netscape Navigator quanto o Internet Explorer apagarão o cache de autenticação da janela local do navegador para o realm após receber uma resposta 401 do servidor. Isso pode efetivamente "deslogar" um usuário, forçando o mesmo a re-entrar seu nome de usuário e senha. Algumas pessoas usam isso para delimitar o tempo de um login, ou prover um botão de "log-out".
Exemplo #2 Exemplo de Autenticação HTTP forçando um novo nome/senha
<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "Você deve digitar um login e senha válidos para acessar este recurso\n";
exit;
}
if (!isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
} else {
echo "<p>Bem-vindo: " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
echo "Antigo: " . htmlspecialchars($_REQUEST['OldAuth']);
echo "<form action='' method='post'>\n";
echo "<input type='hidden' name='SeenBefore' value='1' />\n";
echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
echo "<input type='submit' value='Re-autenticar' />\n";
echo "</form></p>\n";
}
?>
Este comportamento não é requerido pelo padrão de autenticação HTTP Basic,
então nunca se deve depender dele. Testes com
Lynx tem mostrado que Lynx não apaga
as credenciais de autenticação com uma resposta 401 do servidor, assim, ao pressionar "Voltar"
e então "Ir" novamente abrirá o recurso contanto que os requerimento de credenciais
não tenha mudado. Contudo, o usuário pode pressionar a tecla
'_' para apagar suas informações de autenticação.
Para fazer com que a autenticação HTTP funcione utilizando um servidor IIS com a versão CGI
do PHP é necessário editar a configuração "Directory Security" do IIS.
Clique em "Edit" e marque somente
"Anonymous Access",
deixe todos os outros campos desmarcados.
Nota: Nota sobre IIS:
Para que a autenticação HTTP funcione com IIS, a diretiva do PHP cgi.rfc2616_headers deve ser definida como0(o valor default).