# 概括: 客户端交互的接口都在API服务中以http接口方式实现,而消息收发都在msggateway中以websocket协议实现。以下API定义在OpenIMAPI服务中,OpenIMAPI本身只起到接口转接的作用,具体的逻辑定义在下面的RPC服务,user&auth中。 # 接口 * 用户接口 ```golang u := NewUserApi(user.NewUserClient(userConn), client, cfg.Discovery.RpcService) { userRouterGroup := r.Group("/user") userRouterGroup.POST("/user_register", u.UserRegister) userRouterGroup.POST("/update_user_info", u.UpdateUserInfo) userRouterGroup.POST("/update_user_info_ex", u.UpdateUserInfoEx) userRouterGroup.POST("/set_global_msg_recv_opt", u.SetGlobalRecvMessageOpt) userRouterGroup.POST("/get_users_info", u.GetUsersPublicInfo) userRouterGroup.POST("/get_all_users_uid", u.GetAllUsersID) userRouterGroup.POST("/account_check", u.AccountCheck) userRouterGroup.POST("/get_users", u.GetUsers) userRouterGroup.POST("/get_users_online_status", u.GetUsersOnlineStatus) userRouterGroup.POST("/get_users_online_token_detail", u.GetUsersOnlineTokenDetail) userRouterGroup.POST("/subscribe_users_status", u.SubscriberStatus) userRouterGroup.POST("/get_users_status", u.GetUserStatus) userRouterGroup.POST("/get_subscribe_users_status", u.GetSubscribeUsersStatus) userRouterGroup.POST("/process_user_command_add", u.ProcessUserCommandAdd) userRouterGroup.POST("/process_user_command_delete", u.ProcessUserCommandDelete) userRouterGroup.POST("/process_user_command_update", u.ProcessUserCommandUpdate) userRouterGroup.POST("/process_user_command_get", u.ProcessUserCommandGet) userRouterGroup.POST("/process_user_command_get_all", u.ProcessUserCommandGetAll) userRouterGroup.POST("/add_notification_account", u.AddNotificationAccount) userRouterGroup.POST("/update_notification_account", u.UpdateNotificationAccountInfo) userRouterGroup.POST("/search_notification_account", u.SearchNotificationAccount) } ``` * 认证相关 ```golang { a := NewAuthApi(pbAuth.NewAuthClient(authConn)) authRouterGroup := r.Group("/auth") authRouterGroup.POST("/get_admin_token", a.GetAdminToken) authRouterGroup.POST("/get_user_token", a.GetUserToken) authRouterGroup.POST("/parse_token", a.ParseToken) authRouterGroup.POST("/force_logout", a.ForceLogout) } ``` # 认证逻辑 ![|600](https://picbed-1253586264.cos.ap-guangzhou.myqcloud.com/uPic/2025062409-cKhzvC.jpg) ## Token说明 TokenKey格式:`前缀:用户ID:登录平台` = `UID_PID_TOKEN_STATUS:4834513665:Web` TokenValue说明:{Token:TokenFlag} TokenFlag取值如下,也就是说,TokenValue将以JsonMap的形式保存,最里可以看到最多4种情况 * NormalToken = 0 * InValidToken = 1 * KickedToken = 2 * ExpiredToken = 3 ## AuthDatabase Auth作为一个底层RPC服务,在启动是,会实例化AuthDatabase,Auth服务实现的4四认证相关接口,便是依赖authDatabase实现认证数据的管理。 authDatabase实现的四个方法如下,即操作上面Token的方法: ``` GetTokensWithoutError(ctx context.Context, userID string, platformID int) (map[string]int, error) CreateToken(ctx context.Context, userID string, platformID int) (string, error) BatchSetTokenMapByUidPid(ctx context.Context, tokens []string) error SetTokenMapByUidPid(ctx context.Context, userID string, platformID int, m map[string]int) error ``` # 三方系统整合逻辑 即替换AuthDatabase的Token逻辑,比如改为依赖三方系统提供的Token获取与校验接口。当前出租屋的逻辑倒是权益之计,需要前端系统主动设置token.可以解决问题,但逻辑有漏洞。