今天聊聊 Cookie 和 Session 的登录认证怎么搞,以及能用在哪。
var sessionStore sync.Map
type User struct {
Name string `json:"name" binding:"required"`
Password string `json:"password" binding:"required"`
}
sync.Map
存 Session,线程安全。User
定义用户名和密码,必填。func generateSessionID(user User) (string, error) {
sessionID := uuid.NewString()
userData, _ := json.Marshal(user)
sessionStore.Store(sessionID, userData)
return sessionID, nil
}
uuid
生成随机 ID,用户信息转 JSON 存起来。func getUserFromSession(sessionID string) (*User, bool) {
if data, ok := sessionStore.Load(sessionID); ok {
var user User
json.Unmarshal(data.([]byte), &user)
return &user, true
}
return nil, false
}
User
。func loginHandler(ctx *gin.Context) {
var user User
if ctx.ShouldBindJSON(&user) != nil {
ctx.JSON(400, gin.H{"error": "bad request"})
return
}
if sessionID, _ := ctx.Cookie("auth"); sessionID != "" {
if cachedUser, found := getUserFromSession(sessionID); found {
ctx.JSON(200, cachedUser)
return
}
}
sessionID, _ := generateSessionID(user)
ctx.SetCookie("auth", sessionID, 3600, "/", "localhost", false, false)
ctx.JSON(200, gin.H{"message": "登录成功"})
}
Cookie 携带 Session ID,服务器通过 ID 查询 Redis 缓存,若命中则返回用户信息,否则生成新会话并缓存后返回客户端。
Cookie 未加密,多机不共享。
小项目好使,大规模用token
,更安全
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。