Como suprimir do navegador “autenticação necessária” diálogo ao fazer uma chamada de ajax que requer autenticação?

StackOverflow https://stackoverflow.com/questions/1626919

  •  06-07-2019
  •  | 
  •  

Pergunta

Os meus usuários inserir um nome de usuário e senha para um serviço de terceiros. Eu faço uma chamada ajax para esse serviço para autenticá-los. A questão é que, se eles entram no nome de usuário errado e senha do navegador (pelo menos firefox) exibirá uma "autenticação necessária" diálogo. Se eles, em seguida, digite o nome de usuário e senha correta naquele diálogo, minha chamada ajax irá retornar um "sucesso", e ela vai aparecer que o usuário original / pass eles entraram estava correta, quando não é (uma vez que eles mudaram-lo).

Existe alguma maneira, quer suprimir este diálogo (para que eu possa, em seguida, ter o meu serviço de dizer-lhes para corrigir o seu user / pass) ou de alguma forma pegar o nome de usuário correto ea senha que o usuário digitou na caixa de diálogo navegadores? Esta é uma extensão do Firefox .. então eu tenho certeza que há alguma maneira de agarrar a correta passagem / login do pedido .. Mas seria bom se houvesse um método mais simples via javascript.

jQuery.ajax({
  type: "GET",
  dataType: "xml",
  url: endpoint,
  username: username,
  password: password,
  success: function(data,status) {
    // Do something
  },
  error: function(XMLHttpRequest, textStatus, errorThrown){
    alert(errorThrown);
  }
});
Foi útil?

Solução

Eu já resolveu este problema, colocando um proxy entre o navegador eo serviço que requer autenticação, no meu caso, um servlet java. O navegador envia o pedido de AJAX para o servlet, que encaminha a solicitação para o serviço, em seguida, envia de volta a resposta dos serviços, omitindo o cabeçalho 'WWW-Authenticate'. Seu aplicativo browser. lida com o HTTP 200 ou 401 código de resposta em conformidade.

Da mesma forma, o proxy pode sempre retornar um 200 com uma resposta json indicando os resultados da solicitação encaminhada. Desta forma, você pode discernir a diferença entre um fracasso de seu proxy e a resposta do serviço.

Uma coisa complicada você pode ter que lidar com - se os far-end responde serviço com um cabeçalho set-cookie de, digamos, porque criou uma sessão para seu cliente, então você tem (pelo menos) 2 caminhos possíveis a tomar.

  1. seu proxy vai lembrar o cookie, app seu browser. sempre vai através do proxy para este serviço, e o proxy adiciona esse cookie às solicitações encaminhadas subseqüentes. ou
  2. você ignorar o cookie do serviço, e ter o navegador re-autenticar diretamente com o serviço assim que tiver verificado o nome de usuário e senha através do proxy. Embora este pode ter o efeito colateral de criar uma sessão órfão com o serviço

Outras dicas

Em vez da url cadeia de ser " http://blah.com ", torná-lo " http: // utilizador: password@blah.com "

// Note that you might need to trim http:// out of endpoint first
url: 'http://' + username + ':' + password + '@' + endpoint,

Sem jQuery (não funciona no IE, mas que é OK para um extensões do Firefox):

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://example.com", true, "username", "password");
xhr.onreadystatechange = function(){
  if(this.readyState == 4){
    if(this.status == 200){
      alert("we got a response");
    }
  }
}
xhr.send();

Como sobre não usar autenticação HTTP? Use um login padrão com cookies, ou simplesmente postar o nome de usuário / senha o usuário fornece para o script e verificar os detalhes contra um banco de dados de usuários.

Você não pode fazê-lo no IE ou Firefox, e você nunca será capaz de partir javascript por razões de segurança. Não há nenhuma configuração do navegador que permite que o usuário evite se for solicitado http autenticação. Isto torna-se verdadeiro chato quando você tem 50 imagens tudo exigindo http autenticação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top