Личный проектGo

Knocknock — сессии и аутентификация на Go

Лёгкая библиотека для управления сессиями аутентификации на Go: cookie/заголовок/query-параметр как источник токена, подключаемое хранилище, готовый HTTP-middleware.

Лёгкая Go-библиотека для управления сессиями аутентификации — без привязки к конкретному хранилищу или веб-фреймворку.

Задача

В большинстве маленьких Go-сервисов аутентификация решается либо тяжёлым фреймворком, либо копипастой одного и того же кода из проекта в проект: генерация токена, чтение его из cookie/заголовка, middleware для защищённых роутов. Knocknock выносит эту рутину в отдельный модуль с минимальным API.

Архитектура

Взаимодействие с библиотекой изображено на схеме:

Архитектура Knocknock

Библиотека собрана вокруг интерфейса Store — он отвечает за хранение сессий и не завязан на конкретной БД:

type Store interface {
	Save(ctx context.Context, session *Session) error
	Get(ctx context.Context, token string) (*Session, error)
	Delete(ctx context.Context, token string) error
}

Из коробки есть MemoryStore для разработки; для продакшена подключается любая своя реализация. Источник токена (cookie, HTTP-заголовок или query-параметр) настраивается через соответствующие опции — middleware сам проверяет все источники по очереди, так что фронтенду не нужно знать, откуда именно сервер ждёт токен.

Запуск

Установите библиотеку нативными средствами Go:

go get -u github.com/tolstovrob/knocknock

Далее в своём проекте:

store := knocknock.HandleMemoryStore()
auth := knocknock.HandleAuth(store, knocknock.WithDefaultExpiry(24 * time.Hour))

handler := auth.Middleware()(mux)

Полный API можно посмотреть через go doc -http — пакет полностью документирован.