Создайте калькулятор 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() метод:

  1. Определить правила
      const rules = {
        email: "required|email|unique:users,email",
        password: "required|min:8"
      };
  1. Проверить данные запроса
      const validation = await validateAll(request.all(), rules);
  1. Возвращать ошибки проверки, если таковые имеются
      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.
Вот что вернет успешная регистрация
успешная регистрация.png
А вот так должна выглядеть попытка регистрации с сообщениями об ошибках
ошибки при регистрации.png
Обратите внимание, что ошибки возвращаются в формате 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.
авторизация-steps.png

Обработка обновления профиля

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

  1. /пользователи/профиль
  2. /пользователи/электронная почта
  3. /пользователи/пароль
    Я разберусь с первым и вторым. Вы можете попробовать третий самостоятельно. Вы всегда можете проверить, что я сделал в 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 рассчитывает, собирается ли он создать новую строку или обновить существующую.
При успешном обновлении вы должны получить ответ, похожий на.
нежелательные поля.png
Обратите внимание на поля 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");

Это подводит нас к концу руководства по аутентификации. Оформить заказ в ветке аутентификации на этом гитхаб репозиторий если вам нужен полный код. Давайте подытожим то, что мы узнали до сих пор.

Резюме

  1. Как настроить JWT-аутентификацию в AdonisJS
  2. Что такое CSRF
  3. Как настроить контроллеры в AdonisJS
  4. Как обрабатывать проверку в методах контроллера
    Пожалуйста, оставьте отзыв в разделе комментариев, если вы столкнулись с какой-либо проблемой. Поставьте несколько лайков, мне приятно. Спасибо, что последовали за нами. Адиос ✌🏾🧡.

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

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

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