JWT, или JSON Web Token, — это компактное, безопасное для URL-адресов средство представления претензий, которые должны быть переданы между двумя сторонами. В контексте аутентификации JWT используются для безопасной передачи информации о личности пользователя от клиента к серверу. JWT состоит из трех частей: заголовка, полезной нагрузки и подписи.

Заголовок содержит информацию о типе токена и алгоритме его подписи.

Полезная нагрузка содержит утверждения или передаваемую информацию, такую как идентификатор пользователя, имя и адрес электронной почты.

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

Сообщение в блоге Создание и проверка веб-токенов JSON (JWT) в Node.js описывает концепцию JWT более подробно.

Зачем использовать JWT для бессерверных приложений?

Есть несколько причин, по которым вы можете использовать JWT для своего бессерверного приложения:

  • Масштабируемость. Поскольку токены JWT являются автономными, их можно легко передавать между серверами, что позволяет легко масштабировать ваше бессерверное приложение.
  • Переносимость: JWT можно легко передавать между клиентом и сервером, что упрощает создание приложений, работающих на разных платформах.
  • Безопасность: JWT подписаны, что означает, что они не могут быть изменены без обнаружения, что затрудняет взлом вашего приложения злоумышленниками.

Добавление аутентификации на основе токенов JWT в ваше бессерверное приложение

В этом разделе мы рассмотрим шаги по добавлению аутентификации на основе токенов JWT в ваше бессерверное приложение.

  1. Создайте веб-токен JSON

Первым шагом в добавлении аутентификации на основе токенов JWT является создание веб-токена JSON. Вы можете сделать это с помощью такой библиотеки, как jsonwebtoken в Node.js. В следующем коде показано, как создать токен JWT:

const jwt = require('jsonwebtoken')

const payload = {
  id: user.id,
  email: user.email
}

const secret = 'yourSecretKey'

const options = {
  expiresIn: '1h'
}

const token = jwt.sign(payload, secret, options)

В приведенном выше коде мы определяем полезную нагрузку, содержащую идентификатор пользователя и адрес электронной почты. Затем мы подписываем полезную нагрузку с помощью секретного ключа и указываем срок действия токена.

  1. Отправить токен JWT клиенту

Создав токен JWT, вы можете отправить его клиенту как часть ответа на успешный запрос на вход. Например:

app.post('/login', (req, res) => {
  // Verify user credentials
  if (user) {
    const token = jwt.sign({ id: user.id, email: user.email }, secret, options)
    res.json({ token })
  } else {
    res.status(401).json({ message: 'Unauthorized' })
  }
})
  1. Проверьте токен JWT на сервере

Как только клиент получил токен JWT, он должен передаваться обратно на сервер с каждым последующим запросом. Затем сервер должен проверить токен, чтобы убедиться, что пользователь авторизован для доступа к запрошенному ресурсу. Чтобы проверить токен JWT на сервере, вы можете использовать библиотеку jsonwebtoken в Node.js, как показано в следующем коде:

app.use((req, res, next) => {
  const token = req.headers['x-access-token']

  if (!token) {
    return res.status(401).json({ message: 'Unauthorized' })
  }

  jwt.verify(token, secret, (err, decoded) => {
    if (err) {
      return res.status(401).json({ message: 'Unauthorized' })
    }

    req.user = decoded;
    next()
  })
})

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

Завершение

Мы рассмотрели основы JWT и то, как добавить аутентификацию на основе токенов JWT в ваше бессерверное приложение с помощью JavaScript и бессерверной среды.

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

Первоначально опубликовано в Brian Cline.