feat: openid login

This commit is contained in:
zzw
2026-09-02 17:37:12 +08:00
parent 540f74f9b7
commit bb14f9e324
38 changed files with 1627 additions and 1091 deletions
+70 -28
View File
@@ -2,12 +2,14 @@ package logic
import (
"context"
"strconv"
"time"
"lone-services/pkg/redis"
"lone-services/pkg/utils"
user "lone-services/rpc/user/pb"
"lone-services/services/user/internal/config"
"lone-services/services/user/internal/dao"
"strconv"
"time"
jsoniter "github.com/json-iterator/go"
)
@@ -46,40 +48,80 @@ func decryptMobile(mobile string) string {
return plain
}
func toSession(info dao.UserRow, mobilePlain string) dao.UserLoginSession {
func subjectTypeToUserType(subjectType string) uint8 {
switch subjectType {
case dao.SubjectTypeSale:
return dao.TypeSale
case dao.SubjectTypeStore:
return dao.TypeStore
case dao.SubjectTypeUser:
return dao.TypeUser
default:
return dao.TypeUser
}
}
func toSession(info dao.UserRow, mobilePlain string, client *dao.Client, saleId int64) dao.UserLoginSession {
userType := dao.TypeUser
clientCode := utils.StringEmpty
if client != nil {
clientCode = client.Code
userType = subjectTypeToUserType(client.SubjectType)
}
return dao.UserLoginSession{
Id: info.Id,
Name: info.Name,
Avatar: info.Avatar,
Mobile: mobilePlain,
Gender: info.Gender,
Birthday: info.Birthday.DateString(),
Status: info.Status,
LastTime: utils.Now(),
Id: info.Id,
Name: info.Name,
Avatar: info.Avatar,
Mobile: mobilePlain,
Gender: info.Gender,
Birthday: info.Birthday.DateString(),
Type: userType,
ClientCode: clientCode,
SaleId: saleId,
}
}
func buildToken(session dao.UserLoginSession) dao.Token {
seed := session.Mobile + strconv.FormatInt(session.Id, utils.NumberTen) + utils.Now().String()
token := utils.MD5Encrypt(seed)
func sessionClaims(session dao.UserLoginSession, tokenType string) utils.Claims {
return utils.Claims{
UserID: session.Id,
Name: session.Name,
Avatar: session.Avatar,
Mobile: session.Mobile,
Gender: session.Gender,
Birthday: session.Birthday,
Type: session.Type,
ClientCode: session.ClientCode,
SaleId: session.SaleId,
StoreId: session.StoreId,
TokenType: tokenType,
}
}
func buildJwtToken(jwtAuth *config.JWTAuth, session dao.UserLoginSession) (dao.Token, error) {
accessToken, err := jwtAuth.Access.Sign(sessionClaims(session, utils.TokenTypeAccess))
if err != nil {
return dao.Token{}, err
}
refreshToken, err := jwtAuth.Refresh.Sign(sessionClaims(session, utils.TokenTypeRefresh))
if err != nil {
return dao.Token{}, err
}
return dao.Token{
Token: token,
Refresh: utils.MD5Encrypt(seed + token),
Info: session,
}
AccessToken: accessToken,
RefreshToken: refreshToken,
Info: session,
}, nil
}
func setLogin(token, refresh string, session dao.UserLoginSession) utils.Status {
expireMin := utils.GetConfigInt("base.login_out_time")
expire := time.Duration(expireMin) * time.Minute
refreshMin := utils.GetConfigInt("base.login_refresh_out_time")
refreshExpire := time.Duration(refreshMin) * time.Minute
func setLogin(jwtAuth *config.JWTAuth, accessToken, refreshToken string, session dao.UserLoginSession) utils.Status {
accessExpire := time.Duration(jwtAuth.Access.TTL) * time.Second
refreshExpire := time.Duration(jwtAuth.Refresh.TTL) * time.Second
ctx := context.Background()
userStr, _ := jsoniter.Marshal(session)
redisKey := utils.GetLoginKey(utils.LoginTypeUser, token)
if err := redis.Client.Set(ctx, redisKey, userStr, expire).Err(); err != nil {
redisKey := utils.GetLoginKey(utils.LoginTypeUser, accessToken)
if err := redis.Client.Set(ctx, redisKey, userStr, accessExpire).Err(); err != nil {
return utils.Fail
}
@@ -95,14 +137,14 @@ func setLogin(token, refresh string, session dao.UserLoginSession) utils.Status
}
}
loginInfo.Token = token
loginInfo.Refresh = refresh
loginInfo.Token = accessToken
loginInfo.Refresh = refreshToken
loginInfo.Info = userStr
newStr, _ := jsoniter.Marshal(loginInfo)
if err := redis.Client.Set(ctx, redisKeysKey, newStr, refreshExpire).Err(); err != nil {
return utils.Fail
}
refreshKey := utils.GetLoginRefreshKey(utils.LoginTypeUser, refresh)
refreshKey := utils.GetLoginRefreshKey(utils.LoginTypeUser, refreshToken)
if err := redis.Client.Set(ctx, refreshKey, strconv.FormatInt(session.Id, utils.NumberTen), refreshExpire).Err(); err != nil {
return utils.Fail
}