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

Author: shreddd, 2010-08-17

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ć.

 229
Author: Jared Hanson,
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:

  1. 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 .

  2. 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ć.

 88
Author: nivoc,
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

 26
Author: shreddd,
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:

  1. aby użyć express.js, który owija możliwości middleware Connect
  2. uwierzytelnianie oparte na formularzach
  3. Szczegółowa kontrola nad tym, które trasy są uwierzytelniane
  4. zaplecze bazy danych dla użytkowników / haseł
  5. 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ł.

 14
Author: Tom,
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.

 13
Author: Peter Lyons,
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;
    }

};
 7
Author: b_erb,
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 i password.
  • W tym celu należy skontaktować się z Działem obsługi klienta pod adresem .]} Nie ma żadnych testów na płyty gipsowo-kartonowe.]}
  • 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 .

 3
Author: zemirco,
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).

[1]: hasła są przestarzałe

 3
Author: florian,
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.

 2
Author: lk145,
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)

Https://nodejsmodules.org/pkg/everyauth

 2
Author: Soman Dubey,
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);
}
 1
Author: Mister P,
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.

 0
Author: sffc,
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