Hola 
La razón principal por la que tuve que hacer este cambio es una nueva regulación legal específica del país que afecta a mi sitio. Mi sitio y el tema solo están disponibles para adultos mayores de 18 años. Pero no quería romper el SEO. Así que lo primero que pensé fue hacer que el sitio requiriera inicio de sesión en un país específico, de esta manera el bot de Google y otros podrán rastrear el sitio en otros países. El requisito de inicio de sesión completo no parece ser una buena opción, ya que bloquea todo el sitio y su contenido.
Decidí hacerlo del lado del cliente, lo que parece otra buena opción, así que usé el requisito de inicio de sesión de una manera suave del lado del cliente. Esto parece suficiente por ahora, así que comencé con esto.
Creo que no es la mejor idea compartir el código completo aquí porque probablemente no sea lo mejor para otros casos de uso y probablemente no sea la versión final y, por supuesto, modifica en gran medida el sistema de inicio de sesión.
Todo el proceso funciona ahora con dos componentes de tema separados que podrían fusionarse en el futuro.
Pero antes de hacer esto, tuve que modificar algunas otras cosas. En primer lugar, los bots seleccionados que queremos están exentos de todo este proceso y aún pueden rastrear el sitio. Discourse tiene una página de inicio de sesión estática que está activa cuando la configuración del sitio login required está habilitada. Sin esto, cuando vas a site.com/login, te redirigirá a la página de inicio real del sitio y abrirá el modal de inicio de sesión. Deshabilité esta función y la hice para mantener al visitante en la página /login. También hay algunas otras partes en el archivo js de la aplicación que tuve que modificar. Por ejemplo: canDisplaySidebar() para ocultar la barra lateral a los visitantes. loginRequired() para no requerir la configuración del sitio y estar habilitado para los visitantes. showSiteHeader para renderizar el encabezado solo cuando queremos, se renderiza cuando la cookie relacionada está habilitada.
- El primer componente temático. (Policy Gate)
Para lograr esto, he modificado en gran medida este componente GitHub - discourse/discourse-splash-screen: A welcome splash screen for first time users
He añadido una puerta de enlace al 18+ (¿Eres mayor de 18?) y alguna otra información en la primera pantalla.
Si el visitante hace clic en No, agregará un elemento en el almacenamiento de clave-valor que destruirá la página de 18+ y redirigirá al visitante a un artículo publicado que escribimos sobre cómo las adicciones afectan a los jóvenes y por qué nuestro sitio es solo para adultos… y colocará un almacenamiento de clave-valor para mantener a los visitantes en esa página. Así que el elemento de almacenamiento de clave-valor hace dos cosas.
- Destruye toda la página de 18+ para que el visitante no pueda cambiar su respuesta si hace clic en No.
- Los redirige al artículo siempre.
Si el visitante hace clic en Sí, salta a la segunda pantalla que trata sobre la información de las cookies. Aquí, los visitantes pueden informarse sobre las cookies que utilizamos. Al hacer clic en el botón De acuerdo, lo entiendo, colocamos una cookie de consentimiento de cookies en el navegador durante 1 año. Esto es importante porque utilizamos esta parte del componente también para los usuarios registrados. Tienen que consentir la política de cookies cada año. Así que la cookie de consentimiento de cookies hace tres cosas.
- Destruye la página de cookies.
- Renderiza el encabezado (contiene los botones de inicio de sesión y registro).
- Renderiza el segundo componente y la página de inicio de sesión.

- Segundo componente temático. (Gated Site)
Este componente temático crea la plantilla de la página de inicio de sesión, algo así como los componentes temáticos Guest Gate o Gated Category, pero se renderiza según la URL y a página completa. Tiene dos configuraciones.
URL permitida y una para URL no permitida.
- El valor de la URL permitida es
*, lo que significa que renderiza la puerta de enlace en todas las URL.
- El valor de la URL no permitida es donde no queremos renderizar la puerta de enlace. Por ejemplo:
/about , /tos, /faq , /privacy , otras páginas de registro etc…
Cuando se renderiza, realiza redirecciones automáticas a la página /login. He anulado toda la plantilla de la página de inicio de sesión estática con mi plantilla que contiene los inicios de sesión sociales, etc. No renderizamos el componente en la página /login.
Eso es aproximadamente lo que hice para lograr esto.