mylomen-server/service/third_login.go

194 lines
5.0 KiB
Go
Raw Normal View History

2023-06-04 22:54:54 +08:00
package service
import (
"ai-gateway/common/constant"
"ai-gateway/common/dto"
2024-04-29 19:35:18 +08:00
"ai-gateway/common/email"
2023-06-04 22:54:54 +08:00
"ai-gateway/common/utils"
"ai-gateway/infrastructure/redis"
"ai-gateway/infrastructure/repository"
2024-02-21 12:04:40 +08:00
"context"
2023-06-04 22:54:54 +08:00
"crypto/sha256"
"encoding/hex"
"encoding/json"
"errors"
"github.com/google/uuid"
"github.com/labstack/echo/v4"
2024-04-29 19:35:18 +08:00
"golang.org/x/time/rate"
2023-06-04 22:54:54 +08:00
"strings"
"time"
)
type login struct {
}
var Login login
2024-04-29 19:35:18 +08:00
// 令牌桶大小为 100, 以每秒 10 个 Token 的速率向桶中放置 Token
var limiter = rate.NewLimiter(10, 10)
// Register 注册
func (l login) Register(ctx context.Context, req dto.ThirdRegisterReq) error {
acUser := repository.GUser.FindByAccount(ctx, req.Account)
if acUser != nil && acUser.Deleted == 0 {
return errors.New("user exist")
}
var user repository.AccountDO
user.Name = req.Name
user.Avatar = req.Icon
user.Email = req.Account
//密码加密
h := sha256.Sum256([]byte(req.Password))
passHash := hex.EncodeToString(h[:])
user.Pwd = passHash
repository.GUser.Create(ctx, &user)
return nil
}
2024-02-21 12:04:40 +08:00
func (l login) Login(ctx context.Context, req dto.ThirdLoginReq) (string, error) {
2024-05-15 17:29:08 +08:00
2023-06-04 22:54:54 +08:00
//1. 验证账号密码
h := sha256.Sum256([]byte(req.Password))
passHash := hex.EncodeToString(h[:])
2024-04-29 19:35:18 +08:00
acUser := repository.GUser.FindByAccount(ctx, req.Account)
2023-06-04 22:54:54 +08:00
if acUser == nil || acUser.Deleted == 1 {
return "", errors.New("user not exist")
}
if passHash != acUser.Pwd {
return "", errors.New("password is error")
}
//生成token
token := uuid.New().String()
token = strings.ReplaceAll(token, "-", "")
2024-04-29 19:35:18 +08:00
var thirdUserToken = repository.GLoginToken{
Uid: acUser.Id,
2023-06-04 22:54:54 +08:00
AccessToken: token,
ExpireTime: time.Now().Add(time.Duration(24*365*100) * time.Hour).UnixMilli(),
}
2024-04-29 19:35:18 +08:00
gUserToken := repository.GUserToken.FindByUid(ctx, acUser.Id)
if gUserToken == nil {
repository.GUserToken.SaveUserLoginToken(ctx, &thirdUserToken)
2023-06-04 22:54:54 +08:00
return l.GenAccessToken(&thirdUserToken), nil
}
2024-04-29 19:35:18 +08:00
gUserToken.AccessToken = thirdUserToken.AccessToken
gUserToken.ExpireTime = thirdUserToken.ExpireTime
repository.GUserToken.UpdateUserLoginToken(ctx, gUserToken)
2024-05-15 17:29:08 +08:00
2024-04-29 19:35:18 +08:00
return l.GenAccessToken(gUserToken), nil
}
func (l login) SendResetPwdCode(ctx context.Context, account string) error {
//1. 验证账号
acUser := repository.GUser.FindByAccount(ctx, account)
if acUser == nil || acUser.Deleted == 1 {
return errors.New("user not exist")
}
//2. 生成code & 发送
code := utils.GetPseudoRandomCode(6)
//3. save into redis
if err := redis.Set(constant.G_RESET_PWD_CODE+account, code, time.Duration(30)*time.Minute); err != nil {
return errors.New("cache illegal")
}
//频控
if !limiter.Allow() {
return errors.New("rate limit, please try again later")
}
//4. send code
if err := email.SendEmailVerifyCodeByEmail(code, account); err != nil {
return errors.New("send email code illegal")
}
return nil
}
// ResetPwd 重置密码
func (l login) ResetPwd(ctx context.Context, req dto.ThirdResetPwdReq) error {
//1. 验证code
redisStr, err := redis.Get(constant.G_RESET_PWD_CODE + req.Account)
if err != nil && redisStr != req.Code {
return errors.New("code is error")
}
//2. 查询用户
acUser := repository.GUser.FindByAccount(ctx, req.Account)
if acUser == nil || acUser.Deleted == 1 {
return errors.New("user not exist")
}
//3. 重置密码
h := sha256.Sum256([]byte(req.Password))
passHash := hex.EncodeToString(h[:])
acUser.Pwd = passHash
repository.GUser.UpdateById(ctx, acUser)
//生成token
token := uuid.New().String()
token = strings.ReplaceAll(token, "-", "")
var thirdUserToken = repository.GLoginToken{
Uid: acUser.Id,
Platform: "web",
AccessToken: token,
ExpireTime: time.Now().Add(time.Duration(24*365*100) * time.Hour).UnixMilli(),
}
loginUserToken := repository.GUserToken.FindByUid(ctx, acUser.Id)
if loginUserToken == nil {
repository.GUserToken.SaveUserLoginToken(ctx, &thirdUserToken)
return nil
}
2023-06-04 22:54:54 +08:00
loginUserToken.AccessToken = thirdUserToken.AccessToken
loginUserToken.ExpireTime = thirdUserToken.ExpireTime
2024-04-29 19:35:18 +08:00
repository.GUserToken.UpdateUserLoginToken(ctx, loginUserToken)
return nil
2023-06-04 22:54:54 +08:00
}
2024-02-21 12:04:40 +08:00
func (l login) GetLoginResult(ctx context.Context, c *echo.Context) *dto.ThirdUserLoginToken {
2023-06-04 22:54:54 +08:00
accessToken := utils.GetAccessToken(c)
if accessToken == "" {
return nil
}
//redis
2024-04-29 19:35:18 +08:00
redisStr, err := redis.Get(constant.THIRD_LOGIN_TOKEN + accessToken)
2023-06-04 22:54:54 +08:00
if err != nil && redisStr != "" {
var loginInfo dto.ThirdUserLoginToken
if redisErr := json.Unmarshal([]byte(redisStr), &loginInfo); redisErr == nil {
return &loginInfo
}
}
//repository
2024-04-29 19:35:18 +08:00
dbData := repository.GUserToken.FindByToken(ctx, accessToken)
2023-06-04 22:54:54 +08:00
if dbData == nil {
return nil
}
var finalData = dto.ThirdUserLoginToken{
2024-04-29 19:35:18 +08:00
Uid: dbData.Uid,
2023-06-04 22:54:54 +08:00
AccessToken: l.GenAccessToken(dbData),
}
//save into redis
if bytes, saveErr := json.Marshal(finalData); saveErr == nil {
redis.Set(constant.THIRD_LOGIN_TOKEN+accessToken, string(bytes), time.Duration(6)*time.Hour)
}
return &finalData
}
2024-04-29 19:35:18 +08:00
func (login) GenAccessToken(data *repository.GLoginToken) string {
return data.AccessToken
2023-06-04 22:54:54 +08:00
}