Рубрики
Без рубрики

Создайте калькулятор CGPA с Adonisjs: аутентификация

Adonisjs – это Framework MVC Nodejs для построения приложений и API. Узнайте, как построить API калькулятора CGPA в этой серии.

Автор оригинала: Osinachi Chukwujama.

Привет, добро пожаловать на второе руководство в серии. Обратитесь к первому учебнику здесь Отказ Если вам понравится пропустить настройку, клонировать репо и оформить заказ к Начало работы ветка.

Аутентификация для API

Обеспечение API можно сделать несколькими способами. От ключей API до веб-токена JSON (JWT). Adonisjs настолько удивительно, что он настроен настроен с несколькими методами аутентификации. Мы будем использовать JWT для обеспечения наших API. Обратитесь к Adonisjs Документация по аутентификации для получения дополнительной информации. Первый шаг – изменить значение аутентификатора в auth.js из сессия к jwt Отказ

 - authenticator: 'session',
 - authenticator: 'jwt',

Теперь в Маршруты.js Файл, добавьте маршруты для регистрации и входа в систему.

  Route.post("register", "UserController.register").middleware("guest");
  Route.post("login", "UserController.login").middleware("guest");

CSRF защита

По словам Owasp.

Запрос на перекрестную площадку (CSRF) – это атака, которая заставляет конечный пользователь выполнять нежелательные действия в веб-приложении, в котором они в настоящее время аутентифицируются. Атаки CSRF в основном применяются к веб-формам (Post, Patch, Delete) и страницы (Get). Вот a Ответ в Stackoverflow Дальше объясняя это. Узнайте больше о CSRF из этого видео. ] Поскольку мы чисто строим API, нам не придется беспокоиться о CSRF, поэтому мы можем безопасно отключить его. В Shield.js Установите Включить Ключ CSRF поле до false.

  // shield.js
  csrf: {
    - enable: true,
    + enable: false,
    methods: ['POST', 'PUT', 'DELETE'],
    filterUris: [],
    cookieOptions: {
      httpOnly: false,
      sameSite: true,
      path: '/',
      maxAge: 7200
    }
  }

Автоматические маршруты

Мы начнем API версию справа от начала. Создайте группу auth с двумя почтовыми запросами.

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
# > Select controller type 
# ‣ For HTTP requests
#  For Websocket channel
# output
# ✔ create  app/Controllers/Http/UserController.js

Вы можете сократить это, чтобы

adonis make:controller User --type=http

Мы добавим регистр, логин и другие методы, касающиеся модели пользователя здесь.

Модели и таблицы

У Adonis есть провайдер баз данных под названием Lucid. Lucid используется для операций CRUD на таблицах. Если вы посмотрите в Приложение/Модели Каталог, вы найдете два файла: User.js и Token.js Отказ Эти модели представляют таблицы базы данных. Анализируя пользовательскую модель показывает, что эта модель расширяет класс модели, который находится из Lucid.

/** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */
const Model = use("Model");
class User extends Model { ... }

В идеале каждая созданная вами таблица должна быть создана из модели. Мы выполняем бизнес-логику в контроллерах с использованием моделей для упрощения операций CRUD.

Регистрация пользователя

Во-первых, импортируйте модульную модель пользователя, используя этот синтаксис.

const User = use("App/Models/User");

Добавьте этот метод к Usercontroller.js файл. Обратите внимание на auth, запрос и реагирование разрушенные объекты по методу. В отличие от в 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, используя электронную почту или приняв ОАУТ.

Данные запроса

Установка @ adonisjs/validator

Adonisjs предлагает первый пакет часть под названием ориентировочный для обработки проверки. Мы можем включить его в наш проект, используя пакет @ Adonisjs/Validator. Запустите эту команду, чтобы включить его

adonis install @adonisjs/validator
# Output
# [1/1] 📦  Dependencies installed [@adonisjs/validator]

Обратите внимание на использование adonis install. Он использует NPM под капотом и запускает некоторые инструкции на настройке в пакете, как инструкции по настройке открытия в вашем браузере. Теперь добавьте @ Adonisjs/Validator/Providers/ValidatorProvider к Поставщики Массив в Start/app.js Отказ Обратитесь к Валидатор документы для получения дополнительной информации.

Настройка проверки в usercontoller

Validateall Метод помогает нам подтвердить все поля перед разрешением. Требуется Validateall в Usercontroller.js Отказ

const { validateAll } = use("Validator");

Вот три шага для обработки проверки. Добавьте их в Регистрация () Метод:

  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",
      };

Тестирование того, что мы имеем до сих пор

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

Успешная регистрация .png.png.
Ошибка на регистрацию .png

Получение профиля пользователя (где auth входит в игру)

Чтобы получить профиль пользователя, мы сначала добавьте маршрут Get в маршруты.

  Route.get("/users/profile", "UserController.show").middleware(["auth"]);

Обратите внимание, что этот маршрут имеет прикрепленную промежуточную программу AUTH. Ошибка будет брошена для запросов без действительного токена JWT. Добавьте это шоу метод 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);
    }
  }

Чтобы проверить Get /пользователи/профиль Маршрут, мы добавляем JWT, полученные из регистрации или войти в заголовок запроса авторизации. В почтосемене мы делаем это на вкладке AUTH.

auth-shads.png.

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

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

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

Профиль здесь относится к первому значению и фамилию. Мы всегда можем больше полей, позже использующих миграции. Обратите внимание, как мы использовали user.save () Чтобы сохранить измененные значения в БД. Фигуры Adonis, если он собирается создать новую строку или обновить существующий. При успешном обновлении вы должны иметь ответ, похожий на. Обратите внимание на пароль, создавать_at и обновленные поля. Эти поля не нужны, особенно поля пароля. Мы исключаем эти поля от возвращения, добавив скрытую дому до получения пользовательской модели.

нежелательный - поле
  static get hidden() {
    return ["password", "created_at", "updated_at", "id"];
  }

Вы можете исключить удостоверение личности.

Обновление электронной почты

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

      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. Убедитесь, что вам требуется использовать хеш.

const Hash = use("Hash");

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

Реконструировать

  1. Как настроить аутентификацию JWT в Adonisjs
  2. Какой CSRF есть
  3. Как настроить контроллеры в Adonisjs
  4. Как обрабатывать проверку в методах контроллера Пожалуйста, укажите обратную связь в разделе «Комментарий», если вы столкнулись с любой проблемой. Дайте несколько лайков, я ценю это. Спасибо за следующее вместе. Adios ✌🏾🧡.