mylomen-server/service/third_login.go
2023-06-04 22:54:54 +08:00

128 lines
3.4 KiB
Go

package service
import (
"ai-gateway/common/constant"
"ai-gateway/common/dto"
"ai-gateway/common/utils"
"ai-gateway/infrastructure/redis"
"ai-gateway/infrastructure/repository"
"code.freebrio.com/fb-go/lib/context"
"code.freebrio.com/fb-go/lib/fbl"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"errors"
"github.com/google/uuid"
"github.com/labstack/echo/v4"
"strings"
"time"
)
type login struct {
}
var Login login
func (l login) Login(ctx context.GormWithZap, req dto.ThirdLoginReq) (string, error) {
//1. 验证账号密码
h := sha256.Sum256([]byte(req.Password))
passHash := hex.EncodeToString(h[:])
acUser := repository.ThirdCorpUserAccount.FindThirdAccountBy(ctx, req.BizId, req.CorpID, req.Account)
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, "-", "")
var thirdUserToken = repository.FThirdUserTokenDO{
CorpId: req.CorpID,
BizId: req.BizId,
CorpUid: acUser.Id,
AccessToken: token,
ExpireTime: time.Now().Add(time.Duration(24*365*100) * time.Hour).UnixMilli(),
}
loginUserToken := repository.ThirdUserToken.FindByBizAndCorpId(ctx, req.BizId, acUser.Id)
if loginUserToken == nil {
repository.ThirdUserToken.SaveUserLoginToken(ctx, &thirdUserToken)
return l.GenAccessToken(&thirdUserToken), nil
}
loginUserToken.AccessToken = thirdUserToken.AccessToken
loginUserToken.ExpireTime = thirdUserToken.ExpireTime
repository.ThirdUserToken.UpdateUserLoginToken(ctx, loginUserToken)
return l.GenAccessToken(loginUserToken), nil
}
func (l login) GetLoginResult(ctx context.GormWithZap, c *echo.Context) *dto.ThirdUserLoginToken {
accessToken := utils.GetAccessToken(c)
if accessToken == "" {
return nil
}
thirdLoginToken := l.ParseThirdUserLoginTokenByToken(accessToken)
if thirdLoginToken == nil {
return nil
}
//redis
redisStr, err := redis.Get(constant.THIRD_LOGIN_TOKEN + thirdLoginToken.AccessToken)
if err != nil && redisStr != "" {
var loginInfo dto.ThirdUserLoginToken
if redisErr := json.Unmarshal([]byte(redisStr), &loginInfo); redisErr == nil {
return &loginInfo
}
}
//repository
dbData := repository.ThirdUserToken.FindByToken(ctx, thirdLoginToken.AccessToken)
if dbData == nil {
return nil
}
var finalData = dto.ThirdUserLoginToken{
CorpId: dbData.CorpId,
BizId: dbData.BizId,
Uid: dbData.CorpUid,
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
}
func (login) ParseThirdUserLoginTokenByToken(accessToken string) *dto.ThirdUserLoginToken {
splits := strings.Split(accessToken, "_")
if len(splits) != 4 {
return nil
}
return &dto.ThirdUserLoginToken{
CorpId: fbl.ToUint64(splits[0]),
BizId: fbl.ToUint64(splits[1]),
Uid: fbl.ToUint64(splits[2]),
AccessToken: splits[3],
}
}
func (login) GenAccessToken(data *repository.FThirdUserTokenDO) string {
var buf strings.Builder
buf.WriteString(fbl.ToString(data.CorpId))
buf.WriteString("_")
buf.WriteString(fbl.ToString(data.BizId))
buf.WriteString("_")
buf.WriteString(fbl.ToString(data.CorpUid))
buf.WriteString("_")
buf.WriteString(data.AccessToken)
return buf.String()
}