Для тех, кто создает RESTful API и интерфейсные приложения JS в Go, как вы управляете аутентификацией? Используете ли вы какие-либо конкретные библиотеки или методы?
Я удивлен, обнаружив так мало дискуссий по этому поводу. Я имею в виду ответы, подобные следующим, и стараюсь избегать разработки собственной реализации:
Форма аутентификации в ASP.Net
Каждый кодирует свое собственное решение отдельно?
authentication
go
SexxLuthor
источник
источник
Ответы:
Этот вопрос получает массу просмотров - и имеет значок «Популярный вопрос» - так что я знаю, что эта тема вызывает большой скрытый интерес, и многие люди задают точно такую же вещь и не находят ответов на веб-страницах.
Большая часть доступной информации приводит к текстовому эквиваленту волнистости, оставленной как «упражнение для читателя». ;)
Однако я наконец нашел один конкретный пример (щедро), предоставленный участником списка рассылки golang-nuts:
https://groups.google.com/forum/#!msg/golang-nuts/GE7a_5C5kbA/fdSnH41pOPYJ
Это обеспечивает предлагаемую схему и реализацию на стороне сервера в качестве основы для пользовательской аутентификации. Код на стороне клиента остается за вами.
(Я надеюсь, что автор сообщения видит это: Спасибо!)
Выдержка (и переформатирование):
«Я бы предложил что-то вроде следующего дизайна:
источник
Другое возможное решение - Authboss , недавно анонсированное в списке рассылки .
(Я не пробовал использовать эту библиотеку.)
Также см. Лучший способ сделать веб-приложение с аутентификацией пользователя?
источник
Вы будете использовать промежуточное ПО для аутентификации.
Вы можете попробовать go-http-auth для базовой и дайджест-аутентификации и gomniauth для OAuth2.
Но способ аутентификации зависит от вашего приложения.
Аутентификация вводит состояние / контекст в ваши http.Handlers, и в последнее время обсуждается это.
Хорошо известными решениями проблемы контекста являются gorilla / context и google context, описанные здесь .
Я сделал более общее решение без необходимости глобального состояния в переходе / переносе, которое можно использовать вместе или без двух других, и красиво интегрируется с промежуточным программным обеспечением без контекста.
wraphttpauth обеспечивает интеграцию go-http-auth с включением / переносом.
источник
go-http-auth
илиgomniauth
или оба?Ответ на этот вопрос в 2018 году. Я предлагаю использовать JWT (JSON Web Token). Недостаток ответа, который вы отметили как решенный, - это поездка впереди (пользователь) и назад (сервер / db). Что еще хуже, если пользователь сделал частый запрос, требующий авторизации, приведет к раздутому запросу с / на сервер и базу данных. Чтобы решить эту проблему, используйте JWT, который хранит токен на стороне пользователя, который может использоваться пользователем в любое время, когда ему требуется доступ / запрос. Нет необходимости в работе с базой данных и обработкой сервера, чтобы проверить срок действия токена.
источник
Другой пакет с открытым исходным кодом для проверки подлинности с помощью файлов cookie - это httpauth .
(написано мной, кстати)
источник
Честно говоря, существует множество методов и методов аутентификации, которые вы можете установить в своем приложении, и это зависит от бизнес-логики и требований приложений.
Например, Oauth2, LDAP, локальная аутентификация и т. Д. В
моем ответе предполагается, что вы ищете локальную аутентификацию, что означает, что вы управляете идентификацией пользователя в своем приложении. Сервер должен предоставлять набор внешних API, позволяющих пользователям и администраторам управлять учетными записями и указывать, как они хотят идентифицировать себя на сервере для достижения надежного взаимодействия. в итоге вы создадите таблицу БД, содержащую информацию о пользователе. где пароль хешируется в целях безопасности См. Как хранить пароль в базе данных
Давайте предположим, что приложение требует проверки подлинности пользователей на основе одного из следующих методов:
базовая аутентификация (имя пользователя, пароль):
этот метод аутентификации зависит от наборов учетных данных пользователя в заголовке авторизации, закодированных в base64 и определенных в rfc7617 , в основном, когда приложение получает запрос пользователя, оно декодирует авторизацию и повторно хэширует пароль для сравнения его в БД хэш, если он совпадает, аутентифицированный пользователь, в противном случае возвращает код состояния 401 пользователю.
Аутентификация на основе сертификата:
этот метод аутентификации зависит от цифрового сертификата для идентификации пользователя, и он известен как аутентификация x509, поэтому, когда приложение получает запросы пользователя, оно читает сертификат клиента и проверяет его на соответствие предоставленному корневому сертификату CA. в приложение.
токен носителя:
этот метод аутентификации зависит от краткосрочных токенов доступа. Маркер носителя представляет собой загадочную строку, обычно генерируемую сервером в ответ на запрос входа в систему. поэтому, когда приложение получает запросы пользователя, оно считывает авторизацию и проверяет токен для аутентификации пользователя.
Тем не менее, я бы порекомендовал Go-Guardian для библиотеки аутентификации, что она делает с помощью расширяемого набора методов аутентификации, известных как стратегии. в основном Go-Guardian не монтирует маршруты и не принимает какую-либо конкретную схему базы данных, что максимизирует гибкость и позволяет разработчикам принимать решения.
Настройка аутентификатора Go-Guardian проста.
Вот полный пример вышеперечисленных методов.
Использование:
Вы можете включить несколько методов аутентификации одновременно. Вы должны обычно использовать по крайней мере два метода
источник
Взгляните на Labstack Echo - он включает аутентификацию для RESTful API и интерфейсные приложения в промежуточное ПО, которое вы можете использовать для защиты определенных маршрутов API.
Например, настроить базовую аутентификацию так же просто, как создать новый подчиненный
/admin
маршрут для маршрута:Посмотрите все варианты аутентификации промежуточного программного обеспечения Labstack здесь.
источник