библиотеки аутентификации пользователей для node.js?

Существуют ли существующие библиотеки аутентификации пользователей для node.js? В частности, я ищу что-то, что может сделать аутентификацию паролем для пользователя (с использованием пользовательской резервной БД) и связать этого пользователя с сеансом.

Прежде чем я написал библиотеку auth, я подумал, что посмотрю, знают ли люди о существующих библиотеках. Не удалось найти ничего очевидного с помощью поиска в Google.

-Shreyas

Если вы ищете инфраструктуру проверки подлинности для Connect или Express, Passport заслуживает изучения: https://github.com/jaredhanson/passport

(Раскрытие информации: я являюсь разработчиком паспорта)

Я разработал Passport после изучения как connect-auth, так и everyauth. Хотя они оба отличные модули, они не соответствовали моим потребностям. Я хотел чего-то более легкого и ненавязчивого.

Паспорт разбит на отдельные модули, поэтому вы можете использовать только то, что вам нужно (OAuth, только при необходимости). Паспорт также не монтирует никаких маршрутов в вашем приложении, что дает вам гибкость в определении того, когда и где требуется аутентификация, и перехватывает, чтобы контролировать, что происходит, когда аутентификация выполняется успешно или не выполняется.

Например, вот двухэтапный процесс настройки аутентификации на основе форм (имя пользователя и пароль):

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

Дополнительные страtagsи доступны для проверки подлинности через Facebook, Twitter и т. Д. При необходимости могут быть подключены пользовательские страtagsи.

Сессия + Если

Я предполагаю, что причина, по которой вы не нашли много хороших библиотек, заключается в том, что использование библиотеки для аутентификации в основном переработано.

То, что вы ищете, это просто связывание с сеансом 🙂 Сессия с:

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

это оно.


Я не согласен с вашим заключением, что плагин connect-auth – это путь.

Я использую также connect, но я не использую connect-auth по двум причинам:

  1. IMHO ломает connect-auth очень мощную и легко читаемую архитектуру соединения onion-ring. Не-go – мое мнение :). Вы можете найти очень хорошую и короткую статью о том, как работают соединения и идея лукового кольца здесь .

  2. Если вы – как написано – просто хотите использовать базовый или http-логин с базой данных или файлом. Connect-auth слишком велик. Это больше для таких вещей, как OAuth 1.0, OAuth 2.0 & Co


Очень простая аутентификация с подключением

(Это полно, просто выполните его для тестирования, но если вы хотите использовать его на производстве, обязательно используйте https) (И чтобы быть совместимым с REST-принципом, вы должны использовать POST-запрос вместо GET-запроса b / c вы меняете состояние 🙂

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

ЗАМЕТКА

Я написал это заявление более года назад и в настоящее время не имеет активных проектов узлов. Таким образом, могут быть API-изменения в Express. Пожалуйста, добавьте комментарий, если я должен что-то изменить.

Похоже, что подключаемый-подключаемый плагин к промежуточному программному обеспечению подключения – именно то, что мне нужно: http://wiki.github.com/ciaranj/connect-auth/creating-a-form-based-strategy

Я использую express [ http://expressjs.com ], поэтому подключаемый плагин подходит очень хорошо, так как express является подclassом (ok – прототипирован) из connect

Я в основном искал то же самое. В частности, я хотел:

  1. Чтобы использовать express.js, который переносит возможности промежуточного ПО Connect
  2. Аутентификация на основе формы
  3. Гранулированный контроль над маршрутами
  4. База данных для пользователей / паролей
  5. Использовать сеансы

То, что я закончил, – это создание моей собственной функции check_auth промежуточного программного обеспечения, которую я check_auth в качестве аргумента для каждого маршрута, который я хочу пройти аутентификацией. check_auth просто проверяет сеанс, и если пользователь не вошел в систему, а затем перенаправляет их на страницу входа, например:

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

Затем для каждого маршрута я гарантирую, что эта функция передается как промежуточное программное обеспечение. Например:

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

Наконец, нам нужно фактически обработать процесс входа в систему. Это просто:

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

Во всяком случае, этот подход был в основном разработан, чтобы быть гибким и простым. Я уверен, что есть множество способов улучшить его. Если у вас есть, мне очень понравятся ваши отзывы.

EDIT: Это упрощенный пример. В производственной системе вы никогда не захотите хранить и сравнивать пароли в текстовом формате. Как отмечает комментатор, существуют библиотеки, которые могут помочь в управлении защитой паролем.

Также обратите внимание на everyauth, если вы хотите, чтобы интеграция входа в третья сторона / социальная сеть.

Ниже приведен код для базовой проверки подлинности из одного из моих проектов. Я использую его против CouchDB с дополнительным кэшем данных аутентификации, но я лишил этот код.

Оберните метод проверки подлинности вокруг запроса запроса и предоставьте второй обратный вызов для неудачной аутентификации. Обратный вызов успеха получит имя пользователя в качестве дополнительного параметра. Не забудьте правильно обрабатывать запросы с неправильными или отсутствующими учетными данными в обратном вызове отказа:

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

Прошло несколько лет, и я хотел бы представить свое решение для проверки подлинности для Express. Это называется Lockit . Вы можете найти проект на GitHub и краткое введение в мой блог .

Итак, каковы различия между существующими решениями?

  • прост в использовании: настройте свой DB, npm install, require('lockit') , lockit(app) , done
  • маршруты уже встроены (/ signup, / login, / forget-password и т. д.)
  • которые уже встроены (на основе Bootstrap, но вы можете легко использовать свои собственные представления)
  • он поддерживает связь JSON для ваших одностраничных приложений AngularJS / Ember.js
  • он НЕ поддерживает OAuth и OpenID. Только username и password .
  • он работает с несколькими базами данных (CouchDB, MongoDB, SQL) из коробки
  • у него есть тесты (я не мог найти никаких тестов для Drywall)
  • он активно поддерживается (по сравнению с everyauth)
  • проверка электронной почты и процесс забытого пароля (отправьте электронное письмо с токеном, не поддерживаемым паспортом)
  • модульность: используйте только то, что вам нужно
  • гибкость: настроить все вещи

Взгляните на примеры .

Другой подход к аутентификации – это Passwordless, модуль аутентификации на основе токенов для выражения, который обходит присущую проблему пароли [1]. Он быстро реализуется, не требует слишком много форм и обеспечивает лучшую защиту для обычного пользователя (полное раскрытие: я автор).

[1]: Пароли устарели

Существует проект под названием Drywall, который реализует систему входа пользователя с помощью Passport, а также панель администратора управления пользователями. Если вы ищете полнофункциональную систему аутентификации пользователей и управления, похожую на то, что Django имеет, но для Node.js, это она. Я нашел, что это действительно хорошая отправная точка для создания узла, требующего аутентификации пользователя и системы управления. См . Ответ Джареда Хэнсона для получения информации о том, как работает Passport.

Вот две популярные библиотеки Github для проверки подлинности узла js:

https://github.com/jaredhanson/passport (предположительно)

https://nodejsmodules.org/pkg/everyauth

Быстрый простой пример использования mongo для API, который предоставляет пользователю auth, например, Angular client

в app.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); 

для вашего маршрута что-то вроде этого:

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

Затем на ваших маршрутах, требующих авторизации, вы можете просто проверить сеанс пользователя:

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

Вот новая библиотека проверки подлинности, которая использует метки с меткой времени. Токены могут быть отправлены по электронной почте или отправлены на текстовые сообщения пользователям без необходимости хранить их в базе данных. Его можно использовать для аутентификации без пароля или для двухфакторной аутентификации.

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

Раскрытие информации: Я являюсь разработчиком этой библиотеки.

  • Как обрабатывать HTTP-аутентификацию с помощью HttpURLConnection?
  • Вложение свойств по атрибутам
  • Настройка Spring Security 3.x для создания нескольких точек входа
  • Аутентификация с помощью двух разных таблиц
  • Как защитить статические файлы с помощью аутентификации формы ASP.NET в IIS 7.5?
  • Авторизация Google OAuth 2 - Ошибка: redirect_uri_mismatch
  • Вставить фид активности общедоступной страницы Facebook, не заставляя пользователя входить в систему / разрешать
  • Где я могу найти список URL-адресов поставщика OpenID?
  • Почему в OAuth2 есть stream «Авторизация», когда stream «Неявный» работает так хорошо?
  • ASP.NET MVC - проверка подлинности HTTP
  • Добавление аутентификации идентификатора ASP.NET MVC5 в существующий проект
  • Давайте будем гением компьютера.