2021-12-27 16:48:05 +08:00
|
|
|
package auth
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
2023-04-23 19:50:42 +08:00
|
|
|
|
2023-03-16 10:46:06 +08:00
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
|
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
|
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
|
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
2023-03-21 12:28:21 +08:00
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
2023-03-16 10:46:06 +08:00
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
|
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
|
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
|
|
|
|
pbAuth "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/auth"
|
|
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msggateway"
|
2023-04-23 19:50:42 +08:00
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
2023-03-16 10:46:06 +08:00
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
2021-12-27 16:48:05 +08:00
|
|
|
"google.golang.org/grpc"
|
|
|
|
|
)
|
|
|
|
|
|
2023-03-01 15:32:26 +08:00
|
|
|
type authServer struct {
|
2023-03-03 17:42:26 +08:00
|
|
|
authDatabase controller.AuthDatabase
|
2023-04-23 19:50:42 +08:00
|
|
|
userRpcClient *rpcclient.UserClient
|
2023-03-08 19:25:27 +08:00
|
|
|
RegisterCenter discoveryregistry.SvcDiscoveryRegistry
|
2023-03-01 15:32:26 +08:00
|
|
|
}
|
|
|
|
|
|
2023-03-08 19:25:27 +08:00
|
|
|
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
|
2023-03-01 15:32:26 +08:00
|
|
|
rdb, err := cache.NewRedis()
|
2023-02-09 13:36:37 +08:00
|
|
|
if err != nil {
|
2023-02-14 19:34:19 +08:00
|
|
|
return err
|
2023-02-09 13:36:37 +08:00
|
|
|
}
|
2023-02-14 19:34:19 +08:00
|
|
|
pbAuth.RegisterAuthServer(server, &authServer{
|
2023-04-23 19:50:42 +08:00
|
|
|
userRpcClient: rpcclient.NewUserClient(client),
|
2023-02-14 19:34:19 +08:00
|
|
|
RegisterCenter: client,
|
2023-05-04 12:11:29 +08:00
|
|
|
authDatabase: controller.NewAuthDatabase(cache.NewMsgCacheModel(rdb), config.Config.TokenPolicy.AccessSecret, config.Config.TokenPolicy.AccessExpire),
|
2023-02-14 19:34:19 +08:00
|
|
|
})
|
|
|
|
|
return nil
|
2023-02-09 13:36:37 +08:00
|
|
|
}
|
|
|
|
|
|
2023-02-14 19:34:19 +08:00
|
|
|
func (s *authServer) UserToken(ctx context.Context, req *pbAuth.UserTokenReq) (*pbAuth.UserTokenResp, error) {
|
2023-01-31 20:33:33 +08:00
|
|
|
resp := pbAuth.UserTokenResp{}
|
2023-04-23 19:50:42 +08:00
|
|
|
if _, err := s.userRpcClient.GetUserInfo(ctx, req.UserID); err != nil {
|
2023-01-31 20:33:33 +08:00
|
|
|
return nil, err
|
2021-12-28 20:28:01 +08:00
|
|
|
}
|
2023-03-03 17:42:26 +08:00
|
|
|
token, err := s.authDatabase.CreateToken(ctx, req.UserID, constant.PlatformIDToName(int(req.PlatformID)))
|
2021-12-27 16:48:05 +08:00
|
|
|
if err != nil {
|
2023-01-31 20:33:33 +08:00
|
|
|
return nil, err
|
2021-12-27 16:48:05 +08:00
|
|
|
}
|
2023-01-31 20:33:33 +08:00
|
|
|
resp.Token = token
|
2023-01-31 20:41:45 +08:00
|
|
|
resp.ExpireTimeSeconds = config.Config.TokenPolicy.AccessExpire
|
2023-01-31 20:33:33 +08:00
|
|
|
return &resp, nil
|
2021-12-27 16:48:05 +08:00
|
|
|
}
|
|
|
|
|
|
2023-02-14 19:34:19 +08:00
|
|
|
func (s *authServer) parseToken(ctx context.Context, tokensString string) (claims *tokenverify.Claims, err error) {
|
2023-02-09 14:40:49 +08:00
|
|
|
claims, err = tokenverify.GetClaimFromToken(tokensString)
|
2022-11-26 12:09:36 +08:00
|
|
|
if err != nil {
|
2023-01-31 20:33:33 +08:00
|
|
|
return nil, utils.Wrap(err, "")
|
2022-11-26 12:09:36 +08:00
|
|
|
}
|
2023-03-03 17:42:26 +08:00
|
|
|
m, err := s.authDatabase.GetTokensWithoutError(ctx, claims.UID, claims.Platform)
|
2021-12-27 16:48:05 +08:00
|
|
|
if err != nil {
|
2023-01-31 20:33:33 +08:00
|
|
|
return nil, err
|
2021-12-27 16:48:05 +08:00
|
|
|
}
|
2023-02-09 17:55:59 +08:00
|
|
|
if len(m) == 0 {
|
2023-03-07 12:19:30 +08:00
|
|
|
return nil, errs.ErrTokenNotExist.Wrap()
|
2023-02-09 17:55:59 +08:00
|
|
|
}
|
2023-01-31 20:33:33 +08:00
|
|
|
if v, ok := m[tokensString]; ok {
|
|
|
|
|
switch v {
|
|
|
|
|
case constant.NormalToken:
|
|
|
|
|
return claims, nil
|
|
|
|
|
case constant.KickedToken:
|
2023-03-07 12:19:30 +08:00
|
|
|
return nil, errs.ErrTokenKicked.Wrap()
|
2023-01-31 20:33:33 +08:00
|
|
|
default:
|
2023-03-07 12:19:30 +08:00
|
|
|
return nil, utils.Wrap(errs.ErrTokenUnknown, "")
|
2023-01-31 20:33:33 +08:00
|
|
|
}
|
|
|
|
|
}
|
2023-03-07 12:19:30 +08:00
|
|
|
return nil, errs.ErrTokenNotExist.Wrap()
|
2021-12-27 16:48:05 +08:00
|
|
|
}
|
|
|
|
|
|
2023-02-14 19:34:19 +08:00
|
|
|
func (s *authServer) ParseToken(ctx context.Context, req *pbAuth.ParseTokenReq) (resp *pbAuth.ParseTokenResp, err error) {
|
2023-02-09 17:55:59 +08:00
|
|
|
resp = &pbAuth.ParseTokenResp{}
|
|
|
|
|
claims, err := s.parseToken(ctx, req.Token)
|
2022-09-21 20:20:26 +08:00
|
|
|
if err != nil {
|
2023-01-31 20:33:33 +08:00
|
|
|
return nil, err
|
2022-09-21 20:20:26 +08:00
|
|
|
}
|
2023-01-31 20:33:33 +08:00
|
|
|
resp.UserID = claims.UID
|
|
|
|
|
resp.Platform = claims.Platform
|
|
|
|
|
resp.ExpireTimeSeconds = claims.ExpiresAt.Unix()
|
2023-02-09 17:55:59 +08:00
|
|
|
return resp, nil
|
2022-09-21 20:20:26 +08:00
|
|
|
}
|
|
|
|
|
|
2023-02-14 19:34:19 +08:00
|
|
|
func (s *authServer) ForceLogout(ctx context.Context, req *pbAuth.ForceLogoutReq) (*pbAuth.ForceLogoutResp, error) {
|
2023-01-31 20:33:33 +08:00
|
|
|
resp := pbAuth.ForceLogoutResp{}
|
2023-02-09 14:40:49 +08:00
|
|
|
if err := tokenverify.CheckAdmin(ctx); err != nil {
|
2023-01-31 20:33:33 +08:00
|
|
|
return nil, err
|
|
|
|
|
}
|
2023-03-21 12:28:21 +08:00
|
|
|
if err := s.forceKickOff(ctx, req.UserID, req.PlatformID, mcontext.GetOperationID(ctx)); err != nil {
|
2023-01-31 20:33:33 +08:00
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return &resp, nil
|
2022-06-06 23:19:07 +08:00
|
|
|
}
|
|
|
|
|
|
2023-02-14 19:34:19 +08:00
|
|
|
func (s *authServer) forceKickOff(ctx context.Context, userID string, platformID int32, operationID string) error {
|
2023-05-08 12:52:12 +08:00
|
|
|
conns, err := s.RegisterCenter.GetConns(ctx, config.Config.RpcRegisterName.OpenImMessageGatewayName)
|
2023-02-09 10:58:30 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2023-03-03 17:42:26 +08:00
|
|
|
for _, v := range conns {
|
2023-03-01 15:32:26 +08:00
|
|
|
client := msggateway.NewMsgGatewayClient(v)
|
2023-03-03 17:42:26 +08:00
|
|
|
kickReq := &msggateway.KickUserOfflineReq{KickUserIDList: []string{userID}, PlatformID: platformID}
|
2023-01-31 20:33:33 +08:00
|
|
|
_, err := client.KickUserOffline(ctx, kickReq)
|
2022-06-07 11:50:37 +08:00
|
|
|
return utils.Wrap(err, "")
|
|
|
|
|
}
|
2023-03-07 12:19:30 +08:00
|
|
|
return errs.ErrInternalServer.Wrap()
|
2022-06-06 20:39:45 +08:00
|
|
|
}
|