login_by_sms_logic.go 3.4 KB

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