auth.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 Fail(c, "Invalid request body")
  18. }
  19. auth, err := services.Login(body)
  20. if err != nil {
  21. zap.L().Error("登录请求错误。", zap.String("err", err.Error()))
  22. return Error(c, "Login error. (casdoor)")
  23. }
  24. // 设置 HttpOnly cookie 保存 sid
  25. c.Cookie(&fiber.Cookie{
  26. Name: sessionCookieName,
  27. Value: auth.SessionId,
  28. Expires: time.Now().Add(domain.SessionTTL),
  29. HTTPOnly: true,
  30. Secure: false, // production: true
  31. SameSite: "Lax",
  32. Path: "/fwh-toolbox/",
  33. })
  34. return Success(c, auth.AccessToken)
  35. }
  36. func GetSession(c *fiber.Ctx) error {
  37. sid := c.Cookies(sessionCookieName)
  38. if sid == "" {
  39. return Forbidden(c, "no session")
  40. }
  41. res, err := services.GetSession(sid)
  42. if err != nil {
  43. zap.L().Error("读取会话信息失败。", zap.String("err", err.Error()))
  44. return Forbidden(c, "Get session error. (casdoor)")
  45. }
  46. return Success(c, res)
  47. }
  48. func RefreshToken(c *fiber.Ctx) error {
  49. sid := c.Cookies(sessionCookieName)
  50. if sid == "" {
  51. return Forbidden(c, "no session")
  52. }
  53. res, err := services.RefreshToken(sid)
  54. if err != nil {
  55. zap.L().Error("刷新Token失败。", zap.String("err", err.Error()))
  56. return Forbidden(c, "Refresh token error. (casdoor)")
  57. }
  58. return Success(c, res)
  59. }
  60. func Logout(c *fiber.Ctx) error {
  61. sid := c.Cookies(sessionCookieName)
  62. err := services.Logout(sid)
  63. if err != nil {
  64. zap.L().Error("登出请求失败。", zap.String("err", err.Error()))
  65. return Error(c, "Logout error. (casdoor)")
  66. }
  67. // 清除 cookie
  68. c.Cookie(&fiber.Cookie{
  69. Name: sessionCookieName,
  70. Value: "",
  71. Expires: time.Now().Add(-time.Hour),
  72. HTTPOnly: true,
  73. Secure: false,
  74. Path: "/fwh-toolbox/",
  75. })
  76. return NoContent(c)
  77. }