s.Login.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package jwtx
  2. import (
  3. "errors"
  4. "time"
  5. "github.com/5-say/go-tool/gin/jwtx/db/dao/model"
  6. "github.com/5-say/go-tool/gin/jwtx/db/dao/query"
  7. "github.com/5-say/go-tool/gin/jwtx/tool"
  8. "github.com/gin-gonic/gin"
  9. "github.com/golang-jwt/jwt/v5"
  10. )
  11. // jwt token 登录
  12. //
  13. // c *gin.Context
  14. // loginGroup string 登录的 token 分组
  15. // loginTerminal string 登录的 终端名称(后续登出时,若引用此处的传值为“all”,则无视配置,强制登出所有终端)
  16. // accountID uint64 登录的 账户 ID
  17. //
  18. // e.g.
  19. //
  20. // jwtx.Singleton.Login(c, "admin", "pc", 1)
  21. // jwtx.Singleton.Login(c, "admin", "mobile", 1)
  22. func (s *SingletonT) Login(c *gin.Context, loginGroup string, loginTerminal string, accountID uint64) (err error) {
  23. // 获取分组配置
  24. var (
  25. config = s.Config[loginGroup]
  26. privateKey = s.PrivateKey[loginGroup]
  27. q = query.Use(s.DB[loginGroup])
  28. )
  29. // 清除旧 token
  30. err = s.Logout(c, loginGroup, loginTerminal, accountID)
  31. if err != nil {
  32. return
  33. }
  34. var (
  35. now = time.Now()
  36. expTime = now.Add(time.Hour * time.Duration(config.AccessExpireByHour))
  37. )
  38. // 创建新 token
  39. token := model.JwtxToken{
  40. AccountID: accountID,
  41. LoginGroup: loginGroup,
  42. LoginTerminal: loginTerminal,
  43. MakeTokenIP: c.ClientIP(),
  44. CreatedAt: now,
  45. LastRefreshAt: now,
  46. FinalRefreshAt: now,
  47. ExpirationAt: expTime,
  48. }
  49. if q.JwtxToken.WithContext(c).Create(&token) != nil {
  50. return errors.New("create token fail")
  51. }
  52. // 构造 token 字符串
  53. tokenStr, err := tool.GenerateToken(privateKey, jwt.MapClaims{
  54. "iat": now.Unix(), // 签发时间
  55. "exp": expTime.Unix(), // 过期时间
  56. "tid": token.ID, // jwt token ID
  57. }, tool.P_384)
  58. if err != nil {
  59. return errors.New("token refresh fail")
  60. }
  61. // 响应头填充 token
  62. c.Writer.Header().Add("token", tokenStr)
  63. return
  64. }