Статьи

HTTP-аутентификация в Node.js

На прошлой неделе в разделе Создание HTTP-сервера в Node.js я рассмотрел основы HTTP-кода в Node.js. Сегодняшняя статья покажет вам, как защитить паролем ваш сайт Node.js с помощью HTTP-аутентификации. Мы начнем с рассмотрения базовой аутентификации доступа, а затем перейдем к более безопасной дайджест-аутентификации доступа.

Базовая аутентификация доступа

Когда пользователь посещает сайт, который реализует аутентификацию, ему / ей предлагается ввести имя пользователя и пароль. Если пользователь предоставляет действительные учетные данные, они перенаправляются на содержимое страницы, в противном случае они отклоняются с помощью ответа «401 Unauthorized». Самым простым типом HTTP-аутентификации является базовая аутентификация доступа .

Файл паролей

На стороне сервера все имена пользователей и зашифрованные пароли хранятся в файле паролей. Утилита Node.js htpasswd может использоваться для управления файлом паролей. Чтобы установить htpasswd , используйте команду, показанную ниже. npm означает Node.js Package Manager , и он устанавливается по умолчанию вместе с Node.js. npm используется для установки модулей Node.js. Флаг -g устанавливает пакет глобально, что означает, что он включен в системную переменную PATH .

  npm install -g htpasswd 

После установки htpasswd вы можете создавать новых пользователей с помощью команды, показанной ниже. В этом примере создается новый файл паролей с именем «htpasswd» с использованием флага -c . В новом файле добавлен пользователь с именем «foo». Флаг -b позволяет указывать пароль «bar» как часть командной строки.

  htpasswd -bc htpasswd foo bar 

После запуска команды откройте файл «htpasswd». Запись файла пароля для пользователя «foo» показана ниже. Эта строка содержит имя пользователя и зашифрованный пароль. Так как это первый и единственный пользователь в файле, это должна быть единственная строка в файле.

  Foo: {ША} Ys23Ag / 5IOWqZCw9QGaVDdHwH00 = 

Node.js Incorporation

Следующим шагом является добавление поддержки аутентификации на наш HTTP-сервер. Во-первых, вам нужно установить модуль http-auth с помощью следующей команды npm .

  npm установить http-auth 

Затем создайте новый файл с именем «basic_auth_server.js» и добавьте код, показанный ниже. Обратите внимание, что на модуль http-auth ссылаются в строке 2. В строках с 3 по 7 объект конфигурации передается в модуль аутентификации. Поле authRealm определяет область аутентификации. Поле authFile указывает на файл паролей, который мы создали ранее. __dirname ссылается на каталог, в котором находится исполняемый в данный момент скрипт. В этом примере предполагается, что файл «htpasswd» находится в том же каталоге, что и «basic_auth_server.js». authType конфигурации authType указывает тип используемой аутентификации. В строке 9 базовая схема аутентификации применяется к HTTP-соединению. Функция обратного вызова аутентификации предоставляет аутентифицированное имя пользователя для дальнейшей обработки.

 var http = require("http"); var auth = require("http-auth"); var basic = auth({ authRealm: "Private area", authFile: __dirname + "/htpasswd", authType: "basic" }); var server = http.createServer(function(request, response) { basic.apply(request, response, function(username) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello " + username); response.end(); }); }); server.listen(80); console.log("Server is listening"); 

Наконец, запустите сервер. Вы можете подключиться к серверу, перейдя по http://localhost . Вам будет предложено ввести имя пользователя и пароль. Укажите учетные данные, которые вы создали ранее, и браузер ответит, приветствуя вас по имени.

Ограничения

Самым большим недостатком базовой аутентификации доступа является тот факт, что учетные данные отправляются по сети в виде открытого текста. Этот тип аутентификации должен использоваться только с безопасными (то есть HTTPS) соединениями, чтобы предотвратить прослушивание. Если защищенное соединение недоступно, вместо него следует использовать более безопасную форму аутентификации.

Дайджест-аутентификация доступа

Дайджест-аутентификация доступа является более безопасной альтернативой базовой аутентификации. При дайджест-аутентификации пароли шифруются до передачи по сети.

Файл паролей

Дайджест-аутентификация также использует файл паролей. Однако формат файла немного отличается от формата, используемого для базовой аутентификации. Для работы с форматом файла паролей дайджеста мы будем использовать другую утилиту с именем htdigest . Установите htdigest с помощью следующей команды npm .

  npm install -g htdigest 

Затем создайте новый файл паролей с помощью команды, показанной ниже. Опять же, флаг -c используется для создания нового файла паролей с именем «htpasswd». На этот раз мы также должны указать область аутентификации. В этом случае область аутентификации — «Частная область». В этом примере имя пользователя снова «foo». Обратите внимание, что пароль не указан в команде. После ввода команды вам будет предложено ввести пароль.

  htdigest -c htpasswd "Частная зона" foo 

После запуска htdigest загляните внутрь нового файла «htpasswd». Запись для «foo» показана ниже. Файл дайджест-аутентификации содержит имя пользователя и зашифрованный пароль, а также область аутентификации, которая не была включена в базовый файл аутентификации.

  foo: Частная область: b8e1b1c08abcd38173a7dba3ad93a0c3 

Node.js Incorporation

Чтобы включить дайджест-аутентификацию на наш сервер, мы снова будем использовать модуль http-auth . Если вы следовали этому руководству, модуль должен быть уже установлен на вашем компьютере. Затем создайте новый файл с именем «digest_auth_server.js» для реализации вашего сервера. Код сервера показан ниже. Обратите внимание, что код сервера практически идентичен коду основного сервера аутентификации. Разница заключается в поле authType объекта конфигурации. В этом случае для authType было установлено "digest" . К этому серверу можно получить доступ так же, как к серверу базовой аутентификации.

 var http = require("http"); var auth = require("http-auth"); var digest = auth({ authRealm: "Private area", authFile: __dirname + "/htpasswd", authType: "digest" }); var server = http.createServer(function(request, response) { digest.apply(request, response, function(username) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello " + username); response.end(); }); }); server.listen(80); console.log("Server is listening"); 

Вывод

В этой статье были рассмотрены основы HTTP-аутентификации. Следуя приведенным здесь примерам, ваши приложения Node.js могут быть немного более безопасными. Однако вы должны знать, что одной аутентификации недостаточно. Если безопасность является основной проблемой, ваш сайт должен обслуживаться по HTTPS. В следующих статьях я рассмотрю HTTPS и многие другие замечательные возможности Node.js.

Если вам понравился этот пост, вам захочется узнать все о новейшей серии печатных и электронных книг SitePoint, Jump Start . Первый заголовок — Node.js Дона Нгуена — узнайте больше на SitePoint!