Mapbox GL JS работает на основе модели токенной аутентификации, где доступ к API и ресурсам платформы Mapbox контролируется через access token. В контексте пользовательской аутентификации важно разделять два уровня: аутентификацию пользователя в приложении и авторизацию доступа к картографическим данным.
В Mapbox GL JS нет встроенной системы пользователей. Библиотека не управляет логинами, сессиями или аккаунтами конечных пользователей. Вместо этого используется модель:
Access token выступает идентификатором проекта, а не конкретного пользователя. Он определяет:
Базовая инициализация карты требует установки токена:
import mapboxgl from "mapbox-gl";
mapboxgl.accessToken = "YOUR_PUBLIC_ACCESS_TOKEN";
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/streets-v12",
center: [37.618423, 55.751244],
zoom: 10
});
Этот токен считается публичным, но ограниченным настройками безопасности в панели Mapbox.
Система Mapbox использует два основных типа токенов:
Используется в браузере вместе с Mapbox GL JS:
Используется только на сервере:
Критическое правило архитектуры: секретный токен никогда не размещается в браузере.
В Mapbox можно настраивать ограничения токенов:
https://example.com/*)Пример логики ограничения:
Хотя Mapbox GL JS не управляет пользователями напрямую, она часто интегрируется с системами:
Типовая схема:
Пользователь входит в приложение
Backend проверяет учетные данные
Backend выдаёт:
Frontend использует оба токена:
Пример клиентской интеграции:
async function initMap() {
const session = await fetch("/api/session").then(r => r.json());
mapboxgl.accessToken = session.mapboxToken;
return new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/light-v11",
center: session.userLocation,
zoom: 12
});
}
На backend часто реализуется прокси-слой:
app.get("/api/mapbox-token", (req, res) => {
const user = req.user;
const token = generateMapboxToken({
scopes: ["styles:read", "tiles:read"],
expiresIn: "1h",
urlRestrictions: [`https://app.example.com/users/${user.id}/*`]
});
res.json({ token });
});
Такая архитектура позволяет:
В Mapbox GL JS можно использовать приватные ресурсы:
Доступ к ним контролируется токеном. Если токен не имеет нужных прав, карта вернёт ошибку загрузки ресурсов.
Пример:
mapboxgl.accessToken = PRIVATE_TOKEN;
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/username/private-style"
});
На клиенте допустимо хранить только публичные токены:
Нежелательные практики:
Для систем с пользовательской аутентификацией важно учитывать:
Пример обновления:
async function refreshToken() {
const res = await fetch("/api/mapbox-token");
const data = await res.json();
mapboxgl.accessToken = data.token;
}
В долгоживущих SPA можно использовать интервал обновления:
setInterval(refreshToken, 50 * 60 * 1000);
Типичная схема работы с аутентификацией в приложении с картами:
Frontend (Mapbox GL JS)
Backend API
Mapbox platform
Такое разделение обеспечивает:
На уровне приложения аутентификация позволяет:
Пример динамического выбора стиля:
function getStyleForUser(user) {
if (user.role === "admin") {
return "mapbox://styles/org/admin-style";
}
return "mapbox://styles/mapbox/streets-v12";
}
map.setStyle(getStyleForUser(currentUser));
Модель Mapbox GL JS предполагает, что:
Поэтому пользовательская аутентификация всегда реализуется вне Mapbox и лишь связывается с его токенами через инфраструктуру приложения