diff --git a/server/internal/devices/service.go b/server/internal/devices/service.go index 0927a86..eb01bf7 100644 --- a/server/internal/devices/service.go +++ b/server/internal/devices/service.go @@ -382,8 +382,14 @@ func (svc *Service) SessionActive(ctx context.Context, userID int64, deviceUUID if err != nil { return false, apierr.ErrInternal } - if dev == nil || dev.UserID != userID { - return true, nil // 未知 / 非本人设备:不据此登出 + if dev == nil { + // 设备行已不存在 = 本设备被「移除」(DeleteDevice 删行)。已登录的客户端在登录时 + // 必然注册过自己的设备,轮询自身 device_id 却查无此行,只能是被移除 → 视为会话失效, + // 让其登出(否则被移除的设备永远收到 active=true,不退出,只表现为数据面被断→「节点异常」)。 + return false, nil + } + if dev.UserID != userID { + return true, nil // 非本人设备 uuid:不据此登出(fail-safe) } active, err := svc.sessions.HasActiveSession(ctx, userID, dev.ID) if err != nil {