package controllers import ( "fwh-toolbox-server/domain" "fwh-toolbox-server/dto" "fwh-toolbox-server/services" "time" "github.com/gofiber/fiber/v2" "go.uber.org/zap" ) var ( // session cookie name sessionCookieName = "sid" ) func Login(c *fiber.Ctx) error { var body dto.LoginParam if err := c.BodyParser(&body); err != nil { return Fail(c, "Invalid request body") } auth, err := services.Login(body) if err != nil { zap.L().Error("登录请求错误。", zap.String("err", err.Error())) return Error(c, "Login error. (casdoor)") } // 设置 HttpOnly cookie 保存 sid c.Cookie(&fiber.Cookie{ Name: sessionCookieName, Value: auth.SessionId, Expires: time.Now().Add(domain.SessionTTL), HTTPOnly: true, Secure: false, // production: true SameSite: "Lax", Path: "/fwh-toolbox/", }) return Success(c, auth.AccessToken) } func GetSession(c *fiber.Ctx) error { sid := c.Cookies(sessionCookieName) if sid == "" { return Forbidden(c, "no session") } res, err := services.GetSession(sid) if err != nil { zap.L().Error("读取会话信息失败。", zap.String("err", err.Error())) return Forbidden(c, "Get session error. (casdoor)") } return Success(c, res) } func RefreshToken(c *fiber.Ctx) error { sid := c.Cookies(sessionCookieName) if sid == "" { return Forbidden(c, "no session") } res, err := services.RefreshToken(sid) if err != nil { zap.L().Error("刷新Token失败。", zap.String("err", err.Error())) return Forbidden(c, "Refresh token error. (casdoor)") } return Success(c, res) } func Logout(c *fiber.Ctx) error { sid := c.Cookies(sessionCookieName) err := services.Logout(sid) if err != nil { zap.L().Error("登出请求失败。", zap.String("err", err.Error())) return Error(c, "Logout error. (casdoor)") } // 清除 cookie c.Cookie(&fiber.Cookie{ Name: sessionCookieName, Value: "", Expires: time.Now().Add(-time.Hour), HTTPOnly: true, Secure: false, Path: "/fwh-toolbox/", }) return NoContent(c) }