73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
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")
|
||
}
|