package handler import ( "time" "github.com/gofiber/fiber/v2" "gitee.ltd/lxh/wechat-robot/internal/config" "gitee.ltd/lxh/wechat-robot/internal/middleware" ) // LoginPage 显示登录页面 func LoginPage(c *fiber.Ctx) error { // 如果已经登录,则重定向到机器人列表 if middleware.IsAuthenticated(c) { return c.Redirect("/admin/robots") } // 获取可能的错误消息 errorMsg := c.Query("error") // 设置 NoLayout 为 true,使用独立布局,不显示主应用的导航组件 return c.Render("auth/login", fiber.Map{ "Title": "登录", "ErrorMsg": errorMsg, "NoLayout": true, }) } // LoginSubmit 处理登录表单提交 func LoginSubmit(c *fiber.Ctx) error { // 获取用户输入的密钥 token := c.FormValue("token") // 检查凭据有效性 cfg, err := config.Load() if err != nil { return c.Redirect("/login?error=系统错误,无法加载配置") } // 仅验证密钥是否与配置的AdminToken匹配 if token != cfg.Auth.AdminToken { return c.Redirect("/login?error=访问密钥不正确") } // 登录成功,设置认证 Cookie cookie := new(fiber.Cookie) cookie.Name = "auth_token" cookie.Value = cfg.Auth.SecretKey // 在实际应用中,这应该是一个生成的会话令牌 cookie.Expires = time.Now().Add(time.Hour * time.Duration(cfg.Auth.TokenExpiry)) cookie.HTTPOnly = true cookie.Path = "/" c.Cookie(cookie) // 重定向到机器人列表页面,而不是首页 return c.Redirect("/admin/robots") } // Logout 处理退出登录 func Logout(c *fiber.Ctx) error { // 清除认证 Cookie cookie := new(fiber.Cookie) cookie.Name = "auth_token" cookie.Value = "" cookie.Expires = time.Now().Add(-time.Hour) // 设置为过期 cookie.HTTPOnly = true cookie.Path = "/" c.Cookie(cookie) // 重定向到登录页 return c.Redirect("/login") }