Использовать существующий файл cookie сеанса в маршрутизаторе gin
Я создаю простой веб-сервер в Go / Gin, и я хочу использовать файлы cookie для создания постоянного сеанса, в котором пользователь будет оставаться в системе, если он уйдет или перейдет по нескольким страницам.
В идеале это поток:
- инициализировать роутер
- проверить существующий файл cookie
- если cookie существует, возьмите значение токена cookie
- если cookie не существует, создайте новое случайное значение токена
- инициировать сеанс со значением токена
- использовать сеанс с маршрутизатором
Код позже проверит, истек ли срок действия токена cookie и / или соответствует ли он активному пользователю в базе данных.
Самая последняя итерация, которую я пробовал:
router := gin.Default();
token_value := func(c *gin.Context) string {
var value string
if cookie, err := c.Request.Cookie("session"); err == nil {
value = cookie.Value
} else {
value = RandToken(64)
}
return value
}
cookie_store := cookie.NewStore([]byte(token_value))
router.Use(sessions.Sessions("session",cookie_store))
Но это не удается, потому что token_value - это строка типа func(c *gin.Context), а не строка.
Я знаю, что кое-что мне здесь не хватает, и мне бы хотелось получить рекомендации по решению этой проблемы.
Спасибо!
1 ответ
Демо-код в основном делает то, что вы хотите, но есть одна проблема. Файл cookie, который не включает атрибуты Expires или Max-Age, является файлом cookie сеанса и «Сеанс завершается, когда клиент завершает работу, и файлы cookie сеанса будут удалены».
Таким образом, причина, по которой вы не можете успешно получить существующий файл cookie, заключается в том, что браузер удалил его (вы можете проверить это с помощью инструментов разработчика в большинстве браузеров). Чтобы решить эту проблему, используйте что-то вроде:
store := cookie.NewStore([]byte("secret"))
store.Options(sessions.Options{MaxAge: 60 * 60 * 24}) // expire in a day
после этого изменения cookie будет отправлен с соответствующей опцией (и останется в браузере в течение дня, если не будет удален из-за настроек / действий пользователя):
mysession=MTYxMzg5MDc5OXxEdi1CQkFFQ180SUFBUkFCRUFBQUhQLUNBQUVHYzNSeWFXNW5EQWNBQldOdmRXNTBBMmx1ZEFRQ0FBWT18jWiVoXgauu5T16pLbinR4uYu5XakM7RSmnGHNxCzPf0=; Expires=Mon, 22 Feb 2021 06:59:59 GMT; Max-Age=86400
Вы можете проверить это, добавив приведенное выше в пример кода, т.е.
package main
import (
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
store := cookie.NewStore([]byte("secret"))
store.Options(sessions.Options{MaxAge: 60 * 60 * 24}) // expire in a day
r.Use(sessions.Sessions("mysession", store))
r.GET("/incr", func(c *gin.Context) {
session := sessions.Default(c)
var count int
v := session.Get("count")
if v == nil {
count = 0
} else {
count = v.(int)
count++
}
session.Set("count", count)
session.Save()
c.JSON(200, gin.H{"count": count})
})
r.Run(":8000")
}
Если вы скомпилируете / запустите это, а затем откроете, вы должны увидеть "{"count":0}"; обновите страницу несколько раз и убедитесь, что число увеличивается. Теперь закройте и снова откройте браузер и перейдите в
http:127.0.0.1:8000/incr
- число должно быть на единицу выше того, что было до закрытия браузера (демонстрируя, что этот файл cookie пережил перезапуск).
Я считаю, что это именно та информация, которую вы ищете, но, возможно, я неправильно понял. Важно отметить, что в этом случае файлы cookie создаются сервером. Как только браузер получит файл cookie, он будет включать его в последующие запросы (что означает, что сервер может его использовать).
Я использую это для чтения значения cookie: if cookie, err: = c.Request.Cookie ("test_session"); err == nil {value: = cookie.Value log.Printf("Cookie value:%v",value)}, но оно не соответствует значению cookie, которое я вижу в моем браузере.
Хранилище сеансов управляет файлом cookie за вас; использовать
session.Get
(согласно примеру), чтобы получить его.
Если вы хотите использовать «сырые» файлы cookie, вам не следует использовать
store
чтобы установить их (используйте
<tcode id="776751"></tcode>). Но ВНИМАНИЕ, вы должны быть очень осторожны при этом, потому что вы не можете доверять никаким куки, которые вы получаете; Для конечного пользователя легко изменить значение файла cookie (инструменты разработчика браузера предоставляют для этого удобный пользовательский интерфейс!).
Чтобы защититься от этого
session
записывает файлы cookie, закодированные таким образом, чтобы можно было определить, были ли они изменены (с оговорками; если безопасность является реальной проблемой, вам необходимо прочитать документы). При этом используется ключ «аутентификации» (в данном примере «секрет», так что измените его, потому что любой, кто знает ключ, может изменить токен!). Существует также возможность зашифровать содержимое файлов cookie (поскольку пользователю достаточно легко извлечь информацию, содержащуюся в вашем файле cookie; в большинстве случаев это не большая проблема, но может быть для вас).