Как работает механизм авторизации через токены (Bearer, JWT)?
Авторизация через токены является одним из основных подходов в современных веб-приложениях. Это позволяет клиентам получать доступ к защищённым ресурсам на сервере, не передавая учётные данные (логин и пароль) при каждом запросе. Давайте подробнее рассмотрим, как это работает, особенно в контексте двух популярных токенов: Bearer и JWT (JSON Web Token).
Что такое Bearer Token?
Bearer токен — это простая строка, которая используется для идентификации и авторизации пользователя. Когда пользователь проходит процесс аутентификации, сервер генерирует токен, который клиент сохраняет (обычно в локальном хранилище или куках). Этот токен затем отправляется вместе с каждым запросом к защищённому ресурсу в заголовке Authorization
.
Пример заголовка с Bearer токеном:
Authorization: Bearer <ваш_токен>
Что такое JWT?
JWT (JSON Web Token) — вариант Bearer токена, состоящий из трех частей: заголовка (header), полезной нагрузки (payload) и подписи (signature). Эти части отделяются друг от друга точками (.) и позволяют передавать информацию, связанную с пользователем.
Структура JWT:
Пример заголовка:
{
"alg": "HS256",
"typ": "JWT"
}
Пример полезной нагрузки:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Пример создания подписи (на Node.js):
const jwt = require('jsonwebtoken');
const secretKey = 'ваш_секретный_ключ';
const token = jwt.sign(payload, secretKey, { expiresIn: '1h' });
Процесс аутентификации
Authorization
с каждым последующим запросом к защищенным ресурсам.Пример реализации на Node.js с использованием Express
Вот простой пример сервера на Node.js с использованием Express, который демонстрирует аутентификацию через JWT.
const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;
const secretKey = 'ваш_секретный_ключ';
app.use(bodyParser.json());
app.post('/login', (req, res) => {
const { username, password } = req.body;
// Здесь нужно проверить учетные данные
if (username === 'user' && password === 'pass') {
const token = jwt.sign({ username }, secretKey, { expiresIn: '1h' });
return res.json({ token });
}
res.status(401).send('Неверные учетные данные');
});
app.get('/protected', (req, res) => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) return res.sendStatus(401);
jwt.verify(token, secretKey, (err, user) => {
if (err) return res.sendStatus(403);
res.json({ message: 'Вы получили доступ к защищенному ресурсу', user });
});
});
app.listen(port, () => {
console.log(`Сервер запущен на http://localhost:${port}`);
});
Заключение
Использование механизмов авторизации через токены, таких как Bearer и JWT, позволяет сделать взаимодействие между клиентом и сервером более безопасным и удобным. Понимание работы токенов и их реализации в вашем приложении — важный шаг для любого фронтенд-разработчика. Надеюсь, данная информация поможет вам лучше разобраться в этой теме!