what how decidir javascript security leaflet mapbox

how - sdk javascript decidir



¿Cómo asegurar el token de acceso a la API de JavaScript? (4)

Es posible que desee leer en los encabezados de CORS. Esto le permite restringir qué dominio puede llamar a un servicio web remoto.

Existen numerosos recursos en línea que proporcionan API de JavaScript para acceder a sus servicios. Para ser más claros, basaré mi pregunta en el ejemplo de MapBox , pero esto se aplica bien a muchos otros servicios en varios dominios.

Cuando alguien quiere usar un servicio de este tipo en una aplicación web (como las imágenes de mapas de MapBox, por ejemplo), normalmente necesitan registrarse / registrarse y obtener un token de acceso para acceder al servicio.

Ahora, si quisiera usar la API desde el lado del servidor, no hay ningún problema: sé que mi token se almacena de forma segura en algún lugar del servidor y solo está "expuesto" al comunicarse entre mi servidor y el proveedor de servicios. Sin embargo, en el caso de una API de JavaScript (por ejemplo, si uso Leaflet para representar un mapa de MapBox), se supone que tengo mi token de acceso en un JavaScript que está expuesto al navegador web del usuario, por lo que es extremadamente fácil. para encontrar el token de acceso de alguien. En mi ejemplo, simplemente ir a cualquier sitio web utilizando Leaflet y abrir "Dev Tools" en Firefox revela el token que usan en un minuto de lectura atenta de su código JavaScript.

Sin embargo, este token, al igual que para mí, debe considerarse como un dato muy seguro: el uso del servicio se rastrea según la autenticación que proporciona este token. Si paga por el servicio en función de su uso, se vuelve muy crítico, pero incluso si no lo hace (por ejemplo, si usa un plan gratuito / de inicio / no pagado), el uso del servicio es limitado y me gustaría estar seguro Sólo soy yo quien lo usa.

Claramente, hay estrategias como el filtrado de IP / dominio por proveedor de servicios, por ejemplo, pero no parece que todos los proveedores de servicios lo admitan, por ejemplo, MapBox no parece (o no lo encontré). O, en última instancia, puedo hacer un proxy del servicio a través de mi servidor web, pero esto es muy pesado.

Dado todo eso, ¿hay una manera de asegurar el token de acceso utilizado por una API de JavaScript para acceder a un servicio externo, siempre que JavaScript se ejecute en el navegador de un usuario?


Hablaré solo sobre las API de imágenes de mapas como Mapbox, parece que desafortunadamente solo servicios como Google Maps, Here Maps, Bing Maps, etc. ofrecen filtros de ip / dominio por proveedor de servicios o este tipo de seguridad, todas las ofertas basadas en OSM que he encontrado t lo propones Como dijo Justin Poehnelt, la única forma confiable es construir un proxy, pero generalmente está prohibido. Encuentro esto en el ToU de Mapbox :

No puede redistribuir los Activos del Mapa, incluso desde un caché, a través de un proxy , o utilizando una captura de pantalla u otra imagen estática en lugar de acceder a los Activos del Mapa a través de las API de Mapeo.


Restringir el acceso con CORS

Haga que su servidor web devuelva los tokens de acceso en una solicitud ajax desde su javascript con la configuración de CORS. Token puede ser capturado con este método visitando tu aplicación.

Proporcionar tokens a usuarios autorizados

También puede agregar autenticación en su servidor web para proporcionar acceso limitado a los usuarios que usted permite. El token se puede capturar con este método pero solo por usuarios autorizados.

Solicitudes de proxy

La única forma de proteger completamente ese token es enviar las solicitudes a través de su servidor. Token no puede ser capturado con este método.


Los tokens de API de Javascript (y todos los tokens de cliente, de hecho) siempre son visibles para el cliente (a menos que se usen solo en el lado del servidor, como en el nodo). No hay manera de evitar eso. Como mencionó, la única forma de proteger verdaderamente una clave API y mantenerla privada es almacenarla en el servidor, luego solicitar al servidor que realice la solicitud en nombre del cliente.