Как настроить аутентификацию с помощью Node.js CLI и Prisma


Первоначально опубликовано на DevDojo

Здравствуйте! Сегодня мы будем интегрировать аутентификацию пользователей в ваш Node.js CLI, мы также рассмотрим, как создать аутентификатор, и сделаем API для аутентификации данных пользователя! Не теряя времени, приступим!

Создание нашего CLI

Начнем с создания папки и инициализации нашего проекта 🎉:

mkdir mycli
cd mycli
npm init -y
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь давайте сделаем тестовую команду типа mycli-help, для этого создайте файл index.js и вставьте в него следующий код:

#!/usr/bin/env node

console.log("Hello World!");
Войти в полноэкранный режим Выйти из полноэкранного режима

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

В вычислительной технике shebang — это последовательность символов, состоящая из знака числа и восклицательного знака (#!) в начале сценария.

Из: Википедия: https://en.wikipedia.org/wiki/Shebang_(Unix)

И мы просто печатаем в консоли Hello World!, поэтому давайте отредактируем наш package.json, чтобы добавить эту scripts JSON ключевую пару:

  "scripts": {
    "start": "node index.js"
  }
Вход в полноэкранный режим Выйти из полноэкранного режима

И добавьте этот bin, который указывает приложению, какой файл должен быть запущен после выполнения этой команды:

  "bin": {
    "mycli-help": "index.js"
  }
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь давайте установим CLI и попробуем его:

npm i . -g
mycli-help
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы должны получить Hello World!, теперь давайте удалим его и поработаем над нашим API 🚀:

npm uninstall mycli -g
Вход в полноэкранный режим Выход из полноэкранного режима

Настройка нашего API + Prisma

Начните с создания нового приложения Next.js с помощью npx:

npx create-next-app
cd my-auth-api
Войдите в полноэкранный режим Выйти из полноэкранного режима

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

Итак, зайдите на PlanetScale и создайте новую базу данных, если у вас ее еще нет, подготовка займет несколько минут, наберитесь терпения, после завершения нажмите на Connect, выберите Prisma из выпадающего меню и скопируйте содержимое файла .env:

Теперь создадим файл .env и вставим в него переменные окружения, которые вы только что скопировали из PlanetScale. Теперь давайте настроим Prisma 🚀:

yarn add prisma @prisma/client
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь давайте проверим наш prisma/schema.prisma и обновим конфиги и т.д. до следующих:

generator client {
  provider = "prisma-client-js"
  previewFeatures = ["referentialIntegrity"]
}

datasource db {
  provider = "mysql"
  url = env("DATABASE_URL")
  referentialIntegrity = "prisma"
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Теперь давайте определим нашу модель Account, вот так:

model Account {
  id Int @default(autoincrement()) @id
  username String @unique
  password String
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь давайте синхронизируем нашу базу данных 🚀:

npx prisma db push
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь ваша база данных синхронизирована со схемой, теперь давайте поработаем над нашим API.

Теперь удалите файл pages/api/hello.js, и создайте файл в pages/api/ под названием auth.js, так что он должен быть pages/api/auth.js.

Теперь поместите этот код в файл auth.js:

import { PrismaClient } from '@prisma/client'

export default function handler(req, res) {
  if (!req.body.username || !req.body.password) {
    res.status(400).json({
      error: 'Please provide username and password'
    })
  }
  const prisma = new PrismaClient()
  const findAccount = async (username, password) => {
    const account = await prisma.account.findFirst({
      where: {
        username,
        password: password,
      },
    })
    if (!account) {
      return res.json({
        status: 'error authentication failed'
      })
    } else {
      return res.json({
        status: 'authorized',
        accountAuthorized: username
      })
    }
  }
  findAccount(req.body.username, req.body.password)
}

Вход в полноэкранный режим Выйти из полноэкранного режима

Проще говоря, что мы здесь делаем, во-первых, мы импортируем PrismaClient для использования Prisma:

import { PrismaClient } from '@prisma/client'
Вход в полноэкранный режим Выход из полноэкранного режима

Затем мы создаем API и определяем Prisma Client, чтобы мы могли использовать Prisma в API, также мы проверяем, предоставлены ли имя пользователя и пароль в JSON:

  if (!req.body.username || !req.body.password) {
    res.status(400).json({
      error: 'Please provide username and password'
    })
  }
  const prisma = new PrismaClient()
Вход в полноэкранный режим Выход из полноэкранного режима

После создания клиента Prisma, давайте используем его для проверки соответствия записи в нашей модели с учетными данными, отправленными в JSON запросе, который будет отправлен из нашего CLI, поэтому мы используем findFirst для проверки соответствия записи и не волнуйтесь, пока имя пользователя уникально с помощью @unique, одинаковые пароли для разных аккаунтов не будут иметь эффекта, поэтому после проверки совпадения записей мы либо получим null для значения account, потому что нет такой записи, Поэтому мы используем условие, чтобы вернуть ответ в JSON, сообщающий, что произошла ошибка аутентификации пользователя, а в противном случае мы получим детали записи, включая id, username, password в account, но нам все это не нужно, поэтому мы возвращаем ответ в JSON с сообщением об успешной аутентификации и предоставляем username, который был успешно авторизован для подтверждения:

const findAccount = async (username, password) => {
    const account = await prisma.account.findFirst({
      where: {
        username,
        password: password,
      },
    })
    if (!account) {
      return res.json({
        status: 'error authentication failed'
      })
    } else {
      return res.json({
        status: 'authorized',
        accountAuthorized: username
      })
    }
  }
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь запустим функцию и предоставим имя пользователя и пароль, которые находятся в res.body:

  findAccount(req.body.username, req.body.password)
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь API готов к работе! Просто запустите:

yarn dev
Войти в полноэкранный режим Выйти из полноэкранного режима

Аутентификация пользователя из CLI

Теперь у нас есть API, который работает и ждет, когда кто-нибудь позвонит! Нам нужно получить от пользователя две вещи, имя пользователя (username) и пароль (password), поэтому давайте закодируем их внутри нашего index.js:

#!/usr/bin/env node

var args = process.argv.slice(2);
var username = args[0];
var password = args[1];

if (!username || !password) {
    console.log('Please provide username and password');
    console.log('Usage: mycli-auth <username> <password>');
    process.exit(1);
}

var request = require('request');
var options = {
    url: 'http://localhost:3000/api/auth',
    method: 'POST',
    json: {
        username: username,
        password: password
    }
}
request(options, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
    }
}
);
Вход в полноэкранный режим Выход из полноэкранного режима

Мы проверяем, указаны ли имя пользователя и пароль при выполнении команды, поэтому если оба или один из них не указаны, мы выдадим ошибку с ожидаемым использованием и выйдем.

Если они оба предоставлены, мы импортируем request и устанавливаем опции, где API работает, принимая JSON запросы, устанавливая метод на POST, и в JSON, который мы отправим, мы предоставим username и password, и затем, если мы получим JSON обратно с кодом состояния 200, что означает OK, мы вернем JSON пользователю в консоли, что прекрасно, пока наш JSON ответ является человекочитаемым и понятным, вы можете настроить это, если хотите 😉.

Теперь, прежде чем попробовать, просто установите request:

npm install request
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь просто отредактируйте mycli-help в mycli-auth в bin в файле package.json, должно получиться вот так:

  "bin": {
    "mycli-auth": "index.js"
  }
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь протестируйте его! Но сначала запустите npx prisma studio и перейдите на http://localhost:5000 и проверьте модель Account, добавьте запись пользователя, которую вы будете использовать для аутентификации, готово? Теперь:

npm i . -g
mycli-auth <username> <password>
Войдите в полноэкранный режим Выйдите из полноэкранного режима

И…. поздравляю 🎉, вы успешно сделали свою функцию аутентификации!

Попробуйте — Никакой установки!

Просто установите из NPM:

npm i nodejs-cli-prisma-auth -g
Войти в полноэкранный режим Выйдите из полноэкранного режима

И попробуйте авторизоваться с помощью пользователя admin:

mycli-auth admin supersecret123
Войти в полноэкранный режим Выйти из полноэкранного режима

И бабах 💥! Даже вот GitHub Repo: Omar8345/nodejs-prisma-auth!

Спасибо, что прочитали эту статью ✨, надеюсь, сегодня вы узнали что-то полезное!

Оцените статью
devanswers.ru
Добавить комментарий