В этой статье мы узнаем, как создать Rest API для аутентификации с помощью Node.js, Express.js и AWS Cognito.
· Предварительные требования
· Обзор
∘ Что такое AWS CloudFormation?
∘ Что такое Amazon Cognito?
· Настройка Amazon Cognito
· Настройка проекта NodeJs
∘ Установка Express и других зависимостей
∘ Определение конечных точек
· Протестирование API
· Заключение
· Ссылки
Предпосылки
Это список всех предварительных условий:
- Node.js установлен и npm
- Активный Аккаунт AWS
- Базовые знания Node.js и Express.js
Обзор
В этой статье мы будем использовать два сервиса AWS: AWS CloudFormation и Amazon Cognito.
Что такое AWS CloudFormation?
AWS CloudFormation — это сервис «инфраструктура как код» (IaC), который помогает моделировать и настраивать ресурсы AWS, чтобы вы могли тратить меньше времени на управление этими ресурсами и уделять больше внимания своим приложениям, работающим в AWS.
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html
Что такое Amazon Cognito?
Amazon Cognito обеспечивает аутентификацию, авторизацию и управление пользователями для ваших веб-приложений и мобильных приложений. Ваши пользователи могут входить в систему напрямую, используя имя пользователя и пароль, или через третью сторону, например Facebook, Amazon, Google или Apple.
Двумя основными компонентами Amazon Cognito являются пулы пользователей и пулы удостоверений. Пулы пользователей — это пользовательские каталоги, предоставляющие варианты регистрации и входа для пользователей вашего приложения. Пулы удостоверений позволяют предоставлять пользователям доступ к другим сервисам AWS. Вы можете использовать пулы удостоверений и пулы пользователей по отдельности или вместе.
— https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html
Настройка Amazon Cognito
Мы собираемся использовать шаблон AWS CloudFormation для создания нашего стека AWS Cognito. Существует три способа создания шаблона CloudFormation, который содержит информацию о конфигурации ресурсов AWS для включения в стек.
- Загрузите свой собственный шаблон
- Использование образца шаблона, предоставленного AWS
- Создать храм в Конструкторе
Мы решили создать модель с нуля для корпуса. Ниже приведен полный шаблон.
- Войдите в Консоль управления AWS и откройте сервис CloudFormation.
- Затем вы нажимаете кнопку «создать стек» и указываете шаблон
Укажите имя стека и доменное имя cognito.
Следующие шаги мастера — «Настройка параметров стека» и «Просмотр».
Шаблон CloudFormation развернут, как вы можете видеть на вкладке событий стека, наш стек успешно создан.
Пул пользователей Amazon Cognito готов.
Мы закончили настройку пула пользователей AWS Cognito 👨🏼💻
Настройка проекта NodeJs
Чтобы настроить приложение Node.js с сервером Express.js, мы сначала создадим каталог для нашего проекта, в котором он будет находиться:
mkdir node-cognito-auth-api && cd node-cognito-auth-api
Затем давайте создадим json-файл пакета с помощью команды npm init
command.
Установите Express и другие зависимости
Теперь нам нужно установить все зависимости, необходимые для запуска нашего API.
npm install --save express npm install @aws-sdk/client-cognito-identity-provider npm install dotenv npm install dotenv npm install body-parser npm install swagger-ui-express swagger-jsdoc
package.json
{ "name": "cognito-auth-api", "version": "1.0.0", "description": "AWS cognito auth server with AWS SDK for JavaScript (v3)", "main": "server.js", "scripts": { "start": "node server.js", "dev": "nodemon server.js", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "git+https://github.com/anicetkeric/node-cognito-auth-api.git" }, "keywords": [ "jwt", "nodejs", "authentication", "auth-server", "aws-sdk", "aws", "amazon-cognito", "expressjs" ], "author": "aek", "license": "ISC", "bugs": { "url": "https://github.com/anicetkeric/node-cognito-auth-api/issues" }, "homepage": "https://github.com/anicetkeric/node-cognito-auth-api#readme", "dependencies": { "@aws-sdk/client-cognito-identity-provider": "^3.370.0", "body-parser": "^1.20.2", "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", "express-validator": "^7.0.1", "jwt-decode": "^3.1.2", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.0" }, "devDependencies": { "nodemon": "^3.0.1" } }
Определить конечные точки
Мы будем использовать Node.JS AWS SDK для SignUp, confirmSignUp и Вход конечные точки.
AWS SDK состоит из клиентов и команд. CognitoIdentityProviderClient используется для отправки запроса с помощью команды с входными параметрами.
Во-первых, нам нужно инициировать клиент с конфигурацией (учетные данные, регион). Мы будем использовать переменную среды из файла .env в Node.JS.
sign-up.js: содержит методы signUp и confirmSignup.
initiate-auth.js: содержит методы signIn и refreshToken.
Протестируйте API
Теперь мы можем запустить наш API и протестировать его.
npm run start
http://localhost:3080/api-docs/
Регистрация учетной записи
Amazon Cognito отправляет электронное письмо или SMS с подтверждением учетной записи пользователя для подтверждения регистрации пользователя. В нашем случае пользователь получил проверочный код по электронной почте.
Затем вам нужно подтвердить адрес электронной почты, используя конечную точку /confirm-sign-up.
Учетная запись пользователя проверена, как показано ниже на скриншоте 👏
Теперь, когда учетная запись пользователя создана и проверена, давайте попробуем пройти аутентификацию с помощью конечной точки /login. Он возвращает токен доступа jwt, токен обновления и токен идентификации.
Заключение
Отличная работа !!. В этой статье мы увидели, как создать API Rest для аутентификации с использованием Node.js, Express.js и AWS Cognito.
Полный исходный код доступен на GitHub.
Если вам понравилась статья, не забудьте похлопать 👏. Вы можете связаться со мной и подписаться на Medium, Twitter, GitHub
Рекомендации
- https://docs.aws.amazon.com/fr_fr/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html
- https://github.com/aws/aws-sdk-js-v3/blob/171254fbf7a9d9ea90d02b611962c8a5a2d2150c/clients/client-cognito-identity-provider/README.md
- https://boottechnologies-ci.medium.com/multi-tenancy-architecture-using-aws-cognito-part-2-a1bc468d3812
- https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-cognito-identity-provider/
- https://expressjs.com/