Files
open-im-server/internal/rpc/auth/auth.go
T

115 lines
3.8 KiB
Go
Raw Normal View History

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-06-14 10:47:18 +08:00
token, err := s.authDatabase.CreateToken(ctx, req.UserID, 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-06-14 10:47:18 +08:00
m, err := s.authDatabase.GetTokensWithoutError(ctx, claims.UserID, claims.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-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-06-14 10:47:18 +08:00
resp.UserID = claims.UserID
resp.Platform = constant.PlatformIDToName(claims.PlatformID)
2023-01-31 20:33:33 +08:00
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
}