Debes usar la parte del fragmento de la URL, en lugar de la parte de la búsqueda para transferir secretos. Por buenas razones mencionadas por otros, los parámetros GET son problemáticos, pero el fragmento de la URL ( #secret
) ni siquiera sale por el cable, lo que hace imposible interceptarlo desde fuera de la computadora.
Esto evita las complicaciones de CORS derivadas de la POSTing de datos en dominios, y en realidad es más seguro que POST porque el secreto permanece local en la máquina.
todo lo que deberías hacer es vincular con un hash en lugar de una consulta:
<a href="https://site2.com/auth?id=abc123 target=_blank>Log In</a>
se convierte en
<a href="https://site2.com/auth#abc123 target=_blank>Log In</a>
no podrá acceder al secreto pasado del servidor del segundo sitio, pero está disponible para el JS de la página como location.hash
o más exactamente, location.hash.slice(1)
.
Con respecto al problema menor de la visibilidad humana, puede eliminar el secreto de la barra de URL de la nueva página inmediatamente después de capturar el secreto llamando a location.hash="";
, o mantenerlo fuera del historial del navegador: history.replaceState("","","#");
.
Si está usando HTTPS todo el tiempo, POST sería tan seguro y permitiría más contenido; El hash (en mis pruebas) está limitado a unos 20kb en navegadores más antiguos. Si solo necesita una clave, el hash es rápido, físicamente es seguro, ampliamente compatible y fácil de usar.
EDITAR:
A lo largo de esta noción, puede usar otra propiedad, esta visiblemente oculta, llamada window.name
. AFAIK, no puede usar solo enlaces HTML para esto, se necesita un poco de JS para organizar. Puede usar un iframe solo con HTML, pero necesitará que JS lea el valor de todos modos:
<iframe name=secret123 href=https://site2.com/auth></iframe>
dentro del marco, window.name
se establecerá en secret123
. La propiedad especial name
se mantiene entre las recargas de la página e incluso la última después de navegar a dominios de terceros, por lo que si la página enmarcada navega, primero debe desinfectar mediante window.name="";
.
también puedes usar fácilmente el "truco" de nombre en una ventana emergente js: window.open("https://site2.com/auth", "secret123");