biblioteki uwierzytelniania użytkowników dla węzła.js?
Czy istnieją istniejące biblioteki uwierzytelniania użytkowników dla węzła.js? W szczególności szukam czegoś, co może zrobić uwierzytelnianie hasłem dla użytkownika (za pomocą niestandardowego zaplecza AUTH DB) i powiązać tego użytkownika z sesją.
Zanim napisałem bibliotekę auth, pomyślałem, że zobaczę, czy ludzie wiedzą o istniejących bibliotekach. Nie mogłem znaleźć niczego oczywistego za pomocą wyszukiwarki google.
- Shreyas
12 answers
Jeśli szukasz struktury uwierzytelniania dla Connect lub Express, Passport jest wart zbadania: https://github.com/jaredhanson/passport
(ujawnienie: jestem twórcą paszportu)
Opracowałem Passport po zbadaniu zarówno connect-auth, jak i everyauth. Chociaż oba są świetnymi modułami, nie odpowiadały moim potrzebom. Chciałem czegoś bardziej lekkiego i dyskretnego.
Passport jest podzielony na oddzielne moduły, więc możesz używać tylko tego, czego potrzebujesz (OAuth, tylko jeśli to konieczne). Passport nie montuje również żadnych tras w aplikacji, co daje Ci elastyczność decydowania, kiedy i gdzie chcesz uwierzytelnić, oraz Hooki, aby kontrolować, co się stanie, gdy uwierzytelnienie powiedzie się lub zawiedzie.
Na przykład, oto dwuetapowy proces konfiguracji uwierzytelniania opartego na formularzu (nazwa użytkownika i hasło):
passport.use(new LocalStrategy(
function(username, password, done) {
// Find the user from your DB (MongoDB, CouchDB, other...)
User.findOne({ username: username, password: password }, function (err, user) {
done(err, user);
});
}
));
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login' }),
function(req, res) {
// Authentication successful. Redirect home.
res.redirect('/');
});
Dostępne są dodatkowe strategie uwierzytelniania za pośrednictwem Facebook, Twitter, itp. Niestandardowe strategie można w razie potrzeby podłączyć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-24 17:34:18
Session + If
Domyślam się, że powodem, dla którego nie znalazłeś wielu dobrych bibliotek, jest to, że używanie biblioteki do uwierzytelniania jest w większości przesadzone.
To, czego szukasz, to tylko segregator sesji:) sesja z:
if login and user == xxx and pwd == xxx
then store an authenticated=true into the session
if logout destroy session
To wszystko.
Nie zgadzam się z Twoim wnioskiem, że wtyczka connect-auth jest drogą do zrobienia.
Używam również connect ale nie używam connect-auth z dwóch powodów:
IMHO łamie connect-auth bardzo wydajna i łatwa do odczytania Architektura pierścienia cebulowego connect. A no-go-moje zdanie :). Bardzo dobry i krótki artykuł o tym, jak działa connect i idea onion ring znajdziesz tutaj .
-
Jeśli - jak napisano-po prostu chcesz użyć loginu podstawowego lub http z bazą danych lub pliku. Connect-auth jest za duży. Jest to bardziej dla rzeczy takich jak OAuth 1.0, OAuth 2.0 & Co
Bardzo proste uwierzytelnianie za pomocą connect
(to kompletna. Po prostu wykonaj go do testowania, ale jeśli chcesz go użyć w produkcji, upewnij się, że używasz https) (I aby być zgodnym z zasadą REST, powinieneś użyć POST-Request zamiast GET-Request b / c zmieniasz Stan:)
var connect = require('connect');
var urlparser = require('url');
var authCheck = function (req, res, next) {
url = req.urlp = urlparser.parse(req.url, true);
// ####
// Logout
if ( url.pathname == "/logout" ) {
req.session.destroy();
}
// ####
// Is User already validated?
if (req.session && req.session.auth == true) {
next(); // stop here and pass to the next onion ring of connect
return;
}
// ########
// Auth - Replace this example with your Database, Auth-File or other things
// If Database, you need a Async callback...
if ( url.pathname == "/login" &&
url.query.name == "max" &&
url.query.pwd == "herewego" ) {
req.session.auth = true;
next();
return;
}
// ####
// This user is not authorized. Stop talking to him.
res.writeHead(403);
res.end('Sorry you are not authorized.\n\nFor a login use: /login?name=max&pwd=herewego');
return;
}
var helloWorldContent = function (req, res, next) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('authorized. Walk around :) or use /logout to leave\n\nYou are currently at '+req.urlp.pathname);
}
var server = connect.createServer(
connect.logger({ format: ':method :url' }),
connect.cookieParser(),
connect.session({ secret: 'foobar' }),
connect.bodyParser(),
authCheck,
helloWorldContent
);
server.listen(3000);
Uwaga
Napisałem to oświadczenie ponad rok temu i nie mam obecnie żadnych aktywnych projektów węzłów. Więc mogą być API-zmiany w Express. Proszę dodać komentarz, jeśli mam coś zmienić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-07 16:20:09
Wygląda na to, że wtyczka connect-auth do connect middleware jest dokładnie tym, czego potrzebuję: http://wiki.github.com/ciaranj/connect-auth/creating-a-form-based-strategy
Używam express [ http://expressjs.com ] więc wtyczka connect pasuje bardzo ładnie, ponieważ express jest podklasowany (ok-prototyped) z connect
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 23:05:52
Szukałam tego samego. W szczególności chciałem:
- aby użyć express.js, który owija możliwości middleware Connect
- uwierzytelnianie oparte na formularzach
- Szczegółowa kontrola nad tym, które trasy są uwierzytelniane
- zaplecze bazy danych dla użytkowników / haseł
- Użyj sesji
Skończyło się na stworzeniu własnej funkcji middleware check_auth
, którą przekazuję jako argument do każdej trasy, którą chcę uwierzytelnić. check_auth
po prostu sprawdza sesję i jeśli użytkownik nie jest zalogowany, przekierowuje go na stronę logowania, w ten sposób:
function check_auth(req, res, next) {
// if the user isn't logged in, redirect them to a login page
if(!req.session.login) {
res.redirect("/login");
return; // the buck stops here... we do not call next(), because
// we don't want to proceed; instead we want to show a login page
}
// the user is logged in, so call next()
next();
}
Wtedy dla każdej trasy, upewniam się, że ta funkcja jest przekazywana jako middleware. Na przykład:
app.get('/tasks', check_auth, function(req, res) {
// snip
});
Wreszcie, musimy faktycznie obsługiwać proces logowania. Jest to proste:
app.get('/login', function(req, res) {
res.render("login", {layout:false});
});
app.post('/login', function(req, res) {
// here, I'm using mongoose.js to search for the user in mongodb
var user_query = UserModel.findOne({email:req.body.email}, function(err, user){
if(err) {
res.render("login", {layout:false, locals:{ error:err } });
return;
}
if(!user || user.password != req.body.password) {
res.render("login",
{layout:false,
locals:{ error:"Invalid login!", email:req.body.email }
}
);
} else {
// successful login; store the session info
req.session.login = req.body.email;
res.redirect("/");
}
});
});
W każdym razie, to podejście było głównie zaprojektowane tak, aby być elastycznym i prostym. Jestem pewien, że istnieje wiele sposobów, aby go poprawić. Jeśli masz jakieś, bardzo bym chciał Twoje informacje zwrotne.
EDIT: jest to uproszczony przykład. W systemie produkcyjnym nigdy nie chcesz przechowywać i porównywać haseł w zwykłym tekście. Jak wskazuje komentator, istnieją biblioteki, które mogą pomóc w zarządzaniu bezpieczeństwem haseł.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 17:04:54
Spójrz również na everyauth jeśli chcesz integracji logowania stron trzecich/sieci społecznościowych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-08 15:50:34
Oto kod do podstawowego uwierzytelniania z jednego z moich projektów. Używam go przeciwko CouchDB z dodatkowym auth data cache, ale usunąłem ten kod.
Owiń metodę uwierzytelniania wokół żądania obsługi i dostarcz drugą odpowiedź zwrotną dla nieudanego uwierzytelnienia. Wywołanie zwrotne sukcesu otrzyma nazwę użytkownika jako dodatkowy parametr. Nie zapomnij poprawnie obsługiwać żądań z błędnymi lub brakującymi poświadczeniami w nieudanym wywołaniu zwrotnym:
/**
* Authenticate a request against this authentication instance.
*
* @param request
* @param failureCallback
* @param successCallback
* @return
*/
Auth.prototype.authenticate = function(request, failureCallback, successCallback)
{
var requestUsername = "";
var requestPassword = "";
if (!request.headers['authorization'])
{
failureCallback();
}
else
{
var auth = this._decodeBase64(request.headers['authorization']);
if (auth)
{
requestUsername = auth.username;
requestPassword = auth.password;
}
else
{
failureCallback();
}
}
//TODO: Query your database (don't forget to do so async)
db.query( function(result)
{
if (result.username == requestUsername && result.password == requestPassword)
{
successCallback(requestUsername);
}
else
{
failureCallback();
}
});
};
/**
* Internal method for extracting username and password out of a Basic
* Authentication header field.
*
* @param headerValue
* @return
*/
Auth.prototype._decodeBase64 = function(headerValue)
{
var value;
if (value = headerValue.match("^Basic\\s([A-Za-z0-9+/=]+)$"))
{
var auth = (new Buffer(value[1] || "", "base64")).toString("ascii");
return {
username : auth.slice(0, auth.indexOf(':')),
password : auth.slice(auth.indexOf(':') + 1, auth.length)
};
}
else
{
return null;
}
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 07:59:38
Minęło kilka lat i chciałbym przedstawić moje rozwiązanie uwierzytelniające dla Express. Nazywa się Lockit . Projekt można znaleźć na GitHub oraz krótkie intro na moim blogu .
Jakie są więc różnice w stosunku do istniejących rozwiązań?
- łatwy w użyciu: skonfiguruj instalację DB, npm,
require('lockit')
,lockit(app)
, done - trasy już wbudowane (/signup, / login, / forgot-password, itp.)
- widoki już wbudowane (na podstawie Bootstrap, ale możesz łatwo używać własnych widoków)
- obsługuje komunikację JSON dla Twojego AngularJS / Ember.js single page apps
- nie obsługuje OAuth i OpenID. Tylko
username
ipassword
.
W tym celu należy skontaktować się z Działem obsługi klienta pod adresem - jest aktywnie utrzymywany (w porównaniu z każdym)
- proces weryfikacji e-mail i zapomniałem hasła (wyślij e-mail z token, nie jest obsługiwany przez Passport)
- modułowość: używaj tylko tego, czego potrzebujesz
- elastyczność: dostosuj wszystkie rzeczy
Spójrz na przykłady .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-03 08:53:06
Innym podejściem do uwierzytelniania jest Passwordless, moduł uwierzytelniania opartego na tokenie dla express, który omija nieodłączny problem haseł[1]. Jest szybki w implementacji, nie wymaga zbyt wielu formularzy i oferuje większe bezpieczeństwo przeciętnemu użytkownikowi (pełne ujawnienie: jestem autorem).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-29 11:42:55
Istnieje projekt o nazwie płyty gipsowo-kartonowe , który implementuje system logowania użytkownika za pomocą Passport, a także posiada panel administracyjny do zarządzania użytkownikami. Jeśli szukasz w pełni funkcjonalnego systemu uwierzytelniania i zarządzania użytkownikami podobnego do tego, co ma Django, ale dla Node.js, to jest to. Uważam, że jest to naprawdę dobry punkt wyjścia do budowania aplikacji węzła, która wymaga uwierzytelniania użytkownika i systemu zarządzania. Zobacz odpowiedź Jareda Hansona , aby uzyskać informacje o tym, jak Paszport działa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:22
Oto dwie popularne Biblioteki Github do uwierzytelniania węzłów js:
Https://github.com/jaredhanson/passport (sugestywny)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 17:02:04
Szybki prosty przykład użycia mongo, dla API, które zapewnia auth użytkownika dla ie Angular client
W aplikacji.js
var express = require('express');
var MongoStore = require('connect-mongo')(express);
// ...
app.use(express.cookieParser());
// obviously change db settings to suit
app.use(express.session({
secret: 'blah1234',
store: new MongoStore({
db: 'dbname',
host: 'localhost',
port: 27017
})
}));
app.use(app.router);
Na Twoją trasę coś takiego:
// (mongo connection stuff)
exports.login = function(req, res) {
var email = req.body.email;
// use bcrypt in production for password hashing
var password = req.body.password;
db.collection('users', function(err, collection) {
collection.findOne({'email': email, 'password': password}, function(err, user) {
if (err) {
res.send(500);
} else {
if(user !== null) {
req.session.user = user;
res.send(200);
} else {
res.send(401);
}
}
});
});
};
Następnie w trasach, które wymagają auth, możesz po prostu sprawdzić sesję użytkownika:
if (!req.session.user) {
res.send(403);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-11 09:43:39
Oto nowa biblioteka uwierzytelniania, która używa tokenów z oznaczeniem czasu. Tokeny mogą być wysyłane pocztą elektroniczną lub wysyłane do użytkowników bez konieczności przechowywania ich w bazie danych. Może być używany do uwierzytelniania bez hasła lub uwierzytelniania dwuskładnikowego.
Https://github.com/vote539/easy-no-password
Ujawnienie: jestem twórcą tej biblioteki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-22 06:59:02