Приватные тайлсеты

Приватный тайлсет (Private Tileset) — это набор картографических тайлов, доступ к которому ограничен определёнными пользователями, приложениями или токенами доступа. В экосистеме Mapbox приватные тайлсеты используются для публикации внутренних геоданных, корпоративной картографии, коммерческой информации и любых пространственных данных, которые не должны быть доступны публично.

Тайлсеты могут содержать:

  • векторные данные;
  • растровые данные;
  • спутниковые снимки;
  • результаты пространственного анализа;
  • корпоративные слои объектов;
  • специализированные тематические карты.

Основное отличие приватного тайлсета от публичного заключается в необходимости авторизации при получении тайлов.


Архитектура доступа к приватным тайлсетам

В процессе отображения карты участвуют несколько компонентов:

  1. Клиентское приложение на JavaScript.
  2. Библиотека Mapbox GL JS.
  3. API Mapbox.
  4. Сервер хранения тайлсетов.
  5. Access Token.

Схема работы выглядит следующим образом:

Mapbox GL JS
      ↓
Запрос тайла
      ↓
Mapbox API
      ↓
Проверка токена
      ↓
Проверка прав доступа
      ↓
Выдача тайла

Если токен обладает необходимыми правами, тайлы загружаются и отображаются на карте. В противном случае сервер возвращает ошибку авторизации.


Создание приватного тайлсета

После загрузки данных через Mapbox Studio или Tilesets API создаётся новый тайлсет.

Пример идентификатора:

company.private_buildings

Где:

  • company — имя владельца;
  • private_buildings — имя тайлсета.

По умолчанию многие тайлсеты создаются как приватные и требуют авторизации для использования.


Роль Access Token

Mapbox использует токены доступа для контроля безопасности.

Каждый запрос к тайлсету содержит токен:

mapboxgl.accessToken = 'pk.xxxxxxxxxxxxxxxxx';

Токен позволяет:

  • идентифицировать приложение;
  • проверять разрешения;
  • ограничивать доступ к данным;
  • вести статистику использования.

Без корректного токена приватный тайлсет недоступен.


Публичные и приватные токены

Mapbox предоставляет два основных типа токенов.

Public Token

Используется в браузере.

Пример:

pk.eyJ1IjoibXlhY2NvdW50IiwiYSI6ImFiY2RlZiJ9

Возможности:

  • чтение тайлов;
  • загрузка стилей;
  • работа с геокодированием (при наличии прав).

Обычно используется в клиентских приложениях.


Secret Token

Используется на серверной стороне.

Пример:

sk.eyJ1IjoibXlhY2NvdW50IiwiYSI6ImFiY2RlZiJ9

Особенности:

  • расширенные права;
  • управление ресурсами;
  • публикация данных;
  • создание тайлсетов.

Никогда не должен передаваться в браузер.

Неправильно:

mapboxgl.accessToken = 'sk.xxxxxxxxx';

Правильно:

mapboxgl.accessToken = 'pk.xxxxxxxxx';

Добавление приватного тайлсета в карту

После публикации тайлсета необходимо подключить его как источник данных.

Пример:

map.on('load', () => {
    map.addSource('buildings', {
        type: 'vector',
        url: 'mapbox://company.private_buildings'
    });
});

Mapbox GL JS автоматически использует текущий токен доступа для получения тайлов.


Использование слоя из приватного тайлсета

После подключения источника создаётся слой визуализации.

map.addLayer({
    id: 'building-layer',
    type: 'fill',
    source: 'buildings',
    'source-layer': 'buildings',
    paint: {
        'fill-color': '#4A90E2',
        'fill-opacity': 0.7
    }
});

Здесь:

  • source указывает на источник;
  • source-layer определяет слой внутри векторного тайлсета;
  • блок paint отвечает за оформление.

Проверка структуры тайлсета

Для работы с приватным тайлсетом важно знать внутренние названия слоёв.

Получить их можно через:

  • Tilesets API;
  • TileJSON;
  • Mapbox Studio;
  • инспектор источников.

Например:

console.log(map.getStyle());

Либо через сетевые запросы:

https://api.mapbox.com/v4/{tileset}.json

Ответ содержит сведения о слоях и метаданных.


Ограничение доступа по URL

Mapbox позволяет ограничивать использование токена конкретными доменами.

Пример списка разрешённых адресов:

https://company.com
https://maps.company.com
https://internal.company.com

Если злоумышленник скопирует токен и попытается использовать его на другом сайте, запросы будут отклонены.


Ограничение по API

Токен может быть ограничен определёнными сервисами.

Например:

Styles API
Tilesets API
Static Images API
Geocoding API

Для карты, работающей только с приватными тайлсетами, разумно оставить минимально необходимый набор разрешений.


Работа с несколькими приватными тайлсетами

Карта может использовать сразу несколько источников.

map.on('load', () => {
    map.addSource('roads', {
        type: 'vector',
        url: 'mapbox://company.private_roads'
    });

    map.addSource('buildings', {
        type: 'vector',
        url: 'mapbox://company.private_buildings'
    });

    map.addSource('zones', {
        type: 'vector',
        url: 'mapbox://company.private_zones'
    });
});

Такой подход часто используется в корпоративных ГИС-системах.


Приватные растровые тайлсеты

Приватными могут быть не только векторные данные.

Подключение растрового тайлсета:

map.addSource('imagery', {
    type: 'raster',
    url: 'mapbox://company.private_imagery',
    tileSize: 256
});

Создание слоя:

map.addLayer({
    id: 'imagery-layer',
    type: 'raster',
    source: 'imagery'
});

Подобным образом подключаются:

  • аэрофотоснимки;
  • спутниковые изображения;
  • тепловые карты;
  • результаты дистанционного зондирования.

Использование собственных стилей

Приватный стиль может ссылаться на приватные тайлсеты.

Пример:

const map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/company/custom-style'
});

Во время загрузки стиля Mapbox последовательно проверяет права доступа:

  1. к стилю;
  2. к источникам;
  3. к тайлсетам;
  4. к спрайтам;
  5. к шрифтам.

Ошибка хотя бы на одном этапе приведёт к проблемам отображения.


Типичные ошибки доступа

401 Unauthorized

401 Unauthorized

Причины:

  • отсутствует токен;
  • неверный токен;
  • истёкший токен.

403 Forbidden

403 Forbidden

Причины:

  • недостаточно прав;
  • отсутствует доступ к тайлсету;
  • ограничение по домену.

Tileset Not Found

Tileset not found

Причины:

  • ошибка в идентификаторе;
  • тайлсет удалён;
  • тайлсет не опубликован.

Отладка сетевых запросов

Наиболее удобный инструмент — вкладка Network в DevTools браузера.

Следует проверять:

tile requests
style requests
sprite requests
glyph requests

Полезно фильтровать запросы по слову:

tiles

или:

vector

Ответы сервера позволяют быстро определить источник ошибки.


Работа через собственный сервер

В корпоративных системах часто применяется промежуточный сервер.

Схема:

Browser
   ↓
Backend
   ↓
Mapbox API

Преимущества:

  • скрытие служебной логики;
  • дополнительная аутентификация;
  • аудит запросов;
  • кэширование данных.

Такой подход особенно распространён при работе с коммерческими пространственными данными.


Использование временных токенов

Для повышения безопасности сервер может генерировать временные токены.

Алгоритм работы:

Пользователь входит в систему
        ↓
Backend проверяет права
        ↓
Создаётся временный токен
        ↓
Токен передаётся клиенту
        ↓
Mapbox GL JS получает тайлы

Преимущества:

  • уменьшение риска утечки;
  • ограниченное время жизни;
  • возможность быстрого отзыва доступа.

Кэширование приватных тайлов

Mapbox GL JS автоматически кэширует загруженные тайлы.

Это позволяет:

  • уменьшать количество запросов;
  • ускорять навигацию по карте;
  • снижать нагрузку на сеть.

При изменении данных рекомендуется публиковать новую версию тайлсета или обновлять стиль, чтобы избежать отображения устаревших данных.


Контроль использования приватных данных

Mapbox предоставляет статистику использования ресурсов.

Контролируются:

  • количество запросов;
  • число загруженных тайлов;
  • использование токенов;
  • ошибки авторизации;
  • потребление API.

Мониторинг позволяет своевременно выявлять:

  • подозрительную активность;
  • неправильную конфигурацию приложений;
  • утечки токенов.

Практический пример подключения приватного тайлсета

mapboxgl.accessToken = 'pk.xxxxxxxxxxxxx';

const map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/light-v11',
    center: [69.24, 41.31],
    zoom: 12
});

map.on('load', () => {

    map.addSource('private-parcels', {
        type: 'vector',
        url: 'mapbox://company.private_parcels'
    });

    map.addLayer({
        id: 'parcel-fill',
        type: 'fill',
        source: 'private-parcels',
        'source-layer': 'parcels',
        paint: {
            'fill-color': '#2E8B57',
            'fill-opacity': 0.5
        }
    });

    map.addLayer({
        id: 'parcel-outline',
        type: 'line',
        source: 'private-parcels',
        'source-layer': 'parcels',
        paint: {
            'line-color': '#1B5E20',
            'line-width': 2
        }
    });
});

В данном примере карта получает доступ к приватному векторному тайлсету, содержащему земельные участки, после чего поверх базовой карты отображаются полигоны и их границы. Основную роль в процессе играет токен доступа, через который Mapbox проверяет разрешения на чтение приватного ресурса.