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 c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "code": 400, "message": "Invalid request body", }) } auth, err := services.Login(body) if err != nil { zap.L().Error("登录请求错误。", zap.String("err", err.Error())) return JSONResponseNoData(c, 500, "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 JSONResponse(c, 0, "success", auth.AccessToken) } func GetSession(c *fiber.Ctx) error { sid := c.Cookies(sessionCookieName) if sid == "" { return c.Status(403).JSON(fiber.Map{"error": "no session"}) } res, err := services.GetSession(sid) if err != nil { zap.L().Error("读取会话信息失败。", zap.String("err", err.Error())) return JSONResponseNoData(c, 403, "Get session error. (casdoor)") } return JSONResponse(c, 0, "success", res) } func RefreshToken(c *fiber.Ctx) error { sid := c.Cookies(sessionCookieName) if sid == "" { return c.Status(403).JSON(fiber.Map{"error": "no session"}) } res, err := services.RefreshToken(sid) if err != nil { zap.L().Error("刷新Token失败。", zap.String("err", err.Error())) return JSONResponseNoData(c, 403, "Refresh token error. (casdoor)") } return JSONResponse(c, 0, "success", 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 JSONResponseNoData(c, 500, "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 c.SendStatus(fiber.StatusNoContent) }