Files
obsidian_vault/技术研究/OpenIM/OpenIM源码分析之二---用户与认证机制.md
2025-12-27 11:44:50 +08:00

3.7 KiB

概括:

客户端交互的接口都在API服务中以http接口方式实现,而消息收发都在msggateway中以websocket协议实现。以下API定义在OpenIMAPI服务中,OpenIMAPI本身只起到接口转接的作用,具体的逻辑定义在下面的RPC服务,user&auth中。

接口

  • 用户接口
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)  
}
  • 认证相关
{  
    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

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.可以解决问题,但逻辑有漏洞。