Изпращане на данни от едно място на друго? За ваше собствено спокойствие и защита на вашите потребители трябва да го защитите с JWT.

Когато създавате приложение, жизненоважно е да защитите чувствителните данни от неоторизиран достъп. Много съвременни уеб, мобилни и облачни приложения използват REST API като основно средство за комуникация. В резултат на това е от решаващо значение да се проектират и разработват backend API със сигурност на преден план.

Един ефективен подход за защита на REST API включва JSON уеб токени (JWT). Тези токени предлагат стабилен механизъм за удостоверяване и оторизация на потребителите, като помагат за защита на защитените ресурси срещу достъп от злонамерени участници.

Какво представляват JSON уеб токените?

JSON уеб токен (JWT) е широко използван стандарт за сигурност. Той предоставя кратък, самостоятелен метод за сигурно предаване на данни между клиентско приложение и бекенд система.

REST API може да използва JWT за сигурно идентифициране и удостоверяване на потребителите, когато правят HTTP заявки за достъп до защитени ресурси.

instagram viewer

JSON Web Token се състои от три отделни части: заглавка, полезен товар и подпис. Той кодира всяка част и ги свързва с точка (".").

Заглавката описва криптографския алгоритъм, използван за подписване на токена, докато полезният товар съдържа данни за потребителя и всички допълнителни метаданни.

И накрая, подписът, изчислен с помощта на заглавката, полезния товар и секретния ключ, гарантира целостта и автентичността на токена.

След като сме изчерпали основите на JWT, нека изградим Node.js REST API и внедрим JWT.

Настройте Express.js приложение и MongoDB база данни

Тук ще разберете как да създадете проста автентификация REST API който обработва функциите както за регистрация, така и за влизане. След като процесът на влизане удостовери потребителя, той трябва да може да прави HTTP заявки към защитен API маршрут.

Можете да намерите кода на проекта тук GitHub хранилище.

За да започнете, създайте експресен уеб сървъри инсталирайте тези пакети:

npm инсталирайте cors dotenv bycrpt mongoose cookie-parser crypto jsonwebtoken mongodb

Следващия, създайте база данни MongoDB или конфигурирайте MongoDB клъстер в облака. След това копирайте низа за връзка с базата данни, създайте a .env файл в главната директория и поставете низа за връзка:

CONNECTION_STRING="низ за свързване"

Конфигурирайте връзката към базата данни

Създайте нов utils/db.js файл в основната директория на папката на вашия проект. В този файл добавете следния код, за да установите връзката с базата данни с помощта на Mongoose.

конст мангуста = изискват("мангуста");

конст connectDB = асинхронен () => {
опитвам {
изчакайте mongoose.connect (process.env. CONNECTION_STRING);
конзола.log(„Свързан с MongoDB!“);
} улов (грешка) {
конзола.грешка(„Грешка при свързване с MongoDB:“, грешка);
}
};

модул.exports = connectDB;

Дефинирайте модела на данни

Дефинирайте проста схема на потребителски данни с помощта на Mongoose. В основната директория създайте нова модел/user.model.js файл и добавете следния код.

конст мангуста = изискват("мангуста");

конст потребителска схема = нов мангуста. Схема ({
потребителско име: низ,
парола: {
Тип: низ,
задължително: вярно,
единствен по рода си: вярно,
},
});

конст Потребител = mongoose.model("Потребител", потребителска схема);
модул.exports = потребител;

Дефинирайте контролерите за API маршрутите

Функциите на контролера ще управляват регистрацията и влизането; те са съществена част от тази примерна програма. В основната директория създайте a контролери/userControllers.js файл и добавете следния код:

  1. Дефинирайте контролера за регистрация на потребители.
    конст Потребител = изискват('../models/user.model');
    конст bcrypt = изискват('bcrypt');
    конст {generateToken} = изискват('../среден софтуер/auth');

    exports.registerUser = асинхронен (req, res) => {
    конст {потребителско име, парола} = req.body;

    опитвам {
    конст хеш = изчакайте bcrypt.hash (парола, 10);
    изчакайте User.create({ потребителско име, парола: хеш });
    res.status(201).изпрати({ съобщение: „Потребителят се регистрира успешно“ });
    } улов (грешка) {
    конзола.log (грешка);
    res.status(500).изпрати({ съобщение: 'Възникна грешка!! ' });
    }
    };

    Този кодов фрагмент хешира предоставената парола с помощта на bcrypt и след това създава нов потребителски запис в базата данни, съхранявайки потребителското име и хешираната парола. Ако регистрацията е успешна, той изпраща отговор със съобщение за успех.
  2. Дефинирайте контролер за влизане, за да управлявате процеса на влизане на потребителя:
    exports.loginUser = асинхронен (req, res) => {
    конст {потребителско име, парола} = req.body;

    опитвам {
    конст потребител = изчакайте User.findOne({потребителско име});

    ако (!потребител) {
    връщане res.status(404).изпрати({ съобщение: „Потребителят не е намерен“ });
    }

    конст PasswordMatch = изчакайте bcrypt.compare (парола, потребителска.парола);

    ако (!passwordMatch) {
    връщане res.status(401).изпрати({ съобщение: „Невалидни идентификационни данни за вход“ });
    }

    конст полезен товар = { userId: user._id};
    конст токен = генерира Токен (полезен товар);
    res.cookie('token', токен, { Само http: вярно });
    res.status(200).json({ съобщение: 'Успешен вход'});
    } улов (грешка) {
    конзола.log (грешка);
    res.status(500).изпрати({ съобщение: „Възникна грешка при влизане“ });
    }
    };

    Когато потребител изпрати заявка до /login маршрут, те трябва да предадат своите идентификационни данни в тялото на заявката. След това кодът проверява тези идентификационни данни и генерира JSON уеб токен. Токенът се съхранява сигурно в бисквитка с Само http флагът е зададен на true. Това предотвратява достъпа на JavaScript от страна на клиента до токена, като предпазва от потенциални атаки със скриптове между сайтове (XSS).
  3. И накрая, дефинирайте защитен маршрут:
    exports.getUsers = асинхронен (req, res) => {
    опитвам {
    конст потребители = изчакайте User.find({});
    res.json (потребители);
    } улов (грешка) {
    конзола.log (грешка);
    res.status(500).изпрати({ съобщение: 'Възникна грешка!!' });
    }
    };
    Чрез съхраняване на JWT в бисквитка, следващите заявки за API от удостоверения потребител автоматично ще включват токена, позволявайки на сървъра да валидира и оторизира заявките.

Създайте мидълуер за удостоверяване

Сега, след като сте дефинирали контролер за влизане, който генерира JWT токен при успешно удостоверяване, дефинирайте функции за удостоверяване на междинен софтуер, които ще генерират и проверяват JWT токена.

В главната директория създайте нова папка, междинен софтуер. В тази папка добавете два файла: auth.js и config.js.

Добавете този код към config.js:

конст крипто = изискват("крипто");

модул.exports = {
secretKey: crypto.randomBytes(32).toString(шестнадесетичен)
};

Този код генерира нов произволен таен ключ при всяко изпълнение. След това можете да използвате този таен ключ, за да подпишете и проверите автентичността на JWT. След като потребителят бъде успешно удостоверен, генерирайте и подпишете JWT със секретния ключ. След това сървърът ще използва ключа, за да провери дали JWT е валиден.

Добавете следния код auth.js който дефинира функции на междинен софтуер, които генерират и проверяват JWT.

конст jwt = изискват('jsonwebtoken');
конст { секретен ключ } = изискват('./config');

конст generateToken = (полезен товар) => {
конст токен = jwt.sign (полезен товар, secretKey, { изтича на: „1ч“ });
връщане токен ;
};

конст verifyToken = (req, res, next) => {
конст токен = req.cookies.token;

ако (!токен) {
връщане res.status(401).json({ съобщение: „Не е предоставен токен“ });
}

jwt.verify (token, secretKey, (грешка, декодирано) => {
ако (грешка) {
връщане res.status(401).json({ съобщение: 'Невалиден Жетон' });
}

req.userId = decoded.userId;
следващия();
});
};

модул.exports = {generateToken, verifyToken};

The generateToken функцията генерира JWT, като подписва полезен товар с помощта на таен ключ и задава време на изтичане, докато verifyToken функция служи като междинен софтуер за проверка на автентичността и валидността на предоставен токен.

Дефинирайте API маршрутите

Създайте нов маршрути/userRoutes.js файл в основната директория и добавете следния код.

конст експрес = изискват("експресен");
конст рутер = експрес. Рутер();
конст потребителски контролери = изискват('../controllers/userControllers');
конст { verifyToken } = изискват('../среден софтуер/auth');
router.post('/api/register', userControllers.registerUser);
router.post('/api/login', userControllers.loginUser);
router.get('/api/потребители', verifyToken, userControllers.getUsers);
модул.exports = рутер;

Актуализирайте вашата входна точка на сървъра

Актуализирайте своя server.js файл със следния код.

конст експрес = изискват("експресен");
конст корс = изискват("корс");
конст приложение = експрес();
конст порт = 5000;
изискват('dotenv').config();
конст connectDB = изискват('./utils/db');
конст cookieParser = изискват("cookie-parser");

свържетеDB();

app.use (express.json());
app.use (express.urlencoded({ удължен: вярно }));
app.use (cors());
app.use (cookieParser());
конст userRoutes = изискват('./routes/userRoutes');
app.use('/', userRoutes);

app.listen (порт, () => {
конзола.log(`Сървърът слуша http://localhost:${порт}`);
});

За да тествате REST API, завъртете сървъра за разработка и направете API заявки към дефинираните крайни точки:

възел server.js

Защита на Node.js REST API

Защитата на Node.js REST API надхвърля само използването на JWT, въпреки че те играят решаваща роля в удостоверяването и оторизация, от съществено значение е да възприемете холистичен подход за сигурност към сигурността, за да защитите вашия бекенд системи. Наред с JWT, трябва също да обмислите внедряване на HTTPS за криптиране на комуникация, валидиране и дезинфекция на въвеждане и много други.

Чрез комбиниране на множество мерки за сигурност можете да създадете стабилна рамка за сигурност за вашия Node.js REST API и минимизиране на риска от неоторизиран достъп, пробиви на данни и друга защита заплахи.