Golang会话正在工作,但需要基于if值对路由进行身份验证
我正在尝试让会话在我的api上工作 我希望能够将某些端点定义为受限端点,这需要用户登录才能访问它们。我还希望能够仅为登录的用户获取特定信息,以防止其他人获取不属于他们的信息 我正在进行注册,这将用户保存到mongodb集合 我已经登录工作,它检查用户提供的密码和用户集合中的密码哈希是否匹配 现在,我正在为返回的用户创建一个会话 这里是我有点困惑的地方,在我的默认端点(“/”)中,我试图测试会话限制是否正常工作 是否也可以创建一个中间件来检查我是否可以添加到特定端点以避免重复代码 当前在创建我正在设置的会话时:Golang会话正在工作,但需要基于if值对路由进行身份验证,go,session,Go,Session,我正在尝试让会话在我的api上工作 我希望能够将某些端点定义为受限端点,这需要用户登录才能访问它们。我还希望能够仅为登录的用户获取特定信息,以防止其他人获取不属于他们的信息 我正在进行注册,这将用户保存到mongodb集合 我已经登录工作,它检查用户提供的密码和用户集合中的密码哈希是否匹配 现在,我正在为返回的用户创建一个会话 这里是我有点困惑的地方,在我的默认端点(“/”)中,我试图测试会话限制是否正常工作 是否也可以创建一个中间件来检查我是否可以添加到特定端点以避免重复代码 当前在创建我正在
sess.Values["id"] = existingUser.ID.String()
这样我就可以使用用户id从集合中查询特定于用户的信息(这安全吗?)
这是我的密码:
在顶层配置中间件时:
e.Use(session.Middleware(sessions.NewCookieStore([]byte("secret"))))
登录时:
err = bcrypt.CompareHashAndPassword([]byte(existingUser.HashedPassword), []byte(signInUser.Password))
if err != nil {
fmt.Println(err)
return c.String(http.StatusNotAcceptable, "Incorrect password")
}
// create the session
sess, err := session.Get("session", c)
if err != nil {
fmt.Println(err)
return err
}
sess.Options = &sessions.Options{
Path: "/",
MaxAge: 86400 * 7,
HttpOnly: true,
}
sess.Values["id"] = existingUser.ID.String()
sess.Save(c.Request(), c.Response())
return c.String(http.StatusAccepted, "Signed In!")
默认/路由:
e.GET("/", func(c echo.Context) error {
sess, err := session.Get("session", c)
if err != nil {
return c.JSON(http.StatusForbidden, "Access Denied")
}
if sess.Values["id"] == nil || sess.Values["id"] == "" {
return c.JSON(http.StatusForbidden, "Access Denied 2")
}
return c.JSON(http.StatusOK, sess.Values["id"])
})
所以你的代码正在运行。。。你只是想有人给你一个认可的印章,这是好的?会话数据存储在服务器上,并在用户发送正确的会话cookie时检索,因此从这个意义上讲是安全的。是的,您可以制作一个中间件,用于特定的路由。但是如果有人知道用户id,他们可以伪造会话cookie吗?会话cookie只是一个随机生成的id。您的服务器会跟踪该id,并将其链接到您为该id选择存储的特定数据。这是“伪造会话cookie”的唯一方法就是偷一个已经由你的服务器创建的。客户端无法创建会话。会话中存储的数据仅限于服务器端。看起来您正在使用github.com/gorilla/sessions。在这种情况下,cookie是经过加密和身份验证的,安全性完全取决于加密密钥的质量。