Wygląda na to, że implementacja podstawowego uwierzytelniania HTTP w Express v3 była banalna:
app.use(express.basicAuth('username', 'password'));
Wersja 4 (używam 4.2) usunęła jednak basicAuth
oprogramowanie pośredniczące, więc trochę utknąłem. Mam następujący kod, ale nie powoduje to, że przeglądarka monituje użytkownika o poświadczenia, co chciałbym (i wyobrażam sobie, że zrobiła to stara metoda):
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();
}
});
Odpowiedzi:
Proste uwierzytelnianie podstawowe z waniliowym JavaScriptem (ES6)
Uwaga: tego „oprogramowania pośredniego” można używać w dowolnym programie obsługi. Po prostu usuń
next()
i odwróć logikę. Zobacz poniższy przykład wyrażenia 1 lub historię edycji tej odpowiedzi.Czemu?
req.headers.authorization
zawiera wartość „Basic <base64 string>
”, ale może być również pusty i nie chcemy, aby się nie powiódł, stąd dziwne połączenie|| ''
atob()
ibtoa()
dlategoBuffer
ES6 -> ES5
const
jest po prostuvar
... tak jakby(x, y) => {...}
to pofunction(x, y) {...}
const [login, password] = ...split()
prostu dwavar
zadania w jednymźródło inspiracji (korzysta z pakietów)
Powyższy przykład to super prosty przykład, który miał być bardzo krótki i szybko wdrażalny na serwerze placu zabaw. Ale jak wskazano w komentarzach, hasła mogą również zawierać znaki dwukropka
:
. Aby poprawnie wyodrębnić go z b64auth , możesz użyć tego.Podstawowe uwierzytelnianie w jednym oświadczeniu
... z drugiej strony, jeśli używasz tylko jednego lub kilku loginów, jest to absolutne minimum, którego potrzebujesz: (nie musisz nawet analizować poświadczeń)
PS: czy potrzebujesz mieć zarówno „bezpieczne”, jak i „publiczne” ścieżki? Rozważ użycie
express.router
zamiast tego.źródło
.split(':')
ponieważ będzie się dławić hasłami zawierającymi co najmniej jeden dwukropek. Takie hasła są ważne zgodnie z RFC 2617 .const [_, login, password] = strauth.match(/(.*?):(.*)/) || []
dla części dwukropka.!==
do porównywania haseł naraża Cię na ataki czasowe. en.wikipedia.org/wiki/Timing_attack upewnij się, że używasz stałego porównania ciągów czasu.Buffer.from() // for strings
lubBuffer.alloc() // for numbers
jakoBuffer()
przestarzałe ze względu na problemy z bezpieczeństwem.TL; DR:
☒
express.basicAuth
zniknął☒
basic-auth-connect
jest przestarzała☒
basic-auth
nie ma żadnej logiki☒
http-auth
jest przesadą☑
express-basic-auth
to, co chceszWięcej informacji:
Ponieważ używasz Express, możesz użyć
express-basic-auth
oprogramowania pośredniego.Zobacz dokumentację:
Przykład:
źródło
challenge: true
Wiele oprogramowania pośredniego zostało wyciągniętych z rdzenia Express w wersji 4 i umieszczonych w oddzielnych modułach. Podstawowy moduł autoryzacji jest tutaj: https://github.com/expressjs/basic-auth-connect
Twój przykład musiałby po prostu zmienić się na ten:
źródło
basic-auth
biblioteki w tej odpowiedziUżyłem kodu oryginału,
basicAuth
aby znaleźć odpowiedź:źródło
W express 4.0 zmieniłem uwierzytelnianie podstawowe z http-auth , kod to:
źródło
Wydaje się, że jest do tego wiele modułów, niektóre są przestarzałe.
Ten wygląda na aktywny:
https://github.com/jshttp/basic-auth
Oto przykład użycia:
Upewnij się, że
auth
oprogramowanie pośredniczące zostało umieszczone we właściwym miejscu, żadne oprogramowanie pośrednie nie zostanie wcześniej uwierzytelnione.źródło
implement
sam protokół (inaczej wysłać poprawny nagłówek)Możemy zaimplementować podstawową autoryzację bez konieczności posiadania żadnego modułu
Źródło: - http://www.dotnetcurry.com/nodejs/1231/basic-authentication-using-nodejs
źródło
Express usunął tę funkcję i teraz zaleca używanie biblioteki basic-auth .
Oto przykład użycia:
Aby wysłać żądanie do tej trasy, musisz dołączyć nagłówek autoryzacji sformatowany dla podstawowej autoryzacji .
Wysyłając najpierw żądanie curl, musisz zastosować kodowanie base64
name:pass
lub w tym przypadku,aladdin:opensesame
które jest równeYWxhZGRpbjpvcGVuc2VzYW1l
Twoja prośba o zawinięcie będzie wyglądać następująco:
źródło
źródło