auth.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package controllers
  2. import (
  3. "fwh-toolbox-server/domain"
  4. "fwh-toolbox-server/dto"
  5. "fwh-toolbox-server/services"
  6. "time"
  7. "github.com/gofiber/fiber/v2"
  8. "go.uber.org/zap"
  9. )
  10. var (
  11. // session cookie name
  12. sessionCookieName = "sid"
  13. )
  14. func Login(c *fiber.Ctx) error {
  15. var body dto.LoginParam
  16. if err := c.BodyParser(&body); err != nil {
  17. return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
  18. "code": 400,
  19. "message": "Invalid request body",
  20. })
  21. }
  22. auth, err := services.Login(body)
  23. if err != nil {
  24. zap.L().Error("登录请求错误。", zap.String("err", err.Error()))
  25. return JSONResponseNoData(c, 500, "Login error. (casdoor)")
  26. }
  27. // 设置 HttpOnly cookie 保存 sid
  28. c.Cookie(&fiber.Cookie{
  29. Name: sessionCookieName,
  30. Value: auth.SessionId,
  31. Expires: time.Now().Add(domain.SessionTTL),
  32. HTTPOnly: true,
  33. Secure: false, // production: true
  34. SameSite: "Lax",
  35. Path: "/fwh-toolbox/",
  36. })
  37. return JSONResponse(c, 0, "success", auth.AccessToken)
  38. }
  39. func GetSession(c *fiber.Ctx) error {
  40. sid := c.Cookies(sessionCookieName)
  41. if sid == "" {
  42. return c.Status(403).JSON(fiber.Map{"error": "no session"})
  43. }
  44. res, err := services.GetSession(sid)
  45. if err != nil {
  46. zap.L().Error("读取会话信息失败。", zap.String("err", err.Error()))
  47. return JSONResponseNoData(c, 403, "Get session error. (casdoor)")
  48. }
  49. return JSONResponse(c, 0, "success", res)
  50. }
  51. func RefreshToken(c *fiber.Ctx) error {
  52. sid := c.Cookies(sessionCookieName)
  53. if sid == "" {
  54. return c.Status(403).JSON(fiber.Map{"error": "no session"})
  55. }
  56. res, err := services.RefreshToken(sid)
  57. if err != nil {
  58. zap.L().Error("刷新Token失败。", zap.String("err", err.Error()))
  59. return JSONResponseNoData(c, 403, "Refresh token error. (casdoor)")
  60. }
  61. return JSONResponse(c, 0, "success", res)
  62. }
  63. func Logout(c *fiber.Ctx) error {
  64. sid := c.Cookies(sessionCookieName)
  65. err := services.Logout(sid)
  66. if err != nil {
  67. zap.L().Error("登出请求失败。", zap.String("err", err.Error()))
  68. return JSONResponseNoData(c, 500, "Logout error. (casdoor)")
  69. }
  70. // 清除 cookie
  71. c.Cookie(&fiber.Cookie{
  72. Name: sessionCookieName,
  73. Value: "",
  74. Expires: time.Now().Add(-time.Hour),
  75. HTTPOnly: true,
  76. Secure: false,
  77. Path: "/fwh-toolbox/",
  78. })
  79. return c.SendStatus(fiber.StatusNoContent)
  80. }