Skip to content

Yet another authorization service. As an example of coding skills.

Notifications You must be signed in to change notification settings

alewkinr/jwt-auth

Repository files navigation

auth

Описание

Сервис регистрации и авторизации пользователей. В качестве подхода выбраны JWT-токены.

Стэк

  • Язык программирования — golang
  • HTTP-фреймворк — gorilla/mux
  • База данных и golang-драйвер: postgres/pgx
  • Тестирование/Моки — testify, httptest, gomock
  • Линтеры — golangci-lint
  • Развертывание и обслуживание приложения — Docker, k8s, skaffold (для разработки и деплоя), kubectl для декларативной смены окружения.
  • CI/CD — gitlab

Описание процесса

Авторизация

Процесс регистрации выполняется с помощью эндпоинта добавления пользователя POST /v1/users, однако, чтобы подтвердить номер телефона, потребуется создать сессию через эндпоинт POST /v2/sessions/phone_session.

  1. Отправляем запрос на POST /v2/sessions/phone_session
  2. Запрос валидируется и, если формат переданных данных корректный, то генерируется uid для сессии и код для SMS-подтверждения.
  3. Код отправляется на переданный номер и вместе с uid сессии записывается в БД. На пару устанавливается expirationTimeout, который равен 3 минутам. Сервер отдает в ответе uid сессии, чтобы ее можно было подтвердить.
  4. Получив SMS на указанный номер, клиент может подтвердить его с помощтю эндпоинта PUT /v1/phone_sessions/:uid/sms_code
  5. Если переданный код и uid сессии найдены в БД, активны и совпадают — сервер устанавливает для клиента cookies с access и refresh JWT токенами, которые он может использовать, чтобы совершать запросы к сервисам

Кроме вышеописанного процесса сервис умеет регистрировать пользователей, выполнять валидацию JWT-токена, обновлять accessToken по refreshToken, умеет авторизовывать пользователей по паре логин/пароль и сбрасывать пароль, при необходимости.

FAQ

Как отправить запрос на создание сессии и получение SMS-кода

curl --request POST \
  --url http://localhost:{PORT}/auth/v1/phone_sessions \
  --header 'content-type: application/json' \
  --data '{
	"phone": "+71111111111",
	"countryCode": "RU"
}'

Как подтвердить номер телефона и получить токеныы

curl --request PUT \
  --url http://localhost:{PORT}/auth/v1/phone_sessions/{SESSION_UID}/sms_code \
  --header 'content-type: application/json' \
  --data '{
	"phone": "+71111111111",
	"code": {SMS_CODE}
}'

Как обновить accessToken

Послать запрос на /refresh с кукой, содержащей refreshToken и заголовкои Authorization

curl --request POST \
  --url http://localhost:{PORT}/auth/v1/refresh \
  --header 'content-type: application/json' \
  --cookie refreshToken={refreshToken}

Как запустить

Запустить проект не получится т.к. он использует приватные зависимости, которые находятся под NDA компании, в которой был реализован. Однако, я могу продемонстрировать работу сервиса во время zoom-колла.

Локальное окружение поднимается командой:

make dev

или, если нужно запустить собрать и запустить приложение через дебаггер delve:

make debug

Если возникают проблемы с зависимостями, нужно их скачать командой

go mod vendor

однако приватные он скачать не сможет ввиду авторизации по ssh-ключу.

Для запуска проекта локально потребуется иметь: golang v1.13, k3s, k3d, skaffold, kustomize, Docker.

About

Yet another authorization service. As an example of coding skills.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages