Tengo una aplicación de reacción de una sola página alojada en páginas de github, que viene con muchas limitaciones. Para que mi flujo de "Iniciar sesión con Twitter" funcione, descubrí que era necesario abrir la URL dinámica de inicio de sesión de Twitter en una nueva pestaña, darle a la API de Twitter un punto final en mi backend como la URL de devolución de llamada y luego redirigir mi backend el usuario a la URL raíz de mi cliente frontend con el token JWT generado en la URL como una consulta ( /?token=abcd1234 ). Luego tengo un código en la página de destino de mi cliente que se ve así:
useEffect(() => { // at /?close, just close the window if (props.location.search === '?close') { window.close() closeWindow() setShowCloseMessage(true) // at /?token, save the token to localstorage, then close the window } else if (tokenUrlRE.test(props.location.search)) { const token = props.location.search.match(tokenRE)[0] localStorage.setItem('token', token) window.close() closeWindow() setShowCloseMessage(true) } }, [])Esto funciona bien en Chrome, pero no en Firefox. ¿Quizás Firefox es más estricto al exigir que Windows solo se cierre con el script que lo abrió, y Chrome permite que cualquier script en el mismo dominio que abrió una ventana lo cierre?
De todos modos, varias otras respuestas aquí en Stackexchange recomendaron el siguiente código, que agregué dentro de la función closeWindow() que aparece en el código anterior:
function closeWindow() { console.log('clicked close') window.open('', '_parent', '') window.close() }Pero esto tampoco funcionó en Firefox. Además, esta solución adicional que encontré provocó que React fallara:
open(location, '_self').close()
¿Hay alguna manera de lograr lo que quiero con Firefox? Por el momento, simplemente he usado esa variable de estado showClose que se ve en el primer bloque de código para mostrar un mensaje de "Inicio de sesión exitoso, regrese a la pestaña anterior", pero esto es menos que ideal.