Skip to content

Latest commit

 

History

History
84 lines (67 loc) · 4.7 KB

README.md

File metadata and controls

84 lines (67 loc) · 4.7 KB

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.