login_by_email_logic.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package auth
  2. import (
  3. "context"
  4. "github.com/suyuan32/simple-admin-common/config"
  5. "github.com/suyuan32/simple-admin-common/enum/common"
  6. "github.com/suyuan32/simple-admin-common/i18n"
  7. "github.com/suyuan32/simple-admin-common/utils/jwt"
  8. "github.com/suyuan32/simple-admin-common/utils/pointy"
  9. "github.com/suyuan32/simple-admin-core/rpc/types/core"
  10. "github.com/zeromicro/go-zero/core/errorx"
  11. "net/http"
  12. "strings"
  13. "time"
  14. "wechat-api/internal/logic/fastgpt"
  15. "wechat-api/internal/svc"
  16. "wechat-api/internal/types"
  17. "github.com/zeromicro/go-zero/core/logx"
  18. )
  19. type LoginByEmailLogic struct {
  20. logx.Logger
  21. ctx context.Context
  22. svcCtx *svc.ServiceContext
  23. w http.ResponseWriter
  24. }
  25. func NewLoginByEmailLogic(ctx context.Context, svcCtx *svc.ServiceContext, w http.ResponseWriter) *LoginByEmailLogic {
  26. return &LoginByEmailLogic{
  27. Logger: logx.WithContext(ctx),
  28. ctx: ctx,
  29. svcCtx: svcCtx,
  30. w: w,
  31. }
  32. }
  33. func (l *LoginByEmailLogic) LoginByEmail(req *types.LoginByEmailReq) (resp *types.LoginResp, err error) {
  34. if l.svcCtx.Config.LoginConf.LoginVerify != "email" && l.svcCtx.Config.LoginConf.LoginVerify != "sms_or_email" &&
  35. l.svcCtx.Config.LoginConf.LoginVerify != "all" {
  36. return nil, errorx.NewCodeAbortedError("login.loginTypeForbidden")
  37. }
  38. captchaData, err := l.svcCtx.Rds.Get(l.ctx, config.RedisCaptchaPrefix+req.Email).Result()
  39. if err != nil {
  40. logx.Errorw("failed to get captcha data in redis for email validation", logx.Field("detail", err),
  41. logx.Field("data", req))
  42. return nil, errorx.NewCodeInvalidArgumentError(i18n.Failed)
  43. }
  44. if captchaData != req.Captcha {
  45. return nil, errorx.NewCodeInvalidArgumentError("login.wrongCaptcha")
  46. }
  47. userData, err := l.svcCtx.CoreRpc.GetUserList(l.ctx, &core.UserListReq{
  48. Page: 1,
  49. PageSize: 1,
  50. Email: &req.Email,
  51. })
  52. if err != nil {
  53. return nil, err
  54. }
  55. if userData.Total == 0 {
  56. return nil, errorx.NewCodeInvalidArgumentError("login.userNotExist")
  57. }
  58. token, err := jwt.NewJwtToken(l.svcCtx.Config.Auth.AccessSecret, time.Now().Unix(),
  59. l.svcCtx.Config.Auth.AccessExpire, jwt.WithOption("userId", userData.Data[0].Id), jwt.WithOption("roleId",
  60. strings.Join(userData.Data[0].RoleCodes, ",")), jwt.WithOption("deptId", userData.Data[0].DepartmentId))
  61. if err != nil {
  62. return nil, err
  63. }
  64. // add token into database
  65. expiredAt := time.Now().Add(time.Second * time.Duration(l.svcCtx.Config.Auth.AccessExpire)).UnixMilli()
  66. _, err = l.svcCtx.CoreRpc.CreateToken(l.ctx, &core.TokenInfo{
  67. Uuid: userData.Data[0].Id,
  68. Token: pointy.GetPointer(token),
  69. Source: pointy.GetPointer("core_user"),
  70. Status: pointy.GetPointer(uint32(common.StatusNormal)),
  71. Username: userData.Data[0].Username,
  72. ExpiredAt: pointy.GetPointer(expiredAt),
  73. })
  74. if err != nil {
  75. return nil, err
  76. }
  77. err = l.svcCtx.Rds.Del(l.ctx, config.RedisCaptchaPrefix+req.Email).Err()
  78. if err != nil {
  79. logx.Errorw("failed to delete captcha in redis", logx.Field("detail", err))
  80. }
  81. //注册cookie 到fastgpt
  82. fastgptLogic := fastgpt.NewSetTokenLogic(l.ctx, l.svcCtx, l.w)
  83. userId := func(s *string) string {
  84. if s == nil {
  85. return ""
  86. }
  87. return *s
  88. }(userData.Data[0].Id)
  89. _, err = fastgptLogic.SetTokenByUserId(userId)
  90. if err != nil {
  91. return nil, err
  92. }
  93. resp = &types.LoginResp{
  94. BaseDataInfo: types.BaseDataInfo{Msg: l.svcCtx.Trans.Trans(l.ctx, "login.loginSuccessTitle")},
  95. Data: types.LoginInfo{
  96. UserId: userId,
  97. Token: token,
  98. Expire: uint64(expiredAt),
  99. },
  100. }
  101. return resp, nil
  102. }