Git Product home page Git Product logo

jwt-auth's Introduction

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.

jwt-auth's People

Stargazers

 avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.