fix: kick token

This commit is contained in:
icey-yu 2024-09-24 14:33:43 +08:00
parent 606a3b3e4f
commit 79972e6c14
3 changed files with 39 additions and 14 deletions

View File

@ -46,6 +46,7 @@ type authServer struct {
type Config struct { type Config struct {
RpcConfig config.Auth RpcConfig config.Auth
MsgGatewayConfig config.MsgGateway
RedisConfig config.Redis RedisConfig config.Redis
Share config.Share Share config.Share
Discovery config.Discovery Discovery config.Discovery
@ -64,6 +65,7 @@ func Start(ctx context.Context, config *Config, client discovery.SvcDiscoveryReg
redis2.NewTokenCacheModel(rdb, config.RpcConfig.TokenPolicy.Expire), redis2.NewTokenCacheModel(rdb, config.RpcConfig.TokenPolicy.Expire),
config.Share.Secret, config.Share.Secret,
config.RpcConfig.TokenPolicy.Expire, config.RpcConfig.TokenPolicy.Expire,
config.MsgGatewayConfig.MultiLoginPolicy,
), ),
config: config, config: config,
}) })

View File

@ -36,6 +36,7 @@ func NewAuthRpcCmd() *AuthRpcCmd {
ret := &AuthRpcCmd{authConfig: &authConfig} ret := &AuthRpcCmd{authConfig: &authConfig}
ret.configMap = map[string]any{ ret.configMap = map[string]any{
OpenIMRPCAuthCfgFileName: &authConfig.RpcConfig, OpenIMRPCAuthCfgFileName: &authConfig.RpcConfig,
OpenIMMsgGatewayCfgFileName: &authConfig.MsgGatewayConfig,
RedisConfigFileName: &authConfig.RedisConfig, RedisConfigFileName: &authConfig.RedisConfig,
ShareFileName: &authConfig.Share, ShareFileName: &authConfig.Share,
DiscoveryConfigFilename: &authConfig.Discovery, DiscoveryConfigFilename: &authConfig.Discovery,

View File

@ -38,10 +38,11 @@ type authDatabase struct {
cache cache.TokenModel cache cache.TokenModel
accessSecret string accessSecret string
accessExpire int64 accessExpire int64
multiLoginPolicy int
} }
func NewAuthDatabase(cache cache.TokenModel, accessSecret string, accessExpire int64) AuthDatabase { func NewAuthDatabase(cache cache.TokenModel, accessSecret string, accessExpire int64, policy int) AuthDatabase {
return &authDatabase{cache: cache, accessSecret: accessSecret, accessExpire: accessExpire} return &authDatabase{cache: cache, accessSecret: accessSecret, accessExpire: accessExpire, multiLoginPolicy: policy}
} }
// If the result is empty. // If the result is empty.
@ -55,6 +56,7 @@ func (a *authDatabase) SetTokenMapByUidPid(ctx context.Context, userID string, p
// Create Token. // Create Token.
func (a *authDatabase) CreateToken(ctx context.Context, userID string, platformID int) (string, error) { func (a *authDatabase) CreateToken(ctx context.Context, userID string, platformID int) (string, error) {
// todo: get all platform token
tokens, err := a.cache.GetTokensWithoutError(ctx, userID, platformID) tokens, err := a.cache.GetTokensWithoutError(ctx, userID, platformID)
if err != nil { if err != nil {
return "", err return "", err
@ -65,7 +67,7 @@ func (a *authDatabase) CreateToken(ctx context.Context, userID string, platformI
t, err := tokenverify.GetClaimFromToken(k, authverify.Secret(a.accessSecret)) t, err := tokenverify.GetClaimFromToken(k, authverify.Secret(a.accessSecret))
if err != nil || v != constant.NormalToken { if err != nil || v != constant.NormalToken {
deleteTokenKey = append(deleteTokenKey, k) deleteTokenKey = append(deleteTokenKey, k)
} else if t.UserID == userID && t.PlatformID == platformID { } else if a.checkKickToken(ctx, platformID, t) {
kickedTokenKey = append(kickedTokenKey, k) kickedTokenKey = append(kickedTokenKey, k)
} }
} }
@ -96,3 +98,23 @@ func (a *authDatabase) CreateToken(ctx context.Context, userID string, platformI
} }
return tokenString, nil return tokenString, nil
} }
func (a *authDatabase) checkKickToken(ctx context.Context, platformID int, token *tokenverify.Claims) bool {
switch a.multiLoginPolicy {
case constant.DefalutNotKick:
return false
case constant.PCAndOther:
if constant.PlatformIDToClass(platformID) == constant.TerminalPC ||
constant.PlatformIDToClass(token.PlatformID) == constant.TerminalPC {
return false
}
return true
case constant.AllLoginButSameTermKick:
if platformID == token.PlatformID {
return true
}
return false
default:
return false
}
}