Hay mucha información general sobre la prevención de fugas de claves API, pero tengo problemas para encontrar el procedimiento adecuado específicamente para realizar una solicitud HTTP GET con una clave API como parámetro. Cualquier usuario puede inspeccionar fácilmente la solicitud y obtener la clave API privada de una aplicación, por lo que sé.
¿Hay alguna forma de realizar solicitudes GET de forma segura? Usaría algo que no sea GET si la API de terceros lo pusiera a disposición. Podría ser simplemente un mal diseño.
Ejemplo de una aplicación en la que estoy trabajando. Cuando realizo una solicitud GET a una API de terceros, mi clave de API se puede ver fácilmente en el inspector:
Código:
const response = await fetch('https://www.someexampleimadeup.com?var=something&key=LOOKITSMYPRIVATEKEY'Inspector:
Tienes razón.
Si pasa una clave API privada con su solicitud GET iniciada por javascript del lado del cliente, está exponiendo la clave. Y no, no hay forma de evitarlo si desea hacer esto del lado del cliente (si está obteniendo la API de un archivo javascript que se ejecuta en el navegador).
Esto se debe a que, por definición, los mensajes de solicitudes HTTP se componen de información textual codificada en ASCII (como se explica correctamente en este artículo de MDN ). Todas las solicitudes HTTP de cualquier protocolo están siempre disponibles para el usuario del navegador que inició la solicitud, incluso si usa HTTPS.
Es importante tener en cuenta que el simple hecho de que su clave API privada esté presente en el código javascript del lado del cliente lo hace inseguro : público.
Si ejecutar javascript del lado del servidor es una opción para usted, algo así como un servidor back-end de Node.js, puede obtener su servidor fetch("https://yourserver.com/resource") , y luego su servidor puede obtener la API con la obtención de la clave privada fetch('https://api.com/?api_key=XXXXX') . Ahora su servidor backend es el intermediario (o la caja negra) responsable de obtener los datos de la API sin exponer la clave privada.
No expondrá la clave porque el usuario solo conoce la solicitud GET a su servidor y los datos que elige devolver. Además, dado que tiene control sobre su servidor, puede optar por no exponer su clave API privada al no entregar el archivo en el que está escrita.
En los servidores web Node.js, generalmente almacena su clave API en un archivo ".env" PRIVATE_API_KEY=XXXXXXX , que no se sirve. Luego, este archivo se agrega a las reglas presentes en .gitignore, para evitar que se envíe a cualquier repositorio público. Con la ayuda de un paquete de nodos como dotenv, puede acceder a él en su código como una propiedad del objeto process.env.PRIVATE_API_KEY (algunos ejemplos en su página npm ).
En este caso, la clave no se filtrará a través de la red porque la solicitud utiliza TLS (http s ://). Esto se debe a que la cadena de consulta está completamente en la solicitud HTTP, cuyos datos se envían en su totalidad a través de una conexión segura.
Sin embargo, nunca es seguro usar claves API privadas en un cliente web, con cualquier tipo de solicitud, GET o de otro tipo. La interfaz se procesa y se ejecuta completamente en las máquinas de sus usuarios, por lo que se puede ver cualquier información que ingrese en ese HTML o JavaScript. Si la API que utiliza solo proporciona claves de API privadas, cualquier solicitud que realice debe realizarse en su propio servidor.
Por otro lado, algunas claves API están destinadas a ser utilizadas en el cliente. Por ejemplo, considere la API de Google Maps . En esto, el único riesgo asociado con tener una clave API visible es el hecho de que otros usuarios puedan usar esa clave para sus propios sitios web e incurrir en cargos. Google mitiga esto al permitir que los desarrolladores especifiquen orígenes permitidos: es decir, limita qué dominios pueden usar la clave.