Cookies 基于Golang会话的身份验证
我正在尝试验证golang中的用户(使用电子邮件和密码),但我在会话中遇到了一些问题。似乎我无法从/login/到/(主页)页面检索会话值 用户注册Cookies 基于Golang会话的身份验证,cookies,go,session-cookies,Cookies,Go,Session Cookies,我正在尝试验证golang中的用户(使用电子邮件和密码),但我在会话中遇到了一些问题。似乎我无法从/login/到/(主页)页面检索会话值 用户注册 hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(r.Form["passwordSignup"][0]), bcrypt.DefaultCost) err = c.Insert(&model.UserModel{ Email: r.Form["emailSignu
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(r.Form["passwordSignup"][0]), bcrypt.DefaultCost)
err = c.Insert(&model.UserModel{
Email: r.Form["emailSignup"][0],
Password: string(hashedPassword),
CreatedAt: time.Now(),
})
// TODO : should session management be made in here ???
// you can use gorilla sessions if you want as far it works
http.SetCookie(w, cookie)
http.Redirect(w, r, "/", 301) // goes to the homepage(only accessed by authenticated users)
if r.Form["emailLogin"][0] == result.Email
&& bcrypt.CompareHashAndPassword([]byte(result.Password), []byte(r.Form["passwordLogin"][0])) == nil {
// TODO : Handling the session in here
http.Redirect(w, r, "/", 301) // goes to the home page
} else {
http.Redirect(w, r, "/login/", 301)
}
登录
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(r.Form["passwordSignup"][0]), bcrypt.DefaultCost)
err = c.Insert(&model.UserModel{
Email: r.Form["emailSignup"][0],
Password: string(hashedPassword),
CreatedAt: time.Now(),
})
// TODO : should session management be made in here ???
// you can use gorilla sessions if you want as far it works
http.SetCookie(w, cookie)
http.Redirect(w, r, "/", 301) // goes to the homepage(only accessed by authenticated users)
if r.Form["emailLogin"][0] == result.Email
&& bcrypt.CompareHashAndPassword([]byte(result.Password), []byte(r.Form["passwordLogin"][0])) == nil {
// TODO : Handling the session in here
http.Redirect(w, r, "/", 301) // goes to the home page
} else {
http.Redirect(w, r, "/login/", 301)
}
我也检查了这些链接:
重要的是,您应该检查所有错误,例如:
- hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(r.Form["passwordSignup"][0]), bcrypt.DefaultCost)
# Check our error, especially for something as important as password hashing
+ hashedPassword, err := bcrypt.GenerateFromPassword([]byte(r.Form["passwordSignup"][0]), bcrypt.DefaultCost)
if err != nil {
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
return
}
您的许多相关cookie代码缺失,但它应该是这样的:
cookie := &http.Cookie{
Name: "my_app",
Value: val, // Some encoded value
Path: "/", // Otherwise it defaults to the /login if you create this on /login (standard cookie behaviour)
MaxAge: 86400, // One day
}
http.SetCookie(w, cookie)
或者,如果您使用(我建议这样做,因为它正确地验证了Cookie),您将执行以下操作:
session, err := store.Get(r, "session-name")
if err != nil {
http.Error(w, err.Error(), 500)
return
}
session.Options.Path = "/"
session.Values["user"] = user
err := session.Save(r, w)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
http.Redirect(w, r, "/", 301)
重要的是,您应该检查所有错误,例如:
- hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(r.Form["passwordSignup"][0]), bcrypt.DefaultCost)
# Check our error, especially for something as important as password hashing
+ hashedPassword, err := bcrypt.GenerateFromPassword([]byte(r.Form["passwordSignup"][0]), bcrypt.DefaultCost)
if err != nil {
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
return
}
您的许多相关cookie代码缺失,但它应该是这样的:
cookie := &http.Cookie{
Name: "my_app",
Value: val, // Some encoded value
Path: "/", // Otherwise it defaults to the /login if you create this on /login (standard cookie behaviour)
MaxAge: 86400, // One day
}
http.SetCookie(w, cookie)
或者,如果您使用(我建议这样做,因为它正确地验证了Cookie),您将执行以下操作:
session, err := store.Get(r, "session-name")
if err != nil {
http.Error(w, err.Error(), 500)
return
}
session.Options.Path = "/"
session.Values["user"] = user
err := session.Save(r, w)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
http.Redirect(w, r, "/", 301)
如果您正在寻找使用Redis或Memcache作为会话存储的简单会话管理解决方案,我建议您使用(免责声明:我写的) 对用户进行身份验证后,只需添加他们的会话,如下所示:
func (s Server) Login(w http.ResponseWriter, r *http.Request) {
user = Authenticate(r)
if user != nil {
// Key must be unique to one user among all users
err := s.jeff.Set(r.Context(), w, user.Email)
// handle error
}
// finish login
}
使用Jeff中间件包装后,后续请求将自动进行身份验证。该图书馆的建造考虑到了简单性,是作为现有图书馆的替代品而建造的
有关用法和功能的更多详细信息,请参阅自述:
如果您正在寻找一个简单的会话管理解决方案,它使用Redis或Memcache作为会话存储,我建议您使用(免责声明:我写的) 对用户进行身份验证后,只需添加他们的会话,如下所示:
func (s Server) Login(w http.ResponseWriter, r *http.Request) {
user = Authenticate(r)
if user != nil {
// Key must be unique to one user among all users
err := s.jeff.Set(r.Context(), w, user.Email)
// handle error
}
// finish login
}
使用Jeff中间件包装后,后续请求将自动进行身份验证。该图书馆的建造考虑到了简单性,是作为现有图书馆的替代品而建造的
有关用法和功能的更多详细信息,请参阅自述:
两个提示:您应该绝对检查bcrypt的错误。您应该将
cookie
的Path
值设置为/
-否则它将默认为首次创建cookie的路径。请注意,如果r.Form[“emailLogin”][0]==result.Email,请避免这样做,形成一个名为Email=r.Form.Get('emailLogin')的变量始终是一个好习惯我没有直接在if语句中使用它,而是在前面删除了错误检查,因为我想让它更具可读性,让您能够专注于问题的相关部分。无论如何,谢谢你的建议。两个提示:你应该绝对检查bcrypt的错误。您应该将cookie
的Path
值设置为/
-否则它将默认为首次创建cookie的路径。请注意,如果r.Form[“emailLogin”][0]==result.Email
,请避免这样做,形成一个名为Email=r.Form.Get('emailLogin')的变量始终是一个好习惯我没有直接在if语句中使用它,而是在前面删除了错误检查,因为我想让它更具可读性,让您能够专注于问题的相关部分。无论如何,谢谢你的建议。