Первоначально опубликовано на 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!
Спасибо, что прочитали эту статью ✨, надеюсь, сегодня вы узнали что-то полезное!