Сервис регистрации и авторизации пользователей. В качестве подхода выбраны 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.
- Отправляем запрос на POST /v2/sessions/phone_session
- Запрос валидируется и, если формат переданных данных корректный, то генерируется uid для сессии и код для SMS-подтверждения.
- Код отправляется на переданный номер и вместе с uid сессии записывается в БД. На пару устанавливается expirationTimeout, который равен 3 минутам. Сервер отдает в ответе uid сессии, чтобы ее можно было подтвердить.
- Получив SMS на указанный номер, клиент может подтвердить его с помощтю эндпоинта PUT /v1/phone_sessions/:uid/sms_code
- Если переданный код и uid сессии найдены в БД, активны и совпадают — сервер устанавливает для клиента cookies с access и refresh JWT токенами, которые он может использовать, чтобы совершать запросы к сервисам
Кроме вышеописанного процесса сервис умеет регистрировать пользователей, выполнять валидацию JWT-токена, обновлять accessToken по refreshToken, умеет авторизовывать пользователей по паре логин/пароль и сбрасывать пароль, при необходимости.
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}
}'
Послать запрос на /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.