Система авторизации с использованием JWT (JSON Web Token) становится все более популярной благодаря своей простоте и удобству. В этом ответе мы рассмотрим, как реализовать такую систему на примере веб-приложения.

Шаг 1: Установка необходимых библиотек

  • Для начала нам понадобятся некоторые пакеты. Если вы используете Node.js, установите следующие библиотеки:
    • jsonwebtoken — для работы с JWT;
    • express — для создания сервера;
    • body-parser — для обработки входящих данных;
    • mongoose — для работы с базой данных MongoDB (если вы используете её).

Вы можете установить эти пакеты с помощью команды:

npm install jsonwebtoken express body-parser mongoose

Шаг 2: Создание сервера

Создайте файл server.js и настройте базовый сервер:

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const jwt = require('jsonwebtoken');

const app = express();
app.use(bodyParser.json());

// Подключение к базе данных
mongoose.connect('mongodb://localhost:27017/mydb', { useNewUrlParser: true, useUnifiedTopology: true });

app.listen(3000, () => {
    console.log('Сервер запущен на порту 3000');
});

Шаг 3: Создание модели пользователя

Создайте модель для пользователя в MongoDB:

const UserSchema = new mongoose.Schema({
    username: { type: String, required: true },
    password: { type: String, required: true }
});

const User = mongoose.model('User', UserSchema);

Шаг 4: Регистрация пользователя

Добавьте маршрут для регистрации пользователей:

app.post('/register', async (req, res) => {
    const { username, password } = req.body;
    const user = new User({ username, password });
    await user.save();
    res.status(201).send('Пользователь зарегистрирован');
});

Шаг 5: Авторизация и создание JWT

Добавьте маршрут для авторизации, который будет проверять учетные данные пользователя и выдавать токен:

app.post('/login', async (req, res) => {
    const { username, password } = req.body;
    const user = await User.findOne({ username, password });
    if (!user) {
        return res.status(401).send('Неверные учетные данные');
    }
    const token = jwt.sign({ id: user._id }, 'секретный_ключ', { expiresIn: '1h' });
    res.json({ token });
});

Шаг 6: Защита маршрутов с помощью JWT

Теперь давайте добавим защиту для некоторых маршрутов с помощью middleware:

function authenticateJWT(req, res, next) {
    const token = req.headers['authorization'];
    if (token) {
        jwt.verify(token, 'секретный_ключ', (err, user) => {
            if (err) {
                return res.sendStatus(403);
            }
            req.user = user;
            next();
        });
    } else {
        res.sendStatus(401);
    }
}

app.get('/protected', authenticateJWT, (req, res) => {
    res.send('Это защищенный маршрут');
});

Шаг 7: Запуск сервера

Теперь вы можете запустить сервер с помощью команды:

node server.js

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

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