Parece que implementar a autenticação HTTP básica com Express v3 era trivial:
app.use(express.basicAuth('username', 'password'));
A versão 4 (estou usando a 4.2) removeu o basicAuth
middleware, então estou um pouco preso. Eu tenho o seguinte código, mas não faz com que o navegador solicite ao usuário as credenciais, que é o que eu gostaria (e o que imagino que o método antigo fizesse):
app.use(function(req, res, next) {
var user = auth(req);
if (user === undefined || user['name'] !== 'username' || user['pass'] !== 'password') {
res.writeHead(401, 'Access invalid for user', {'Content-Type' : 'text/plain'});
res.end('Invalid credentials');
} else {
next();
}
});
Respostas:
Autenticação básica simples com JavaScript vanilla (ES6)
nota: este "middleware" pode ser usado em qualquer manipulador. Basta remover
next()
e inverter a lógica. Veja o exemplo de 1 afirmação abaixo ou o histórico de edição desta resposta.Por quê?
req.headers.authorization
contém o valor "Basic <base64 string>
", mas também pode estar vazio e não queremos que falhe, daí a estranha combinação de|| ''
atob()
ebtoa()
, portanto, oBuffer
ES6 -> ES5
const
é apenasvar
.. tipo de(x, y) => {...}
é apenasfunction(x, y) {...}
const [login, password] = ...split()
está apenas doisvar
trabalhos em umfonte de inspiração (usa pacotes)
O exemplo acima é um exemplo super simples que foi planejado para ser super curto e rapidamente implantado em seu servidor de playground. Mas, como foi apontado nos comentários, as senhas também podem conter caracteres de dois pontos
:
. Para extraí-lo corretamente do b64auth , você pode usar isso.Autenticação básica em uma declaração
... por outro lado, se você usa apenas um ou poucos logins, este é o mínimo necessário: (você nem mesmo precisa analisar as credenciais)
PS: você precisa ter caminhos "seguros" e "públicos"? Considere usar em seu
express.router
lugar.fonte
.split(':')
porque ele irá engasgar com senhas que contenham pelo menos dois pontos. Essas senhas são válidas de acordo com RFC 2617 .const [_, login, password] = strauth.match(/(.*?):(.*)/) || []
para a parte dos dois pontos.!==
para comparar senhas deixa você vulnerável a ataques de sincronização. en.wikipedia.org/wiki/Timing_attack certifique-se de usar uma comparação de string de tempo constante.Buffer.from() // for strings
ouBuffer.alloc() // for numbers
asBuffer()
está obsoleto devido a problemas de segurança.TL; DR:
☒
express.basicAuth
se foi☒
basic-auth-connect
está obsoleto☒
basic-auth
não tem nenhuma lógica☒
http-auth
é um exagero☑
express-basic-auth
é o que você querMais informações:
Como você está usando o Express, pode usar o
express-basic-auth
middleware.Veja a documentação:
Exemplo:
fonte
challenge: true
opçãoMuito do middleware foi retirado do núcleo do Express na v4 e colocado em módulos separados. O módulo de autenticação básico está aqui: https://github.com/expressjs/basic-auth-connect
Seu exemplo só precisa mudar para este:
fonte
basic-auth
biblioteca nesta respostaUsei o código do original
basicAuth
para encontrar a resposta:fonte
Mudei no express 4.0 a autenticação básica com http-auth , o código é:
fonte
Parece haver vários módulos para fazer isso, alguns estão obsoletos.
Este parece ativo:
https://github.com/jshttp/basic-auth
Aqui está um exemplo de uso:
Certifique-se de colocar o
auth
middleware no lugar correto, qualquer middleware anterior não será autenticado.fonte
implement
do protocolo (também conhecido como enviar cabeçalho correto)Podemos implementar a autorização básica sem precisar de nenhum módulo
Fonte: - http://www.dotnetcurry.com/nodejs/1231/basic-authentication-using-nodejs
fonte
O Express removeu essa funcionalidade e agora recomenda que você use a biblioteca basic-auth .
Aqui está um exemplo de como usar:
Para enviar uma solicitação para esta rota, você precisa incluir um cabeçalho de autorização formatado para autenticação básica.
Enviando uma solicitação curl primeiro, você deve usar a codificação base64
name:pass
ou, neste caso,aladdin:opensesame
que é igual aYWxhZGRpbjpvcGVuc2VzYW1l
Sua solicitação curl ficará assim:
fonte
fonte