login_logic.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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/msg/errormsg"
  7. "github.com/suyuan32/simple-admin-common/utils/encrypt"
  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. "github.com/zeromicro/go-zero/core/logx"
  13. "net/http"
  14. "strings"
  15. "time"
  16. "wechat-api/internal/logic/fastgpt"
  17. "wechat-api/internal/svc"
  18. "wechat-api/internal/types"
  19. )
  20. type LoginLogic struct {
  21. logx.Logger
  22. ctx context.Context
  23. svcCtx *svc.ServiceContext
  24. rw http.ResponseWriter
  25. }
  26. func NewLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext, rw http.ResponseWriter) *LoginLogic {
  27. return &LoginLogic{
  28. Logger: logx.WithContext(ctx),
  29. ctx: ctx,
  30. svcCtx: svcCtx,
  31. rw: rw,
  32. }
  33. }
  34. func (l *LoginLogic) Login(req *types.LoginReq) (resp *types.LoginResp, err error) {
  35. //判断调用类型
  36. if l.svcCtx.Config.LoginConf.LoginVerify != "captcha" && l.svcCtx.Config.LoginConf.LoginVerify != "all" {
  37. return nil, errorx.NewCodeAbortedError("login.loginTypeForbidden")
  38. }
  39. ok := l.svcCtx.Captcha.Verify(config.RedisCaptchaPrefix+req.CaptchaId, req.Captcha, true)
  40. if !ok {
  41. return nil, errorx.NewCodeInvalidArgumentError("login.wrongCaptcha")
  42. }
  43. user, err := l.svcCtx.CoreRpc.GetUserByUsername(l.ctx,
  44. &core.UsernameReq{
  45. Username: req.Username,
  46. })
  47. if err != nil {
  48. return nil, err
  49. }
  50. if !encrypt.BcryptCheck(req.Password, *user.Password) {
  51. return nil, errorx.NewCodeInvalidArgumentError("login.wrongUsernameOrPassword")
  52. }
  53. token, err := jwt.NewJwtToken(l.svcCtx.Config.Auth.AccessSecret, time.Now().Unix(),
  54. l.svcCtx.Config.Auth.AccessExpire, jwt.WithOption("userId", user.Id), jwt.WithOption("roleId",
  55. strings.Join(user.RoleCodes, ",")), jwt.WithOption("deptId", user.DepartmentId))
  56. if err != nil {
  57. return nil, err
  58. }
  59. // add token into database
  60. expiredAt := time.Now().Add(time.Second * time.Duration(l.svcCtx.Config.Auth.AccessExpire)).UnixMilli()
  61. _, err = l.svcCtx.CoreRpc.CreateToken(l.ctx, &core.TokenInfo{
  62. Uuid: user.Id,
  63. Token: pointy.GetPointer(token),
  64. Source: pointy.GetPointer("core_user"),
  65. Status: pointy.GetPointer(uint32(common.StatusNormal)),
  66. Username: user.Username,
  67. ExpiredAt: pointy.GetPointer(expiredAt),
  68. })
  69. if err != nil {
  70. return nil, err
  71. }
  72. err = l.svcCtx.Rds.Del(l.ctx, config.RedisCaptchaPrefix+req.CaptchaId).Err()
  73. if err != nil {
  74. logx.Errorw("failed to delete captcha in redis", logx.Field("detail", err))
  75. }
  76. //请求fastgpt,并种cookie。先同步,后期可以异步
  77. //set_cookie.NewFastGpt(l.svcCtx, fastgptLogic)
  78. fastgptLogic := fastgpt.NewSetTokenLogic(l.ctx, l.svcCtx, l.rw)
  79. //userId := *user.Id
  80. //静默执行
  81. _, _ = fastgptLogic.SetTokenByUserId(*user.Id)
  82. //if err != nil {
  83. // return nil, err
  84. //}
  85. resp = &types.LoginResp{
  86. BaseDataInfo: types.BaseDataInfo{Msg: errormsg.Success},
  87. Data: types.LoginInfo{
  88. UserId: *user.Id,
  89. Token: token,
  90. Expire: uint64(expiredAt),
  91. },
  92. }
  93. return resp, nil
  94. }