Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 在gin路由器中使用现有会话cookie_Go_Go Gin - Fatal编程技术网

Go 在gin路由器中使用现有会话cookie

Go 在gin路由器中使用现有会话cookie,go,go-gin,Go,Go Gin,我正在Go/Gin中构建一个简单的Web服务器,我想使用cookies创建一个持久会话,当用户离开或浏览多个页面时,该会话将保持用户登录 理想情况下,这就是流程: 初始化路由器 检查现有的cookie 如果存在cookie,则采用cookie令牌值 如果cookie不存在,请创建新的随机令牌值 使用令牌值启动会话 使用与路由器的会话 稍后的代码将验证cookie令牌值是否过期和/或是否对应于数据库中的活动用户 我最近尝试的迭代是: router := gin.Default(); t

我正在Go/Gin中构建一个简单的Web服务器,我想使用cookies创建一个持久会话,当用户离开或浏览多个页面时,该会话将保持用户登录

理想情况下,这就是流程:

  • 初始化路由器
  • 检查现有的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_值的类型是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,则不应使用
存储设置它们(使用)。但请注意,在这样做时,您需要非常小心,因为您不能信任