Создайте калькулятор CGPA с помощью AdonisJS: аутентификация
Привет, добро пожаловать во второй туториал из этой серии. Обратитесь к первому учебнику здесь. Если вы хотите пропустить установку, клонируйте репо и оформить заказ в начиная ответвляться.
Аутентификация для API
Защитить API можно несколькими способами. От ключей API до JSON Web Token (JWT). AdonisJS настолько великолепен, что поставляется с несколькими методами аутентификации. Мы будем использовать JWT для защиты наших API. Обратитесь к AdonisJS документация по аутентификации для получения дополнительной информации.
Первый шаг — изменить значение аутентификатора в auth.js с session
к jwt
.
- authenticator: 'session',
- authenticator: 'jwt',
Теперь, в routes.js
файл, добавьте маршруты для регистрации и входа.
Route.post("register", "UserController.register").middleware("guest");
Route.post("login", "UserController.login").middleware("guest");
CSRF-защита
Согласно с ОВАПС
Подделка межсайтовых запросов (CSRF) — это атака, которая заставляет конечного пользователя выполнять нежелательные действия в веб-приложении, в котором он в настоящее время аутентифицирован.
CSRF-атаки в основном применяются к веб-формам (POST, PATCH, DELETE) и страницам (GET). Вот Ответ StackOverflow дальнейшее объяснение этого. Узнайте больше о CSRF из этого видео.
%[https://www.youtube.com/watch?v=eWEgUcHPle0]
Поскольку мы создаем только API, нам не нужно беспокоиться о CSRF, поэтому мы можем безопасно отключить его. Вshield.js
установитьenable
ключcsrf
поле в ложь.
csrf: {
- enable: true,
+ enable: false,
methods: ['POST', 'PUT', 'DELETE'],
filterUris: [],
cookieOptions: {
httpOnly: false,
sameSite: true,
path: '/',
maxAge: 7200
}
}
Маршруты авторизации
Мы начнем управление версиями API с самого начала. Создайте группу авторизации с двумя запросами POST.
Route.group(() => {
Route.post("register", "UserController.register").middleware("guest");
Route.post("login", "UserController.login").middleware("guest");
}).prefix("api/v1");
К этим маршрутам привязано промежуточное ПО («гость»). Это означает, что будут работать только запросы без действительного JWT. По сути, эти маршруты выставлены на всеобщее обозрение. Обратите внимание на использование UserController
. Это означает, что эти маршруты будут обрабатываться методами регистрации и входа в систему пользовательского контроллера, который мы создадим чуть позже.
Пользовательский контроллер
Создайте пользовательский контроллер, запустив. При появлении запроса выберите HTTP-запросы.
adonis make:controller User
Вы можете сократить это до
adonis make:controller User --type=http
Сюда мы добавим регистрацию, логин и другие методы, относящиеся к модели User.
Модели и таблицы
У Adonis есть провайдер базы данных под названием Lucid. Lucid используется для операций CRUD над таблицами. Если вы посмотрите в app/Models
каталог, вы найдете два файла: User.js
а также Token.js
. Эти модели представляют таблицы базы данных. Анализ модели User показывает, что эта модель расширяет класс Model от Lucid.
const Model = use("Model");
class User extends Model { ... }
В идеале каждая таблица, которую вы создаете, должна быть создана из модели. Мы выполняем бизнес-логику в контроллерах, используя модели для упрощения операций CRUD.
Регистрация пользователя
Сначала импортируйте модель User Lucid, используя этот синтаксис.
const User = use("App/Models/User");
Добавьте этот метод в UserController.js
файл. Обратите внимание на деструктурированные объекты аутентификации, запроса и ответа в методе. В отличие от ExpressJS, метод auth доступен для всех методов контроллера.
async register({ auth, request, response }) {
try {
const { email, password } = request.all();
const user = await User.create({
email,
password,
});
const authedUser = await auth.withRefreshToken().attempt(email, password);
return response.status(201).send(authedUser);
} catch (error) {
console.log(error);
return response.status(500).send(error);
}
}
Пользователь создается с User.create
и аутентифицируется с использованием их электронной почты и пароля.
Логин пользователя
Добавьте этот метод ниже метода регистрации
async login({ auth, request, response }) {
try {
const { email, password } = request.all();
const authedUser = await auth.withRefreshToken().attempt(email, password);
return response.status(200).send(authedUser);
} catch (error) {
return response.status(404).send(error);
}
}
Заметили, насколько небезопасен API? Если пользователь потеряет свой пароль, злоумышленник может выполнить вредоносные действия с учетной записью пользователя. Мы можем решить эту проблему, добавив 2FA с помощью электронной почты или внедрив OAuth.
Проверка данных запроса
Установка @adonisjs/валидатора
AdonisJS предлагает первую часть пакета под названием ориентировочный для обработки проверки. Мы можем включить его в наш проект с помощью пакета @adonisjs/validator. Запустите эту команду, чтобы включить ее
adonis install @adonisjs/validator
Обратите внимание на использование Adonis install. Он использует npm под капотом и запускает некоторые инструкции по установке внутри пакета, такие как открытие инструкций по установке в вашем браузере. Теперь добавьте @adonisjs/validator/providers/ValidatorProvider
к providers
массив в start/app.js
. Обратитесь к документы валидатора для получения дополнительной информации.
Настройка проверки в UserContoller
подтвердить все Метод помогает нам проверить все поля перед разрешением. Требовать validateAll
в UserController.js
.
const { validateAll } = use("Validator");
Вот три шага для обработки проверки. Добавьте их в register()
метод:
- Определить правила
const rules = {
email: "required|email|unique:users,email",
password: "required|min:8"
};
- Проверить данные запроса
const validation = await validateAll(request.all(), rules);
- Возвращать ошибки проверки, если таковые имеются
if (validation.fails()) {
return response.status(400).send(validation.messages());
}
Убедитесь, что вы делаете все это выше создания пользователя.
const user = await User.create({
email,
password,
});
Выполните те же действия для метода входа, но вместо этого используйте эти правила.
const rules = {
email: "required|email",
password: "required",
};
Тестируем то, что есть на данный момент
Убедитесь, что ваш сервер работает. Протестируйте маршруты /register и /login с помощью вашего любимого приложения для тестирования API.
Вот что вернет успешная регистрация
А вот так должна выглядеть попытка регистрации с сообщениями об ошибках
Обратите внимание, что ошибки возвращаются в формате JSON. Вам решать либо изменить эти сообщения об ошибках, чтобы они подходили потребителю API, либо вернуть их как есть.
Получение профиля пользователя (где в игру вступает авторизация)
Чтобы получить профиль пользователя, мы сначала добавляем маршрут GET в route.js.
Route.get("/users/profile", "UserController.show").middleware(["auth"]);
Обратите внимание, что к этому маршруту подключено промежуточное ПО аутентификации. Ошибка будет вызвана для запросов без действительного токена JWT. Добавьте этот метод show в UserController.js.
async show({ auth, response }) {
try {
const user = await auth.user;
return response.status(200).send(user);
} catch (error) {
return response.status(500).send(error);
}
}
Чтобы проверить ПОЛУЧИТЬ /users/profile
маршрут, мы добавляем JWT, полученный от регистрации или входа в заголовок запроса авторизации. В почтальоне мы делаем это на вкладке Auth.
Обработка обновления профиля
Пользователь должен пройти аутентификацию, чтобы обновить свой профиль. У нас есть несколько маршрутов, обрабатывающих обновления профилей.
- /пользователи/профиль
- /пользователи/электронная почта
- /пользователи/пароль
Я разберусь с первым и вторым. Вы можете попробовать третий самостоятельно. Вы всегда можете проверить, что я сделал вauthentication
филиал этого репо для полного кода.
Прежде всего, добавьте эти маршруты в файл route.js.
Route.patch("/users/profile", "UserController.updateProfile").middleware([
"auth",
]);
Route.patch("/users/email", "UserController.updateEmail").middleware([
"auth",
]);
Route.patch("/users/password", "UserController.updatePassword").middleware([
"auth",
]);
Обновление профиля
Мы будем использовать описанный ниже метод для обновления профиля пользователя.
async updateProfile({ auth, request, response }) {
try {
const { firstName, lastName } = request.all();
const rules = {
firstName: "required",
lastName: "required",
};
const validation = await validateAll(request.all(), rules);
if (validation.fails()) {
return response.status(400).send(validation.messages());
}
const user = await auth.user;
user.firstName = firstName;
user.lastName = lastName;
await user.save();
return response.status(200).send(user);
} catch (error) {
return response.status(500).send(error);
}
}
Профиль здесь относится к firstName и lastName. Мы всегда можем добавить больше полей позже, используя миграции. Обратите внимание, как мы использовали user.save()
чтобы сохранить измененные значения в БД. Adonis рассчитывает, собирается ли он создать новую строку или обновить существующую.
При успешном обновлении вы должны получить ответ, похожий на.
Обратите внимание на поля password, created_at и updated_at. Эти поля не нужны, особенно поле пароля. Мы исключаем эти поля из возврата, добавляя скрытый геттер в модель пользователя.
static get hidden() {
return ["password", "created_at", "updated_at", "id"];
}
Вы также можете исключить идентификатор.
Обновление электронной почты
Чтобы обновить электронную почту, мы выполняем те же действия, что и выше. Только diff здесь правила
const rules = {
email: "required|email|unique:users,email",
};
и логика сохранения
const user = await auth.user;
user.email = email;
await user.save();
Обновление пароля
Вы можете обрабатывать логику нового пароля по своему усмотрению. Вот фрагмент для проверки того, что текущий пароль соответствует новому.
const passwordsMatch = await Hash.verify(currentPassword, user.password)
if (!passwordsMatch) {
return response.status(400).send("Supplied password is wrong");
}
Хэш является частью встроенных помощников Adonis. Убедитесь, что вам требуется использование Hash.
const Hash = use("Hash");
Это подводит нас к концу руководства по аутентификации. Оформить заказ в ветке аутентификации на этом гитхаб репозиторий если вам нужен полный код. Давайте подытожим то, что мы узнали до сих пор.
Резюме
- Как настроить JWT-аутентификацию в AdonisJS
- Что такое CSRF
- Как настроить контроллеры в AdonisJS
- Как обрабатывать проверку в методах контроллера
Пожалуйста, оставьте отзыв в разделе комментариев, если вы столкнулись с какой-либо проблемой. Поставьте несколько лайков, мне приятно. Спасибо, что последовали за нами. Адиос ✌🏾🧡.