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

Библиотека собрана вокруг интерфейса 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 — пакет полностью документирован.