Как люди управляют аутентификацией в Go?

Для тех, кто строит API RESTful и интерфейсные приложения JS в Go, как вы управляете аутентификацией? Используете ли вы какие-либо конкретные библиотеки или методы?

Я удивлен, когда так мало об этом расскажу. Я помню ответы, подобные следующим, и стараюсь не разрабатывать собственную реализацию:

Форма аутентификации в ASP.Net

Разделяются ли все отдельно свои собственные решения?

Ответ 1

Этот вопрос получает тонну взглядов - и имеет значок популярного вопроса - поэтому я знаю, что в этой теме много скрытого интереса, и многие люди спрашивают точно то же самое и не находят ответы на Interwebs.

Большая часть доступной информации приводит к текстуальному эквиваленту ручной волнистой вещи, оставленной как "упражнение для читателя".;)

Однако я наконец нашел один конкретный пример (щедро), предоставленный членом списка рассылки golang-nuts:

https://groups.google.com/forum/#!msg/golang-nuts/GE7a_5C5kbA/fdSnH41pOPYJ

Это обеспечивает предлагаемую схему и серверную реализацию в качестве основы для пользовательской аутентификации. Клиентский код по-прежнему зависит от вас.

(Надеюсь, автор сообщения видит это: Спасибо!)

Выделено (и переформатировано):


"Я бы предложил что-то вроде следующего дизайна:

create table User (
 ID int primary key identity(1,1),
 Username text,
 FullName text,
 PasswordHash text,
 PasswordSalt text,
 IsDisabled bool
)

create table UserSession (
 SessionKey text primary key,
 UserID int not null, -- Could have a hard "references User"
 LoginTime <time type> not null,
 LastSeenTime <time type> not null
)
  • Когда пользователь регистрируется на вашем сайте через POST в TLS, определите, действительно ли пароль.
  • Затем произведите случайный ключ сеанса, скажем, 50 или более символов крипторанда и прочее в безопасном Cookie.
  • Добавьте этот ключ сеанса в таблицу UserSession.
  • Затем, когда вы снова видите этого пользователя, сначала попадайте в таблицу UserSession, чтобы увидеть, существует ли SessionKey с допустимым значением LoginTime и LastSeenTime, и Пользователь не удаляется. Вы можете создать его так, чтобы таймер автоматически удалял старые строки в UserSession.

Ответ 3

Для аутентификации вы должны использовать промежуточное программное обеспечение.

Вы можете попробовать go-http-auth для базовой и дайджест-аутентификации и gomniauth для OAuth2.

Но как аутентифицироваться действительно зависит от вашего приложения.

Аутентификация вводит состояние/контекст в ваш http.Handlers, и в последнее время было некоторое обсуждение.

Хорошо известные решения проблемы контекста: gorilla/context и google контекст описал здесь.

Я сделал более общее решение без необходимости глобального состояния в go-on/wrap, которое может использоваться вместе или без двух других и красиво интегрируется с контекстным программным обеспечением.

wraphttpauth обеспечивает интеграцию go-http-auth с включением/переносом.

Ответ 4

Еще один пакет с открытым исходным кодом для обработки аутентификации с помощью куки файлов - httpauth.

(написанный мной, между прочим)

Ответ 5

Ответ на этот вопрос в 2018 году. Я предлагаю использовать JWT (JSON Web Token). Недостаток ответа, который вы отметили как решенный, - это поездка вперед (пользователь) и назад (сервер/дБ). Что еще хуже, если пользователь делал частые запросы, требующие авторизации, приведет к раздутому запросу с/на сервер и базу данных. Для решения этой проблемы используйте JWT, который хранит токен на стороне пользователя, который может использоваться пользователем в любое время, когда ему требуется доступ/запрос. Нет необходимости в работе с базой данных и обработкой сервера, чтобы проверить правильность токена.

Ответ 6

Я удивлен, что никто не упомянул unrolled/secure

С их страницы github: Secure - это промежуточное ПО HTTP для Go, которое облегчает некоторые быстрые победы в безопасности. Это стандартный net/http Handler и может использоваться со многими фреймворками или напрямую с Go net/http package.

интегрируется с несколькими фреймворками, включая (но не ограничиваясь ими) chi, Echo, Gin, Goji, Iris и Negroni

Ответ 7

Взгляните на Labstack Echo - он включает аутентификацию для API-интерфейсов RESTful и веб-приложений в промежуточное ПО, которое вы можете использовать для защиты определенных маршрутов API.

Например, настроить базовую аутентификацию так же просто, как создать новый подчиненный маршрутизатор для маршрута /admin:

e.Group("/admin").Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
    if username == "joe" && password == "secret" {
        return true, nil
    }
    return false, nil
}))

См. Все параметры аутентификации промежуточного программного обеспечения Labstack здесь.