среда, 13 ноября 2013 г.

Express JS Basic Authorizaton

Как сделать свою Basic Authorizaton в Express JS?

В Express.JS есть встроенный middleware для авторизации. Если необходимо заблокировать доступ к вашему приложению, то для этого нужно добавить всего лишь одну:

app.use(express.basicAuth('username', 'password'));

Так же Express JS поддерживает альтернативный вариант с вызовом функции-коллбэка:

app.use(express.basicAuth(function(user, pass, next) {
  var result = (user === 'testUser' && pass === 'testPass');
  next(null /* error */, result);
}));

Если нужно ограничить доступ только к определенным url'ам, то middleware basicAuth можно использовать не глобально, а только в рамках роутера:

var auth = express.basicAuth(function(user, pass, next) {
  var result = (user === 'testUser' && pass === 'testPass');
  next(null, result);
});

app.get('/home', auth, function(req, res) {
  res.send('Hello World');
});

basicAuth достался Express JS в наследство от connect. Она устроена достаточно просто.
Когда браузер запрашивает страницу у сервера, то сервер сообщает браузеру о необходимости авторизации с помощью заголовка WWW-Authenticate:
  res.statusCode = 401;
  res.setHeader('WWW-Authenticate', 'Basic realm="' + realm + '"');
  res.end('Unauthorized');

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

На этот раз запрос уже будет содержать заголовок:
Authorization:Basic dXNlcm5hbWU6cGFzc3dvcmQ=, где dXNlcm5hbWU6cGFzc3dvcmQ= - это строка 'username:password'.

В этом легко можно убедиться, если на сервере выполнить такую команду:

var str = new Buffer('dXNlcm5hbWU6cGFzc3dvcmQ=', 'base64').toString();
console.log(str); // выведет 'username:password'

Теперь браузер будет прикреплять эту строку к каждому запросу, а basicAuth будет проверять верные ли данные пользователя указаны в запросе.

Комментариев нет:

Отправить комментарий