node.js için kullanıcı kimlik doğrulama kütüphaneleri?


274

Node.js için var olan kullanıcı kimlik doğrulama kitaplıkları var mı? Özellikle (özel bir arka uç kimlik doğrulaması DB kullanarak) bir kullanıcı için parola kimlik doğrulaması yapabilir ve bu kullanıcıyı bir oturum ile ilişkilendirmek bir şey arıyorum.

Bir auth kütüphanesi yazmadan önce, insanların mevcut kütüphaneleri bilip bilmediklerini anladım. Bir google araması yoluyla belirgin bir şey bulunamadı.

-Shreyas


Aranabilirlik için: omniauth(raylar) veya python'a eşdeğer bir şey social-auth. PHP (ve diğer yaygın web sunucusu dilleri) kullanıcıları eşdeğerlerini de ekleyebilir.
forivall

Yanıtlar:


233

Connect veya Express için bir kimlik doğrulama çerçevesi arıyorsanız, Passport araştırmaya değer: https://github.com/jaredhanson/passport

(Açıklama: Passport'un geliştiricisiyim)

Passport'u hem connect-auth'u hem de everyauth'u araştırdıktan sonra geliştirdim. Her ikisi de harika modüller olsa da, ihtiyaçlarıma uygun değildi. Daha hafif ve göze batmayan bir şey istedim.

Pasaport ayrı modüllere ayrılmıştır, bu nedenle yalnızca ihtiyacınız olanı kullanmayı seçebilirsiniz (OAuth, yalnızca gerekirse). Passport ayrıca uygulamanızda herhangi bir rotaya bağlanmaz, kimlik doğrulamasını ne zaman ve nerede istediğinize karar verme esnekliği sağlar ve kimlik doğrulama başarılı veya başarısız olduğunda ne olacağını kontrol etmek için kancalar sağlar.

Örneğin, form tabanlı (kullanıcı adı ve parola) kimlik doğrulamasını ayarlamak için iki adımlı işlem şöyledir:

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('/');
  });

Facebook, Twitter vb. Aracılığıyla kimlik doğrulaması için ek stratejiler mevcuttur. Gerekirse özel stratejiler eklenebilir.


Düğüm için tüm kimlik doğrulama paketleri arasında pasaport seçtim. İyi belgelendirilmiş ve kullanımı kolaydır ve daha fazla stratejiyi destekler.
tech-man

Şu anda bir prototip için pasaport kullanıyorum ve bakılmadığı için tavsiye etmiyorum ve tasarım çok iyi değil. Örneğin, req.session.messages'i kullanabildiğinizde connect-flash kullanmaya zorlar ve kullanımdan kaldırılmış Google OpenId kullandığından ve pasaport bağlantısı bulunmadığından, web sitesinde tanıtılan pasaport-google eskidir. onun yerine geçmesi gereken google-oauth. Ayrıca bu, kimlik doğrulamasından sonra geri aramanın imzasıdır: done(null,false,{ message:'Incorrect username.' })bu parametrelerin ne olduğunu bilmediğimiz için korkunç.
eloon

1
@eloone Google'ın şimdi tercih ettiği yeni kimlik doğrulama yöntemlerini gösterecek şekilde dokümanları güncellemem gerekiyor. Bahsettiğiniz gibi, bunlar için destek var ve iyi çalışıyorlar. Tasarım sorularına gelince, pasaport sizi connect-flash kullanmaya zorlamaz ve bahsettiğiniz argümanlar kılavuzda belgelenir. Anlamak için yardıma ihtiyacınız varsa, insanların sorularınıza yardımcı olabileceği ve cevaplayabileceği forumlar vardır.
Jared Hanson

Hiçbir şey için değil - ama sadece Passport (verilen örnek kullanılır) takmayı bitirdim. Süper kolay! En son yorumlardan bu yana birkaç yıl geçtiğini anlıyorum. Kimseye bir göz atmanızı tavsiye ederim.
terary

89

Oturum + Eğer

Pek çok iyi kütüphane bulamamanızın sebebi, kimlik doğrulaması için bir kütüphane kullanımının çoğunlukla aşırı tasarlanmış olmasıdır.

Ne arıyorsun sadece bir oturum bağlayıcı :) ile bir oturum:

if login and user == xxx and pwd == xxx 
   then store an authenticated=true into the session 
if logout destroy session

bu kadar.


Connect-auth eklentisinin gitmenin yolu olduğu sonucuna katılmıyorum.

Ayrıca connect kullanıyorum ama connect-auth'u iki nedenden dolayı kullanmıyorum:

  1. IMHO, connect-auth'u connect'in çok güçlü ve okunması kolay soğan halkası mimarisini kırar. No-go - benim görüşüm :). Connect'in nasıl çalıştığı ve soğan halkası fikri hakkında çok iyi ve kısa bir makale bulabilirsiniz .

  2. Eğer - yazılı olarak - sadece veritabanı veya dosya ile temel veya http giriş kullanmak istiyorsanız. Connect-auth çok büyük. OAuth 1.0, OAuth 2.0 & Co gibi şeyler için daha fazla


Connect ile çok basit bir kimlik doğrulama

(Tamamlandı. Sadece test için yürütün, ancak üretimde kullanmak istiyorsanız, https kullandığınızdan emin olun) (Ve REST-İlke Uyumlu olmak için GET-Request b / c yerine POST-İsteği kullanmalısınız. bir durumu değiştirirsiniz :)

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);

NOT

Bu ifadeyi bir yıl önce yazdım ve şu anda aktif düğüm projem yok. Yani Express'te API-Değişiklikleri olabilir. Bir şey değiştirmem gerekirse lütfen bir yorum ekleyin.


Connect-auth neden soğan / katman desenini kırıyor? next () kullanmadığı için mi? Olabilir mi?
jpstrikesback

3
Evet. Bir sonraki () yöntemini kullanmalıdır çünkü bağlanmanın arkasındaki fikir budur. Connect, katman mimarisine / kod yapısına sahiptir. Ve her katman, next () öğesini çağırmadan istek yürütülmesini durdurma gücüne sahiptir. Kimlik doğrulama hakkında konuşuyorsak: Bir kimlik doğrulama katmanı kullanıcının doğru izinlere sahip olup olmadığını kontrol eder. Her şey yolundaysa, katman next () öğesini çağırır. Değilse, bu yetkilendirme katmanı bir hata oluşturur ve next () öğesini çağırmaz.
Matthias

dostum, tam da aradığım şey buydu. connect-auth bana biraz hazımsızlık veriyordu. Uygulamama ilk kez giriş yaptım. çok teşekkürler.
Andy Ray

7
Bu yine de bir veritabanı arka ucuna (tercihen şifrelenmiş parolalarla) nasıl bağlanacağınızı yanıtlamaya yardımcı olmaz. Bu kütüphanenin aşırı tasarlanmış olduğu yorumunu takdir ediyorum, ama kesinlikle olmayan bir kütüphane var. Ayrıca, kendi kimlik doğrulama sistemimi yazmak isteseydim Java'da Struts'u kullanırdım. Tıpkı OP gibi, hangi eklentilerin benim için 1 satır kodda yapacağını bilmek istiyorum.
hendrixski

4
büyük cevap Nivoc. Tho en son sürümleri ile çalışmaz. Değiştirmek zorunda kaldım ... cookieDecoder () -> cookieParser () ve bodyDecoder () -> bodyParser () ve helloWorldContent işlevinden sonraki () çağrısını kaldırarak hata alıyorum ' '
Michael Dausmann

26

Görünüşe göre Connect Middleware'e connect-auth eklentisi tam olarak ihtiyacım olan şey: http://wiki.github.com/ciaranj/connect-auth/creating-a-form-based-strategy

Ekspres [ http://expressjs.com ] kullanıyorum.


1
hey, ne yaptığına bir örnek var mı? sadece connect-auth istemesi ve “req” üzerinde “.authenticate” çağrısı “TypeError: Object # 'in benim için' authenticate 'yöntemi yoktur.
Misha Reyzlin

1
IMHO Bu Eklenti, basit http kimlik doğrulaması için ağır bir yoldur
Matthias

Ve bu eklenti bağlantı soğan halkası mimarisine karşı çalışıyor
Matthias

14

Temelde aynı şeyi arıyordum. Özellikle, aşağıdakileri istedim:

  1. Connect'in ara katman yazılımı özelliğini saran express.js'yi kullanmak için
  2. "Form tabanlı" kimlik doğrulaması
  3. Hangi yolların kimliğinin doğrulandığı üzerinde ayrıntılı denetim
  4. Kullanıcılar / şifreler için bir veritabanı arka ucu
  5. Oturumları kullan

Yaptığım şey, check_authkimlik doğrulamasını istediğim her rotaya argüman olarak ilettiğim kendi ara katman yazılım fonksiyonumu yaratmaktı . check_authyalnızca oturumu kontrol eder ve kullanıcı oturum açmadıysa, oturum açma sayfasına yönlendirir, şöyle:

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();
}

Sonra her rota için bu fonksiyonun ara katman yazılımı olarak geçmesini sağlarım. Örneğin:

app.get('/tasks', check_auth, function(req, res) {
    // snip
});

Son olarak, giriş işlemini gerçekten ele almamız gerekiyor. Bu basit:

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("/");
    }
  });
});

Her halükarda, bu yaklaşım çoğunlukla esnek ve basit olacak şekilde tasarlanmıştır. Eminim onu ​​geliştirmenin birçok yolu vardır. Eğer varsa, görüşlerinizi çok isterim.

EDIT: Bu basitleştirilmiş bir örnektir. Bir üretim sisteminde, şifreleri asla düz metin olarak saklamak ve karşılaştırmak istemezsiniz. Bir yorumcunun işaret ettiği gibi, şifre güvenliğini yönetmeye yardımcı olabilecek kütüphaneler vardır.


2
parola depolamak için bcrypt kullanmanız dışında bu iyidir (db'de düz metin değil). Bu konuda iyi bir yazı var: devsmash.com/blog/…
chovy


7

İşte projelerimden birinin temel kimlik doğrulaması için bazı kodlar. Ben CouchDB ve ek kimlik doğrulama önbellek karşı kullanın, ama bu kodu elimden.

Kimlik doğrulama yöntemini işleme isteğinizin etrafına sarın ve başarısız kimlik doğrulaması için ikinci bir geri arama sağlayın. Başarılı geri arama, kullanıcı adını ek bir parametre olarak alır. Hata geri aramasında yanlış veya eksik kimlik bilgilerine sahip istekleri doğru bir şekilde işlemeyi unutmayın:

/**
 * 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;
    }

};

Form tabanlı kimlik doğrulaması için temel kimlik doğrularından kaçınmak istedim. Bu kesinlikle temel kimlik doğrulama problemine zarif bir çözümdür. Sanırım iyi bir yetkilendirme çerçevesi bulmuş olabilirim (connect-auth - connectjs'nin üstüne oturur)
shreddd

4

Kimlik doğrulamanın farklı bir yanı , parolaların doğasında var olan sorunlardan kaçınan bir belirteç tabanlı kimlik doğrulama modülü olan Parolasız'dır [1]. Uygulaması hızlıdır, çok fazla form gerektirmez ve ortalama kullanıcı için daha iyi güvenlik sunar (tam açıklama: Ben yazarım).

[1]: Parolalar Eski


3

Birkaç yıl geçti ve Express için kimlik doğrulama çözümümü tanıtmak istiyorum. Buna Lockit deniyor . Sen projeyi bulabilirsiniz GitHub'dan ve en kısa intro bloguma .

Peki mevcut çözümlerle arasındaki farklar nelerdir?

  • kolay kullanımı: DB kurmak, yüklemek npm, require('lockit'), lockit(app), bitmiş
  • zaten yerleşik olan güzergahlar (/ kayıt, / giriş, / şifremi unuttum vb.)
  • yerleşik görünümler (Bootstrap tabanlı ancak kendi görünümlerinizi kolayca kullanabilirsiniz)
  • AngularJS / Ember.js tek sayfa uygulamalarınız için JSON iletişimini destekler
  • OAuth ve OpenID'yi desteklemez. Sadece usernameve password.
  • kutunun dışında birkaç veritabanı (CouchDB, MongoDB, SQL) ile çalışır
  • testleri var (Alçıpan için herhangi bir test bulamadım)
  • aktif olarak korunur (her şeye kıyasla)
  • e-posta doğrulama ve unuttum şifre işlemi (Pasaport tarafından desteklenmeyen jetonlu e-posta gönderin)
  • modülerlik: sadece ihtiyacınız olanı kullanın
  • esneklik: her şeyi özelleştir

Örneklere bir göz atın .


2

Pasaport ile bir kullanıcı giriş sistemi uygulayan ve aynı zamanda bir kullanıcı yönetimi yönetici paneline sahip olan Drywall adlı bir proje var . Django'nun sahip olduğu gibi Node.js için olana benzer tam özellikli bir kullanıcı kimlik doğrulama ve yönetim sistemi arıyorsanız, işte budur. Bir kullanıcı kimlik doğrulama ve yönetim sistemi gerektiren bir düğüm uygulaması oluşturmak için gerçekten iyi bir başlangıç ​​noktası buldum. Passport'un nasıl çalıştığı hakkında bilgi için Jared Hanson'un cevabına bakınız .



1

Yani açısal istemci için kullanıcı kimlik doğrulaması sağlayan bir API için mongo kullanarak hızlı basit örnek

app.js içinde

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);

rotanız için böyle bir şey:

// (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);
                }
            }
        });
    });
};

Ardından kimlik doğrulaması gerektiren rotalarınızda yalnızca kullanıcı oturumunu kontrol edebilirsiniz:

if (!req.session.user) {
    res.send(403);
}

0

Zaman damgalı jetonlar kullanan yeni bir kimlik doğrulama kütüphanesi. Belirteçler, veritabanında saklanmasına gerek kalmadan kullanıcılara e-postayla gönderilebilir veya mesaj gönderilebilir. Parolasız kimlik doğrulama veya iki faktörlü kimlik doğrulama için kullanılabilir.

https://github.com/vote539/easy-no-password

Açıklama: Bu kütüphanenin geliştiricisiyim.


0

Microsoft Windows kullanıcı hesabıyla TOA (Tek Oturum Açma) ile kimlik doğrulamanız gerekiyorsa. Https://github.com/jlguenego/node-expose-sspi adresini deneyebilirsiniz .

Size req.ssotüm istemci kullanıcı bilgilerini (oturum açma, görünen ad, sid, gruplar) içeren bir nesne verecektir .

const express = require("express");
const { sso, sspi } = require("node-expose-sspi");

sso.config.debug = false;

const app = express();

app.use(sso.auth());

app.use((req, res, next) => {
  res.json({
    sso: req.sso
  });
});

app.listen(3000, () => console.log("Server started on port 3000"));

Feragatname: node-expose-sspi'nin yazarıyım.


0

tatlı-auth

Hafif, sıfır yapılandırmalı kullanıcı kimlik doğrulama modülü. Sperate veritabanına ihtiyaç duymaz.

https://www.npmjs.com/package/sweet-auth

Bu kadar basit:

app.get('/private-page', (req, res) => {

    if (req.user.isAuthorized) {
        // user is logged in! send the requested page
        // you can access req.user.email
    }
    else {
        // user not logged in. redirect to login page
    }
})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.