В экосистеме Mapbox доступ к картографическим сервисам строится вокруг механизма токенов. В библиотеке Mapbox GL JS токены являются обязательным элементом и используются для авторизации всех запросов к стилям, тайлам, геокодированию и другим API.
Токен в Mapbox — это строка доступа, которая связывает клиентское приложение с конкретным аккаунтом, проектом и набором разрешений. Без корректного токена библиотека не сможет загрузить карту, стили или данные.
Публичный токен используется в клиентском коде браузера и является основным способом подключения Mapbox GL JS к сервисам.
Ключевые характеристики:
Пример:
mapboxgl.accessToken = 'pk.eyJ1IjoidXNlciIsImEiOiJ0b2tlbiJ9.example';
Префикс pk. указывает на публичный характер токена.
Секретный токен применяется на серверной стороне и не должен попадать в браузерный код.
Основные свойства:
sk..Пример серверного использования:
import fetch from 'node-fetch';
const token = process.env.MAPBOX_SECRET_TOKEN;
const response = await fetch(
`https://api.mapbox.com/tokens/v2?access_token=${token}`
);
const data = await response.json();
В Mapbox GL JS токен задаётся глобально через объект
mapboxgl.
import mapboxgl from 'mapbox-gl';
mapboxgl.accessToken = 'pk.example.token.value';
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [69.2401, 41.2995],
zoom: 10
});
Без установки mapboxgl.accessToken библиотека не
выполнит загрузку стиля и тайлов.
Каждый запрос Mapbox GL JS к API автоматически включает токен в query string:
https://api.mapbox.com/styles/v1/mapbox/streets-v12?access_token=...
Аналогично для:
Scopes определяют, какие операции разрешены токену.
Распространённые scope:
styles:read — доступ к стилямtiles:read — доступ к тайламfonts:read — загрузка шрифтовdatasets:read/write — работа с датасетамиuploads:write — загрузка данныхПример логики ограничения:
styles:read не сможет загружать кастомные
датасеты;tiles:read не отрисует карту.Токены часто привязываются к списку разрешённых доменов.
Пример конфигурации:
localhostexample.comapp.domain.comПри несоответствии домена запрос блокируется на стороне Mapbox API.
Это критически важный механизм защиты публичных токенов.
Практика хранения токена в .env:
MAPBOX_ACCESS_TOKEN=pk.example.token
Использование в коде:
mapboxgl.accessToken = process.env.MAPBOX_ACCESS_TOKEN;
export const config = {
mapboxToken: 'pk.example.token'
};
Основная модель безопасности Mapbox основана на разделении токенов:
Типовые угрозы:
sk. токена в репозитории;Ротация применяется при:
Процесс:
В некоторых приложениях токен может меняться без пересборки.
Пример:
function initializeMap(token) {
mapboxgl.accessToken = token;
return new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/light-v11'
});
}
Такой подход используется в multi-tenant системах.
Стиль Mapbox также требует токен для загрузки ресурсов.
style: 'mapbox://styles/mapbox/outdoors-v12'
Внутри стиля присутствуют ссылки на:
Все они требуют валидного токена при запросе.
Причины:
Симптом:
Причины:
В server-side rendering токен может использоваться для:
Пример SSR запроса:
const url = `https://api.mapbox.com/geocoding/v5/mapbox.places/Almaty.json?access_token=${process.env.MAPBOX_SECRET_TOKEN}`;
Практика использования разных токенов:
Пример конфигурации:
const tokens = {
dev: 'pk.dev.token',
prod: 'pk.prod.token'
};
mapboxgl.accessToken = tokens[process.env.NODE_ENV];
В крупных приложениях возможно использование:
Токен должен содержать только необходимые права:
Это снижает риск несанкционированного доступа и упрощает аудит безопасности.
Mapbox активно кэширует ресурсы, однако:
new webpack.DefinePlugin({
'process.env.MAPBOX_TOKEN': JSON.stringify(process.env.MAPBOX_TOKEN)
});
export default defineConfig({
define: {
__MAPBOX_TOKEN__: JSON.stringify(process.env.MAPBOX_TOKEN)
}
});
При отладке полезно отслеживать:
Архитектура токенов развивалась от простого API key к системе:
Это позволило использовать Mapbox GL JS в корпоративных системах с высокими требованиями к безопасности.