Как люди управляют аутентификацией в 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.
Ответ 2
Другим возможным решением является Authboss, недавно анонсированный при рассылке список.
(Я не пробовал использовать эту библиотеку.)
Также см. Лучший способ сделать webapp с пользовательским auth?
Ответ 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 здесь.
Ответ 8
Я написал статью об этом https://medium.com/@holy_abimz/authentication-in-golang-c0677bcce1a8. Я надеюсь, что это помогает.