Mapbox GL JS использует модель доступа, основанную на токенах, где ключевым механизмом контроля выступает access token, определяющий уровень разрешений к API, стилям, тайлам и дополнительным сервисам платформы Mapbox. Архитектура доступа построена вокруг обязательной аутентификации каждого запроса к векторным тайлам, растровым тайлам и стилям карты.
Public token
Secret token
Scoped token
Основной механизм инициализации доступа:
mapboxgl.accessToken = 'pk.XXXXXXXXXXXXXXXXXXXXXXXX';
или динамическая установка:
import mapboxgl from 'mapbox-gl';
mapboxgl.accessToken = process.env.MAPBOX_TOKEN;
Ключ accessToken применяется ко всем запросам, которые
выполняет рендерер: стили, источники данных, тайлы, geocoding API (при
использовании дополнительных модулей).
Каждый сетевой запрос к API Mapbox автоматически получает токен:
/styles/v1/.../tilesets/v1/.../v4/{tileset}/v5/{endpoint}Токен передаётся как query parameter:
?access_token=pk.xxx
Это означает, что контроль доступа реализуется на уровне HTTP-запросов, а не внутри клиента.
При создании токена задаются URL restrictions, которые ограничивают использование:
example.com)*.example.com)Поведение при несоответствии:
401 UnauthorizedТипичные сценарии отказа:
401 Unauthorized
403 Forbidden
Обработка на уровне Mapbox GL JS:
map.on('error', (e) => {
if (e.error && e.error.status === 401) {
console.error('Access token invalid or unauthorized');
}
});
В runtime токен может быть изменён:
mapboxgl.accessToken = newToken;
Однако уже загруженные источники не пересчитываются автоматически; требуется пересоздание карты:
map.remove();
map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v11'
});
На клиенте token неизбежно доступен, поэтому защита строится не на скрытии, а на ограничении:
Пример через bundler:
accessToken: import.meta.env.VITE_MAPBOX_TOKEN
Дополнительный уровень контроля реализуется через перехват запросов:
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v11',
transformRequest: (url, resourceType) => {
return {
url,
headers: resourceType === 'Source'
? { 'X-Custom-Header': 'value' }
: {}
};
}
});
Применение:
Архитектура проксирования позволяет исключить прямой доступ клиента к API:
Browser → Backend → Mapbox API
Преимущества:
Пример backend proxy:
app.get('/tiles/:z/:x/:y', async (req, res) => {
const url = `https://api.mapbox.com/v4/.../${req.params.z}/${req.params.x}/${req.params.y}.mvt?access_token=${TOKEN}`;
const response = await fetch(url);
response.body.pipe(res);
});
Map styles также защищены токеном:
style: 'mapbox://styles/username/styleid'
Без корректного токена:
Tilesets имеют собственные permissions:
Пример обращения:
mapbox://tileset-id
Проверка доступа происходит на уровне сервера Mapbox до отдачи данных.
Практика разделения токенов:
Это снижает риск утечки полномочий между окружениями.
Управление жизненным циклом токенов включает:
При отзыве токена все активные клиенты теряют доступ к API моментально.
При invalid token:
Mapbox API использует CORS-заголовки:
Access-Control-Allow-OriginAccess-Control-Allow-HeadersВ случае проксирования требуется корректная настройка CORS на стороне backend, иначе WebGL canvas блокирует загрузку ресурсов.
В контексте Mapbox GL JS важно учитывать:
toDataURL)Рекомендуемая модель доступа:
Mapbox token не заменяет OAuth, но может использоваться вместе с ним:
На уровне аккаунта фиксируются:
Это позволяет выявлять: