我制作了自己的身份验证(和单会话身份验证)方法,将会话保存到 redis,该方法是:
我检查,浏览器是否有来自我的服务器的 cookie,如果没有,则创建并保存在浏览器中
检查redis上是否存在cookie id,如果是,下一步如果不重定向到登录
以cookie id 为key 检查redis 值是什么,该值将是用户名,如果用户名存在,则通过用户名检查redis 中的值,如果用户名有cookie id 值,然后比较,cookie id 是否与当前浏览器id 相同,如果不是,重定向到登录
代码
请求前:
func (hs BeforeRequest) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if !strings.Contains(r.RequestURI, "/login") && !strings.Contains(r.RequestURI, "/logout") {
// Check is user has `guid` cookie
Guid, err := r.Cookie("guid")
// if cookie not available, set cookie and redirect to login
if err != nil {
// Set the cookie
expiration := time.Now().Add(365 * 24 * time.Hour)
cookie := http.Cookie{Name: "guid", Value: helper.GenerateGuid(), Expires:expiration}
http.SetCookie(w, &cookie)
// Redirect to login
http.Redirect(w, r, "/login", 301)
return
} else {
// Return username that used by user (by it's Guid)
_, err := redisdb.Get(Guid.Value).Result()
if err != redis.Nil {
// Get active Guid by username, return active Guid
UsedFor, err := redisdb.Get(IsHasRedis).Result()
if err != redis.Nil && err == nil {
if UsedFor != Guid.Value {
fmt.Println("this account used in another session")
http.Redirect(w, r, "/login", 301)
return
}
} else {
// definitely not logged in
http.Redirect(w, r, "/login", 301)
return
}
}
问题是,这个 auth 方法不稳定,idk 为什么但是在用户成功登录之后:
access /blog 重定向到登录
访问/博客(打开开发者工具)工作
访问/设置工作
几分钟/几小时后,访问 /settings 重定向到 /login
我登录,成功,访问/settings,再次重定向到/login
是的,只是不稳定
笔记 :
我使用“github.com/julienschmidt/httprouter”进行路由
“github.com/go-redis/redis” 用于 redis
莫回无
相关分类