Go 在gin路由器中使用现有会话cookie
我正在Go/Gin中构建一个简单的Web服务器,我想使用cookies创建一个持久会话,当用户离开或浏览多个页面时,该会话将保持用户登录 理想情况下,这就是流程:Go 在gin路由器中使用现有会话cookie,go,go-gin,Go,Go Gin,我正在Go/Gin中构建一个简单的Web服务器,我想使用cookies创建一个持久会话,当用户离开或浏览多个页面时,该会话将保持用户登录 理想情况下,这就是流程: 初始化路由器 检查现有的cookie 如果存在cookie,则采用cookie令牌值 如果cookie不存在,请创建新的随机令牌值 使用令牌值启动会话 使用与路由器的会话 稍后的代码将验证cookie令牌值是否过期和/或是否对应于数据库中的活动用户 我最近尝试的迭代是: router := gin.Default(); t
- 初始化路由器
- 检查现有的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_值的类型是func(c*gin.Context)string,而不是string
我知道我在这里遗漏了一些东西,我希望得到一些关于如何解决这个问题的指导
谢谢 演示代码主要是做你想做的事情,但有一个问题。不包含“Expires”或“Max Age”属性的cookie是“会话”cookie“当客户端关闭时会话完成,会话cookie将被删除。” 因此,无法成功检索现有cookie的原因是浏览器已将其删除(您可以使用大多数浏览器中的开发人员工具进行检查)。要解决此问题,请使用以下方法:
store := cookie.NewStore([]byte("secret"))
store.Options(sessions.Options{MaxAge: 60 * 60 * 24}) // expire in a day
更改后,cookie将与相应选项一起发送(并将在浏览器上保留一天,除非由于用户设置/操作而清除):
mysession=mtyxmzg5Mdc5oxxedi1cqkfqfq180sufbukfcrufbqunbquvhyznsewfxnw5eqwnbqldodmrxntbbmmx1zefrq0fbwt18jwivoxgau5t16plbinr4uyu5xakm7rsmnghnxczpf0=;Expires=周一,2021年2月22日06:59:59 GMT;最大年龄=86400
您可以通过将上述内容添加到中来测试这一点,即:
如果您编译/运行此代码,然后打开http:127.0.0.1:8000/incr,您应该会看到“{”count:0}”;刷新页面几次,并验证该数字是否增加。现在关闭并重新打开浏览器,然后转到http:127.0.0.1:8000/incr——数字应该比关闭浏览器前高一个(表明此cookie在重新启动后仍然存在)
我相信这是你正在寻找的信息,但我可能误解了。需要注意的是,在这种情况下,cookie是由服务器生成的。一旦浏览器收到cookie,它将在后续请求中包含cookie(这意味着服务器可以使用cookie)
我用它来读取cookie值:if cookie,err:=c.Request.cookie(“测试会话”);err==nil{value:=cookie.value log.Printf(“cookie值:%v”,value)}但它与我在浏览器中看到的cookie值不匹配
会话存储正在为您管理cookie;使用session.Get
(根据示例)检索它
如果要使用“原始”cookies,则不应使用存储设置它们(使用)。但请注意,在这样做的时候,你需要非常小心,因为你不能相信你收到的任何饼干;最终用户编辑cookie的值很简单(浏览器开发工具为此提供了一个很好的用户界面!)
为了防止此会话
写入cookies,其编码方式可以检测cookies是否已被更改(附带注意事项;如果安全性是一个真正的问题,则需要阅读文档)。这将使用“身份验证”密钥(本例中为“机密”),因此请更改该密钥,因为任何知道该密钥的人都可以更改令牌!)。还有一个选项可以加密cookie内容(因为它很容易让用户提取cookie包含的信息;在大多数情况下,这不是一个大问题,但对您来说可能是)。演示代码主要是做您想要做的事情,但有一个问题。不包含“Expires”或“Max Age”属性的cookie是“会话”cookie“当客户端关闭时会话完成,会话cookie将被删除。”
因此,无法成功检索现有cookie的原因是浏览器已将其删除(您可以使用大多数浏览器中的开发人员工具进行检查)。要解决此问题,请使用以下方法:
store := cookie.NewStore([]byte("secret"))
store.Options(sessions.Options{MaxAge: 60 * 60 * 24}) // expire in a day
更改后,cookie将与相应选项一起发送(并将在浏览器上保留一天,除非由于用户设置/操作而清除):
mysession=mtyxmzg5Mdc5oxxedi1cqkfqfq180sufbukfcrufbqunbquvhyznsewfxnw5eqwnbqldodmrxntbbmmx1zefrq0fbwt18jwivoxgau5t16plbinr4uyu5xakm7rsmnghnxczpf0=;Expires=周一,2021年2月22日06:59:59 GMT;最大年龄=86400
您可以通过将上述内容添加到中来测试这一点,即:
如果您编译/运行此代码,然后打开http:127.0.0.1:8000/incr
,您应该会看到“{”count:0}”;刷新页面几次,并验证该数字是否增加。现在关闭并重新打开浏览器,然后转到http:127.0.0.1:8000/incr——数字应该比关闭浏览器前高一个(表明此cookie在重新启动后仍然存在)
我相信这是你正在寻找的信息,但我可能误解了。需要注意的是,在这种情况下,cookie是由服务器生成的。一旦浏览器收到cookie,它将在后续请求中包含cookie(这意味着服务器可以使用cookie)
我用它来读取cookie值:if cookie,err:=c.Request.cookie(“测试会话”);err==nil{value:=cookie.value log.Printf(“cookie值:%v”,value)}但它与我在浏览器中看到的cookie值不匹配
会话存储正在为您管理cookie;使用session.Get
(根据示例)检索它
如果要使用“原始”cookies,则不应使用存储设置它们(使用)。但请注意,在这样做时,您需要非常小心,因为您不能信任