Демистифицируем проверку JWT в Mongoose с помощью TypeScript

Веб-токены JSON (JWT) широко используются в веб-приложениях для безопасной аутентификации и авторизации. При работе с Mongoose, популярной библиотекой сопоставления объектных данных (ODM) для MongoDB, важно понимать, как проверять JWT. В этой статье мы рассмотрим различные методы выполнения проверки JWT в Mongoose с использованием TypeScript и приведем примеры кода, которые помогут вам реализовать безопасную аутентификацию в ваших приложениях.

Метод 1: использование функции промежуточного программного обеспечения.
Одним из распространенных подходов является использование функции промежуточного программного обеспечения для проверки JWT при каждом запросе. Вот пример того, как это можно реализовать с помощью библиотеки jsonwebtoken:

import jwt from 'jsonwebtoken';
// Middleware function
const verifyToken = (req, res, next) => {
  const token = req.headers.authorization?.split(' ')[1];

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

  jwt.verify(token, 'your-secret-key', (err, decoded) => {
    if (err) {
      return res.status(403).json({ message: 'Failed to authenticate token' });
    }

    req.userId = decoded.userId;
    next();
  });
};
// Usage
app.get('/protected', verifyToken, (req, res) => {
  res.json({ message: 'Access granted' });
});

Метод 2: использование специального промежуточного программного обеспечения аутентификации.
Другой подход заключается в создании специального промежуточного программного обеспечения аутентификации, которое интегрируется с Mongoose. Этот метод позволяет вам получить доступ к данным аутентифицированного пользователя в ваших обработчиках маршрутов. Вот пример:

import jwt from 'jsonwebtoken';
import { User } from './models/user'; // Replace with your user model
// Custom authentication middleware
const authenticate = async (req, res, next) => {
  const token = req.headers.authorization?.split(' ')[1];

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

  try {
    const decoded = jwt.verify(token, 'your-secret-key');
    const user = await User.findById(decoded.userId);

    if (!user) {
      return res.status(403).json({ message: 'Invalid token' });
    }

    req.user = user;
    next();
  } catch (err) {
    return res.status(403).json({ message: 'Failed to authenticate token' });
  }
};
// Usage
app.get('/protected', authenticate, (req, res) => {
  res.json({ message: `Welcome, ${req.user.name}` });
});

Метод 3: использование подхода на основе промисов
Если вы предпочитаете работать с промисами вместо обратных вызовов, вы можете использовать библиотеку типа util.promisifyдля преобразования jwt.verifyфункция в обещание. Вот пример:

import jwt from 'jsonwebtoken';
import util from 'util';
const verifyTokenAsync = util.promisify(jwt.verify);
// Middleware function
const verifyToken = async (req, res, next) => {
  const token = req.headers.authorization?.split(' ')[1];

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

  try {
    const decoded = await verifyTokenAsync(token, 'your-secret-key');
    req.userId = decoded.userId;
    next();
  } catch (err) {
    return res.status(403).json({ message: 'Failed to authenticate token' });
  }
};
// Usage
app.get('/protected', verifyToken, (req, res) => {
  res.json({ message: 'Access granted' });
});

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

Не забудьте выбрать метод, который лучше всего соответствует потребностям вашего приложения и требованиям безопасности. Приятного кодирования!