Сеансы — популярный вариант аутентификации пользователей в Интернете. Сеанс — это период, в течение которого пользователь активно взаимодействует с приложением. Время жизни сеанса начинается, когда пользователь входит в систему, и заканчивается, когда он выходит из системы.
HTTP — это протокол без сохранения состояния, поэтому вам часто придется отслеживать действия пользователей вручную.
На стороне сервера вашего приложения вы можете сгенерировать уникальное значение, предпочтительно криптографически безопасное. Затем вы можете сохранить это в файле cookie, который клиент будет отправлять вашему приложению при будущих запросах, создавая форму состояния.
Сессии в Go
Вы можете использовать пакет net/http для реализации сеансов, и есть много доступных пакетов, которые уже делают это. Наиболее популярным является пакет сеансов Gorilla. Этот пакет предоставляет функции хранения файлов cookie и файлов, а также настраиваемую серверную инфраструктуру сеанса.
Запустите эту команду в рабочей области Go, чтобы установить пакет сеансов Gorilla.
идти получить github.com/gorilla/sessions
В этом руководстве вы будете использовать хранилище файлов cookie для сеансов. Вы будете использовать пакет net/http для запуска веб-сервера, который будет проверять проблему пользователя и отзывать сеансы.
Вот список импорта, который вам понадобится, чтобы следовать этому руководству.
импорт (
"github.com/горилла/сеансы"
"журнал"
"сеть/http"
)
журнал package предназначен для операций, связанных с ведением журнала, на основе статуса аутентификации пользователя.
Простая реализация магазина cookie
Вам понадобится хранилище файлов cookie для функций обработчика входа и выхода. Для вашего хранилища файлов cookie вам понадобится секретный ключ для аутентификации.
Вот функция для реализации хранилища cookie.
// функция cookieStore создает хранилище cookie с секретным ключом пользователя
функцияcookieStore() *сессии.CookieStore {
Секретный ключ := []байт("сверхсекретный-SecretKey")
cookieStore := сеансы. Ньюкукисторе (секретный ключ)
// функция возвращает хранилище cookie, чтобы другие функции могли получить к нему доступ
возвращаться cookieStore
}
в cookieStore функция, объявленная переменная секретного ключа Секретный ключ пример секретного ключа. В рабочей среде ваш секретный ключ должен быть криптографически безопасным, например, с использованием пакета crypto. Вы также должны загрузить секрет из файл переменных окружения.
Функция возвращает значение *сессии. CookieStore тип, который представляет хранилище файлов cookie, защищенное секретным ключом. Вы будете использовать CookieStore функция в вашем авторизоваться а также выйти обработчики для аутентификации пользователей и назначения сеансов.
Функция обработчика входа в систему
Вы захотите убедиться, что пользователь уже вошел в систему, прежде чем создавать сеанс в вашей функции обработчика входа в систему. Вы можете использовать Получить метод в хранилище файлов cookie, чтобы получить сеанс из файла cookie и добавить сеанс к запросу клиента.
Получить Метод возвращает сеанс и ошибку, которую вы можете обработать. Если вам необходимо аутентифицировать пользователя, вы можете аутентифицировать или авторизовать в авторизоваться обработчик.
// обработчик входа в систему извлекает сеанс из хранилища файлов cookie
функцияавторизоваться(писатель http. ResponseWriter, запрос *http. Запрос) {
сеанс, ошибка := cookieStore().Get (запрос, «Имя файла cookie из запроса»)если ошибся != ноль {
журнал. Fatalln (ошибка)
}// установите здесь аутентификацию пользователя на основе операции
сессия. Значения["статус авторизации"] = истинный
ошибка = сессия. Сохранить (запрос, запись)
если ошибся != ноль {
возвращаться
}
}
Свойство Values содержит данные, относящиеся к сеансу, в хранилище файлов cookie:
Сохранять Метод сохраняет сеанс в хранилище файлов cookie. В ваших обработчиках вам потребуются другие меры аутентификации для повышения безопасности.
Проверка статуса входа пользователя
Ваш обработчик проверки должен получить сеанс из файла cookie клиента, используя хранилище файлов cookie. Получить метод. Затем вы можете получить сеанс и аутентифицировать пользователя.
функцияпроверитьAuthStatus(писатель http. ResponseWriter, запрос *http. Запрос) {
сеанс, ошибка := cookieStore().Get (запрос, «Имя файла cookie из запроса»)если ошибся != ноль {
журнал. Fatalln (ошибка)
}аутентифицированный := сеанс. Значения["статус авторизации"]
если аутентифицирован == истинный {
писатель. Заголовок записи (http. СтатусОК) // записываем код состояния 200
возвращаться
} еще {
писатель. Заголовок записи (http. СтатусBadRequest) // пишем код статуса 400 http
возвращаться
}
}
аутентифицированный переменная использует Ценности свойство для получения статуса из хранилища файлов cookie. Затем оператор if проверяет этот статус проверки подлинности. Если он оценивает истинный, клиент получает 200 Код состояния HTTP. Если статус аутентификации не соответствует действительности, клиент получает код состояния HTTP 400.
Обработчик выхода из сеанса
Ваша функция обработчика выхода из системы будет очень похожа на функцию обработчика входа в систему. Вы удалите все данные, связанные с сеансом пользователя, из хранилища файлов cookie и аннулируете статус аутентификации.
функциявыйти(писатель http. ResponseWriter, запрос *http. Запрос) {
сеанс, ошибка := cookieStore().Get (запрос, «Имя файла cookie из запроса»)если ошибся != ноль {
возвращаться
}// аннулировать сессию пользователя из хранилища куки
сессия. Значения["статус авторизации"] = ЛОЖЬ
ошибка = сессия. Сохранить (запрос, запись)
если ошибся != ноль {
возвращаться
}
}
выйти Функция обработчика аннулирует статус аутентификации сеанса пользователя и сохраняет статус в хранилище файлов cookie.
Не храните конфиденциальные данные в сессиях
Сеансы отлично подходят для хранения данных, но лучше избегать хранения в них конфиденциальных данных. Злоумышленник может захватить сеанс, если вы сохраните его данные в файле cookie и отправите их по обычному HTTP. Безопасность вашего приложения важна для ваших пользователей.
Сеансы сохраняют состояние, и существует множество реализаций баз данных хранилищ файлов cookie для пакета Gorilla, как для баз данных SQL, так и для баз данных NoSQL.