JS: Express

Теория: Авторизация

Авторизация - это предоставление определённому лицу или группе лиц прав на выполнение определённых действий; а также процесс проверки (подтверждения) данных прав при попытке выполнения этих действий.

Ситуация, в которой термины используются неправильно, довольно распространена. Авторизация относится к списку таких терминов. Обычно ей называют аутентификацию. Об этом всегда стоит помнить, но мир (как минимум русскоязычный) уже не изменить.

Рассмотрим простой пример с использованием авторизации, удаление поста.

app.delete('/posts/:id', (req, res, next) => {
  if (res.locals.currentUser.isGuest()) {
    const error = new AccessDeniedError()
    return next(error)
  }
  state.posts = state.posts.filter(post =>
    !(post.id.toString() === req.params.id))
  res.redirect('/posts')
})

Удалить пост может только залогиненный пользователь. Все остальные (гости) должны получить в ответ 403 forbidden, код, который означает, что произошел отказ в доступе. В более сложных случаях нужно проверять, что пост может удалить только его автор. Любой сайт, сложнее чем сайт-визитка, содержит в себе множество проверок на допустимость тех или иных действий, что может привести к очень большому дублированию проверок по всем обработчикам. Разберём, как этого можно избежать.

Route Middlewares

// a middleware sub-stack shows request info for any
// type of HTTP request to the /user/:id path
router.use('/user/:id', (req, res, next) => {
  console.log('Request URL:', req.originalUrl)
  next()
}, (req, res, next) => {
  console.log('Request Type:', req.method)
  next()
})

Express позволяет указывать любое количество мидлвар для одного и того же маршрута. Для этого можно передать любое количество аргументов (являющихся мидлварами) в функцию use. Этим фактом мы и воспользуемся.

const requiredAuth = (req, res, next) => {
  if (res.locals.currentUser.isGuest()) {
    return next(new AccessDeniedError())
  }
  next()
}

app.delete('/posts/:id', requiredAuth, (req, res) => {
  state.posts = state.posts.filter(post =>
    !(post.id.toString() === req.params.id))
  res.redirect('/posts')
})

В примере выше определена мидлвара requiredAuth, которую можно подключать к любому маршруту. Она проверяет, залогинен ли пользователь или нет, если нет, то дальше по цепочке передаётся ошибка. Как мы уже знаем, это приводит к тому, что начинают выполняться только мидлвары, обрабатывающие ошибки. Этот механизм полезен не только для контроля доступа, таким образом можно выполнять любые подготовительные действия, которые используются разными маршрутами.

Завершено

0 / 13