feat: openid login
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user