Qual é a maneira correta de sair da pasta protegida por autenticação HTTP?
Existem soluções alternativas que podem conseguir isso, mas são potencialmente perigosas porque podem ser de buggy ou não funcionam em determinadas situações / navegadores. É por isso que estou procurando uma solução correta e limpa.
php
authentication
.htaccess
http-headers
password-protection
Josef Sábl
fonte
fonte
Miscellaneous -> Clear Private Data -> HTTP Authentication
Respostas:
Mu. Não existe uma maneira correta , nem mesmo uma consistente entre os navegadores.
Este é um problema que vem da especificação HTTP (seção 15.6):
Por outro lado, a seção 10.4.2 diz:
Em outras palavras, você poderá mostrar a caixa de login novamente (como diz @Karsten ), mas o navegador não precisa atender à sua solicitação - portanto, não dependa muito desse recurso.
fonte
Método que funciona bem no Safari. Também funciona no Firefox e Opera, mas com um aviso.
Isso indica ao navegador para abrir o URL com o novo nome de usuário, substituindo o anterior.
fonte
user:password@host
foi preterido. Usar apenashttp://[email protected]/
não é e deve funcionar na maioria dos casos.A resposta simples é que você não pode efetuar logoff confiável da autenticação http.
A resposta longa:
Http-auth (como o restante da especificação HTTP) deve ser sem estado. Portanto, estar "logado" ou "desconectado" não é realmente um conceito que faça sentido. A melhor maneira de ver isso é perguntando, para cada solicitação HTTP (e lembre-se de que o carregamento de uma página é geralmente várias solicitações), "você tem permissão para fazer o que está solicitando?". O servidor vê cada solicitação como nova e não relacionada a nenhuma solicitação anterior.
Os navegadores optaram por lembrar as credenciais que você lhes diz no primeiro 401 e reenviá-las sem a permissão explícita do usuário em solicitações subsequentes. Esta é uma tentativa de fornecer ao usuário o modelo "logado / desconectado" que eles esperam, mas é puramente um clamor. É o navegador que simula essa persistência de estado. O servidor web desconhece completamente isso.
Portanto, "fazer logoff", no contexto de http-auth, é puramente uma simulação fornecida pelo navegador e, portanto, fora da autoridade do servidor.
Sim, existem julgamentos. Mas eles quebram o RESTfulness (se isso é de valor para você) e não são confiáveis.
Se você precisar absolutamente de um modelo de logon / logoff para a autenticação do site, a melhor opção é um cookie de rastreamento, com a persistência do estado armazenado no servidor de alguma maneira (mysql, sqlite, flatfile etc.). Isso exigirá que todas as solicitações sejam avaliadas, por exemplo, com PHP.
fonte
Gambiarra
Você pode fazer isso usando Javascript:
O que é feito acima é:
para IE - limpe o cache de autenticação e redirecione para algum lugar
para outros navegadores - envie um XMLHttpRequest nos bastidores com o nome e a senha de logout 'logout'. Precisamos enviá-lo para algum caminho que retorne 200 OK a essa solicitação (ou seja, não deve exigir autenticação HTTP).
Substitua
'/where/to/redirect'
por algum caminho para redirecionar após o logout e substitua'/path/that/will/return/200/OK'
por algum caminho no seu site que retornará 200 OK.fonte
Solução alternativa (não uma solução limpa, agradável (ou mesmo funcionando! Veja comentários)):
Desative suas credenciais uma vez.
Você pode mover sua lógica de autenticação HTTP para PHP enviando os cabeçalhos apropriados (se não estiver logado):
E analisando a entrada com:
Portanto, desabilitar suas credenciais uma vez deve ser trivial.
fonte
Efetue logout do HTTP Basic Auth em duas etapas
Digamos que eu tenha um domínio HTTP Basic Auth chamado “Password protected” e Bob esteja logado. Para fazer logout, faço 2 solicitações AJAX:
WWW-Authenticate: Basic realm="Password protected"
Nesse ponto, o navegador esqueceu as credenciais de Bob.
fonte
Minha solução para o problema é a seguinte. Você pode encontrar a função
http_digest_parse
,$realm
e$users
no segundo exemplo desta página: http://php.net/manual/en/features.http-auth.php .fonte
Normalmente, depois que um navegador solicita credenciais ao usuário e as fornece a um site específico, ele continuará fazendo isso sem avisar. Diferente das várias maneiras pelas quais você pode limpar os cookies no lado do cliente, não conheço uma maneira semelhante de solicitar ao navegador que esqueça as credenciais de autenticação fornecidas.
fonte
Trac - por padrão - também usa autenticação HTTP. Logout não funciona e não pode ser corrigido:
De: http://trac.edgewall.org/ticket/791#comment:103
Parece que não há resposta para a pergunta, esse problema foi relatado há sete anos e faz todo o sentido: o HTTP é sem estado. Uma solicitação é feita com credenciais de autenticação ou não. Mas isso é uma questão de o cliente enviar a solicitação, não o servidor que a recebe. O servidor pode apenas dizer se um URI de solicitação precisa de autorização ou não.
fonte
Eu precisava redefinir a autorização .htaccess, então usei isso:
Encontre-o aqui: http://php.net/manual/en/features.http-auth.php
Vai saber.
Várias soluções residem nessa página e até aparecem na parte inferior: Lynx, não limpa a autenticação como outros navegadores;)
Eu testei nos meus navegadores instalados e, uma vez fechados, cada navegador parece exigir consistentemente uma nova tentativa de reentrada.
fonte
WWW-Authenticate
problema estava causando o problema e a remoção automática do meu logout.WWW-Authenticate
problema durante a correção do problema em um navegador (Chrome) faz com que outro navegador (Firefox) lembre das credenciais e as envie na próxima solicitação, resultando em um novo login automático! Argh!Esta pode não ser a solução que foi procurada, mas eu a resolvi assim. Eu tenho 2 scripts para o processo de logout.
logout.php
log.php
Dessa forma, não recebo um aviso e minha sessão é encerrada
fonte
AFAIK, não há uma maneira limpa de implementar uma função de "logout" ao usar a autenticação htaccess (isto é, baseada em HTTP).
Isso ocorre porque essa autenticação usa o código de erro HTTP '401' para informar ao navegador que credenciais são necessárias; nesse momento, o navegador solicita ao usuário os detalhes. A partir de então, até o navegador ser fechado, ele sempre enviará as credenciais sem aviso prévio.
fonte
A melhor solução que encontrei até agora é (é uma espécie de pseudo-código, o
$isLoggedIn
pseudo-variável is para http auth):No momento do "logout", basta armazenar algumas informações na sessão dizendo que o usuário está realmente desconectado.
No local em que verifico a autenticação, expanda a condição:
A sessão está um pouco vinculada ao estado de autenticação http, para que o usuário permaneça desconectado enquanto mantiver o navegador aberto e enquanto a autenticação http persistir no navegador.
fonte
Talvez eu esteja perdendo o objetivo.
A maneira mais confiável que encontrei para encerrar a autenticação HTTP é fechar o navegador e todas as janelas do navegador. Você pode fechar uma janela do navegador usando Javascript, mas acho que não pode fechar todas as janelas do navegador.
fonte
A única maneira eficaz que encontrei de eliminar as credenciais
PHP_AUTH_DIGEST
ouPHP_AUTH_USER
ANDPHP_AUTH_PW
é chamar o cabeçalhoHTTP/1.1 401 Unauthorized
.fonte
Enquanto os outros estão certos ao dizer que é impossível fazer logout da autenticação http básica, existem maneiras de implementar a autenticação que se comporta de maneira semelhante. Uma abordagem óbvia é usar auth_memcookie . Se você realmente deseja implementar a autenticação HTTP básica (por exemplo, use as caixas de diálogo do navegador para fazer login em um formulário HTTP) usando isso - basta definir a autenticação para um diretório protegido .htaccess separado contendo um script PHP que redireciona de volta para onde o usuário veio depois criando a sessão do memcache.
fonte
Há muitas respostas ótimas - complexas - aqui. No meu caso particular, encontrei uma correção limpa e simples para o logout. Ainda tenho que testar no Edge. Na minha página em que efetuei login, coloquei um link de logoff semelhante a este:
E na cabeça dessa página logout.html (que também é protegida pelo .htaccess), tenho uma atualização de página semelhante a esta:
Onde você deixaria as palavras "logout" no lugar para limpar o nome de usuário e a senha em cache do site.
Admito que, se várias páginas precisassem poder fazer login diretamente desde o início, cada um desses pontos de entrada precisaria de sua própria página logout.html correspondente. Caso contrário, você poderá centralizar o logout, introduzindo uma etapa adicional do gatekeeper no processo antes do prompt de login real, exigindo a entrada de uma frase para alcançar o destino do logon.
fonte