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

147 lines
4.6 KiB
Go
Raw Normal View History

2021-12-27 16:48:05 +08:00
package auth
import (
2023-01-31 20:33:33 +08:00
"Open_IM/internal/common/check"
2023-02-10 21:04:22 +08:00
"Open_IM/internal/common/rpcserver"
2023-02-09 13:36:37 +08:00
"Open_IM/pkg/common/config"
2021-12-27 16:48:05 +08:00
"Open_IM/pkg/common/constant"
2023-02-09 17:55:59 +08:00
"Open_IM/pkg/common/db/cache"
2023-01-31 20:33:33 +08:00
"Open_IM/pkg/common/db/controller"
2021-12-27 16:48:05 +08:00
"Open_IM/pkg/common/log"
2022-09-14 17:45:38 +08:00
promePkg "Open_IM/pkg/common/prometheus"
2023-02-09 14:40:49 +08:00
"Open_IM/pkg/common/tokenverify"
2023-01-31 20:33:33 +08:00
"Open_IM/pkg/common/tracelog"
2021-12-27 16:48:05 +08:00
pbAuth "Open_IM/pkg/proto/auth"
2022-06-06 23:19:07 +08:00
pbRelay "Open_IM/pkg/proto/relay"
2021-12-27 16:48:05 +08:00
"Open_IM/pkg/utils"
"context"
2022-09-15 16:27:36 +08:00
grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
2021-12-27 16:48:05 +08:00
"google.golang.org/grpc"
)
2023-02-09 13:36:37 +08:00
func NewRpcAuthServer(port int) *rpcAuth {
2023-02-10 11:03:03 +08:00
r, err := rpcserver.NewRpcServer(config.Config.RpcRegisterIP, port, config.Config.RpcRegisterName.OpenImAuthName, config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema)
2023-02-09 13:36:37 +08:00
if err != nil {
panic(err)
}
2023-02-09 17:55:59 +08:00
var redis cache.RedisClient
redis.InitRedis()
2023-02-09 13:36:37 +08:00
return &rpcAuth{
2023-02-09 17:55:59 +08:00
RpcServer: r,
AuthInterface: controller.NewAuthController(redis.GetClient(), config.Config.TokenPolicy.AccessSecret, config.Config.TokenPolicy.AccessExpire),
2023-02-09 13:36:37 +08:00
}
}
func (s *rpcAuth) Run() {
operationID := utils.OperationIDGenerator()
log.NewInfo(operationID, "rpc auth start...")
2023-02-10 11:03:03 +08:00
listener, address, err := rpcserver.GetTcpListen(config.Config.ListenIP, s.Port)
2023-02-09 13:36:37 +08:00
if err != nil {
panic(err)
}
log.NewInfo(operationID, "listen network success ", listener, address)
var grpcOpts []grpc.ServerOption
if config.Config.Prometheus.Enable {
promePkg.NewGrpcRequestCounter()
promePkg.NewGrpcRequestFailedCounter()
promePkg.NewGrpcRequestSuccessCounter()
promePkg.NewUserRegisterCounter()
promePkg.NewUserLoginCounter()
grpcOpts = append(grpcOpts, []grpc.ServerOption{
// grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme),
grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor),
grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor),
}...)
}
srv := grpc.NewServer(grpcOpts...)
defer srv.GracefulStop()
pbAuth.RegisterAuthServer(srv, s)
err = srv.Serve(listener)
if err != nil {
panic(err)
}
log.NewInfo(operationID, "rpc auth ok")
}
2023-01-31 20:33:33 +08:00
func (s *rpcAuth) UserToken(ctx context.Context, req *pbAuth.UserTokenReq) (*pbAuth.UserTokenResp, error) {
resp := pbAuth.UserTokenResp{}
if _, err := check.GetUsersInfo(ctx, req.UserID); err != nil {
return nil, err
2021-12-28 20:28:01 +08:00
}
2023-02-09 17:55:59 +08:00
token, err := s.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-09 17:55:59 +08:00
func (s *rpcAuth) 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-02-09 17:55:59 +08:00
m, err := s.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 {
return nil, constant.ErrTokenNotExist.Wrap()
}
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-02-09 17:55:59 +08:00
return nil, constant.ErrTokenKicked.Wrap()
2023-01-31 20:33:33 +08:00
default:
return nil, utils.Wrap(constant.ErrTokenUnknown, "")
}
}
2023-02-09 17:55:59 +08:00
return nil, constant.ErrTokenNotExist.Wrap()
2021-12-27 16:48:05 +08:00
}
2023-02-09 17:55:59 +08:00
func (s *rpcAuth) ParseToken(ctx context.Context, req *pbAuth.ParseTokenReq) (resp *pbAuth.ParseTokenResp, err error) {
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-01-31 20:33:33 +08:00
func (s *rpcAuth) ForceLogout(ctx context.Context, req *pbAuth.ForceLogoutReq) (*pbAuth.ForceLogoutResp, error) {
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
}
if err := s.forceKickOff(ctx, req.UserID, req.PlatformID, tracelog.GetOperationID(ctx)); err != nil {
return nil, err
}
return &resp, nil
2022-06-06 23:19:07 +08:00
}
2023-01-31 20:33:33 +08:00
func (s *rpcAuth) forceKickOff(ctx context.Context, userID string, platformID int32, operationID string) error {
2023-02-09 13:36:37 +08:00
grpcCons, err := s.RegisterCenter.GetConns(config.Config.RpcRegisterName.OpenImRelayName)
2023-02-09 10:58:30 +08:00
if err != nil {
return err
}
2022-06-07 11:50:37 +08:00
for _, v := range grpcCons {
2022-07-20 21:07:46 +08:00
client := pbRelay.NewRelayClient(v)
2022-06-07 11:50:37 +08:00
kickReq := &pbRelay.KickUserOfflineReq{OperationID: operationID, KickUserIDList: []string{userID}, PlatformID: platformID}
2022-06-07 16:18:23 +08:00
log.NewInfo(operationID, "KickUserOffline ", client, kickReq.String())
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-01-31 20:33:33 +08:00
return constant.ErrInternalServer.Wrap()
2022-06-06 20:39:45 +08:00
}
2021-12-27 16:48:05 +08:00
type rpcAuth struct {
2023-02-10 11:03:03 +08:00
*rpcserver.RpcServer
2023-01-31 20:33:33 +08:00
controller.AuthInterface
2021-12-27 16:48:05 +08:00
}