Реализация аутентификации пользователей в Express.js с использованием JWT

Как защитить API GraphQL: реализация аутентификации пользователей в Express.js с использованием JWT. Рисунок 1.

GraphQL — популярная альтернатива традиционным архитектурам RESTful API, обеспечивающая гибкий и эффективный запрос данных для API. Учитывая растущую популярность API GraphQL, приоритет безопасности API-интерфейсов GraphQL становится все более важным для защиты приложений от несанкционированного доступа и потенциальных утечек данных.

Одним из эффективных методов защиты GraphQL API является внедрение веб-токенов JSON (JWT). JWT предоставляет безопасный и эффективный метод предоставления доступа к защищенным ресурсам и выполнения авторизованных действий, обеспечивая безопасную связь между клиентом и API.

Аутентификация и авторизация в GraphQL API

В отличие от REST API, API GraphQL часто имеют одну конечную точку, что позволяет клиентам динамически запрашивать различные объемы данных в своих запросах. Хотя гибкость является ее сильной стороной, она также увеличивает риск атак на систему безопасности, таких как уязвимости контроля доступа.

Как защитить API GraphQL: реализация аутентификации пользователей в Express.js с использованием JWT. Рисунок 2.

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

Настройте сервер Express.js Apollo

Apollo Server — это широко используемая серверная реализация GraphQL API. Вы можете использовать его, чтобы легко создавать схемы GraphQL, определять преобразователи и управлять другими источниками данных для вашего API.

Чтобы настроить Express.js Apollo, создайте и откройте папку проекта:

mkdirgraphql-API-jwt cdgraphql-API-jwt

Затем запустите эту команду, чтобы инициализировать новый проект Node.js с помощью npm, менеджера пакетов Node:

НПМ инициализация –да

Теперь установите эти пакеты:

npm установить apollo-servergraphql mongoose jsonwebtokens dotenv

Наконец, создайте файл server.js в корневом каталоге и настройте свой сервер с помощью кода:

const { ApolloServer } = require(‘аполлон-сервер’); const mongoose = require(‘mongoose’); require(‘dotenv’).config(); const typeDefs = require(“./graphql/typeDefs”); constsolvers = require(“./graphql/resolvers”); const server = new ApolloServer({ typeDefs, Resolvers, context: ({req }) => ({req }), }); const MONGO_URI =process.env.MONGO_URI; mongoose .connect(MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true, }) .then(() => { console.log(“Connected to DB”); return server.listen({port: 5000 }); }) .then((res) => { console.log(`Сервер работает по адресу ${res.url}`); }) .catch(err => { console.log(err.message); });

Сервер GraphQL настроен с параметрами typeDefs и Resolvers, которые определяют схему и операции, которые может обрабатывать API. Параметр context настраивает объект req в соответствии с контекстом каждого преобразователя, что позволяет этому серверу получать доступ к конкретным деталям запроса, таким как значения заголовка.

Создать базу данных MongoDB

Чтобы установить соединение с базой данных, сначала создайте базу данных MongoDB или настройте ее в MongoDB Atlas. Затем скопируйте предоставленную строку URL-адреса подключения к базе данных, создайте файл .env и введите соединение следующим образом:

МОНГО_URI=””

Определить образцы данных

Определите образец данных с помощью Mongoose. Создайте новый файл models/user.js и включите следующий код:

const {модель, схема} = require(‘мангуст’); const userSchema = новая схема ({имя: строка, пароль: строка, роль: строка }); модуль.экспорт = модель(‘пользователь’, userSchema);

Определить схему GraphQL

В API GraphQL схема определяет структуры данных, к которым можно запрашивать, а также описывает доступные операции (запросы и мутации), которые вы можете выполнять для взаимодействия с данными через API.

Чтобы определить схему, создайте новую папку в корневом каталоге проекта и назовите ееgraphql. Внутри этой папки добавьте два файла: typeDefs.js иsolvers.js.

В файл typeDefs.js включите следующий код:

const {gql} = require(“Аполлон-сервер”); const typeDefs = gql` type User {id: ID! имя: Строка! пароль: Строка! роль: Струна! } ввод UserInput {имя: String! пароль: Строка! роль: Струна! } type TokenResult {сообщение: String token: String } type Query {users: (User) } type Mutation { Register(userInput: UserInput): Логин пользователя(имя: String!, пароль: String!, роль: String!): TokenResult } `; модуль.экспорт = typeDefs;

Создайте преобразователи для GraphQL API

Функции преобразователя определяют, как получать данные в ответ на запросы и изменения клиента, а также другие поля, определенные в схеме. Когда клиент отправляет запрос или мутацию, сервер GraphQL запускает соответствующие преобразователи для обработки и возврата необходимых данных из различных источников, таких как базы данных или API.

Чтобы выполнить аутентификацию и авторизацию с использованием веб-токенов JSON (JWT), определите преобразователи для мутаций регистрации и входа в систему. Они будут обрабатывать процессы регистрации и аутентификации пользователей. Затем создайте преобразователь запросов, который извлекает данные, доступ к которым могут получить только прошедшие проверку подлинности и авторизованные пользователи.

Но сначала определите функции для создания и проверки JWT. В файлеsolvers.js начните с добавления следующего импорта.

const User = require(“./models/user”); const jwt = require(‘jsonwebtoken’); const secretKey =process.env.SECRET_KEY;

Обязательно добавьте секретный ключ, который вы будете использовать для регистрации веб-токена JSON, в файл .env.

SECRET_KEY = ”;

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

functiongenerateToken(user) { const token = jwt.sign({ id: user.id, role: user.role }, secretKey, { expiresIn: ‘1h’, алгоритм: ‘HS256’ }); вернуть токен; }

Теперь реализуйте логику проверки токенов, чтобы проверять токены, включенные в последующий HTTP-запрос.

functionverifyToken(token) { if (!token) { throw new Error(‘Токен не предоставлен’); } попробуйте { const decoded = jwt.verify(token, secretKey, {алгоритмы: (‘HS256’) }); возврат декодированный; } catch (err) { throw new Error(‘Неверный токен’); } }

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

Определить API преобразователя

Чтобы проверить преобразователь для API GraphQL, вам необходимо указать конкретные операции, которыми он будет управлять. Вот регистрация пользователя и активность входа в систему. Сначала создайте объект преобразователей, содержащий функции преобразователя, затем определите следующие операции мутации:

constsolvers = {Мутация: {регистрация: async (_, {userInput: {имя, пароль, роль } }) => { if (!name || !password || !role) { throw new Error(‘Name пароль, и требуемая роль’); } const newUser = новый пользователь ({имя: имя, пароль: пароль, роль: роль, }); попробуйте {const ответ = ожидайте newUser.save(); return {id: response._id, .response._doc, }; } catch (ошибка) { console.error(ошибка); выдать новую ошибку («Не удалось создать пользователя»); } }, вход: async (_, {имя, пароль }) => { try { const user = await User.findOne({ name: name }); if (!user) { throw new Error(‘Пользователь не найден’); } if (password !== user.password) { throw new Error(‘Неправильный пароль’); } Константный токен = GenerateToken (пользователь); if (!token) { throw new Error(‘Не удалось сгенерировать токен’); } return {сообщение: «Вход успешен», токен: токен, }; } catch (ошибка) { console.error(ошибка); выдать новую ошибку («Ошибка входа»); } } },

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

Теперь включает преобразователь запросов для получения пользовательских данных. Чтобы гарантировать, что этот запрос будет доступен только прошедшим проверку подлинности и авторизованным пользователям, включите логику авторизации, чтобы ограничить доступ только пользователям с правами администратора.

По сути, запрос сначала проверяет достоверность токена, а затем роль пользователя. Если проверка авторизации прошла успешно, запрос преобразователя продолжит извлекать и возвращать данные пользователя из базы данных.

Запрос: {users: async (parent, args, context) => { try { const token = context.req.headers.authorization || ”; const decodedToken =verifyToken(токен); if (decodedToken.role !== ‘Admin’) { throw new (“Несанкционировано. Только администраторы могут получить доступ к этим данным.’); } constusers = await User.find({}, {name: 1, _id: 1, role:1 }); вернуть пользователей; } catch (ошибка) { console.error(ошибка); выдать новую ошибку («Не удалось получить пользователей»); } }, }, };

Наконец, запустите сервер программирования:

узел server.js

Теперь пришло время протестировать функциональность API, используя изолированную программную среду Apollo Server API в вашем браузере. Например, вы можете использовать регистр мутаций для добавления новых данных пользователя в базу данных, а затем войти в систему мутации для аутентификации пользователя.

Как защитить API GraphQL: реализация аутентификации пользователей в Express.js с использованием JWT. Рисунок 3.

Наконец, добавьте токен JWT в заголовок авторизации и продолжайте запрашивать пользовательские данные в базе данных.

Как защитить GraphQL API: реализация аутентификации пользователей в Express.js с использованием JWT. Рисунок 4.

Готово! Надеюсь, статья окажется для вас полезной.

В приведенной выше статье вы познакомились с «Как защитить API GraphQL: реализация аутентификации пользователей в Express.js с использованием JWT». СоветыНадейтесь, что эта статья вам поможет! Если эта статья кажется вам интересной и полезной, не забудьте поделиться ею. Спасибо!

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *