Integraciones

Inicio de sesión único (SSO)

Los lectores que han iniciado sesión en tu sitio también la tienen iniciada en los comentarios. Sin segunda cuenta ni segundo inicio de sesión.

Cómo funciona

  1. Mientras un lector tiene la sesión iniciada en tu sitio, tu servidor firma un token de corta duración que indica quién es.
  2. Tu página pasa ese token al widget de comentarios en el atributo sso-token.
  3. Crowment comprueba la firma e inicia la sesión del lector en los comentarios con esa identidad.

El token se firma con un secreto que solo conocen tu servidor y Crowment, así que nadie puede iniciar sesión en nombre de otra persona. El inicio de sesión único está disponible en todos los planes.

1. Actívalo

Abre Site Console → tu widget → Single Sign-On. Propietarios y administradores pueden cambiar los ajustes.

Crea el secreto de firma

Solo el propietario del widget puede hacerlo. El secreto se muestra una sola vez: guárdalo en las variables de entorno de tu servidor, por ejemplo como CROWMENT_SSO_SECRET. Nunca lo pongas en código del navegador, en el paquete de una aplicación ni en un repositorio público.

Elige un modo

  • Off: los lectores inician sesión solo con Crowment.
  • Optional: los lectores con sesión iniciada en tu sitio entran automáticamente; el inicio de sesión con Crowment sigue disponible.
  • Required: solo pueden iniciar sesión las cuentas de tu sitio. Los comentarios y las sesiones existentes se mantienen.

Define tus páginas de inicio y cierre de sesión (opcional)

Ambas deben estar en el dominio de tu widget. El botón de inicio de sesión del widget envía a los lectores a tu página de inicio de sesión con un parámetro return_to que contiene la página de la que venían. Comprueba que return_to apunta a tu propio sitio antes de redirigir.

2. Firma un token en tu servidor

Firma un JWT con HS256 y tu secreto en cada vista de página en la que un lector tenga la sesión iniciada.

ClaimObligatorioValor
subsíEl ID de usuario del lector en tu sitio, como string, de 128 caracteres como máximo. Usa un ID que nunca cambie ni se reutilice; una dirección de correo no es buena opción.
namesíEl nombre que se muestra junto a sus comentarios, hasta 100 caracteres. Se elimina el HTML.
avatarnoUna URL de imagen https://. Cualquier otra cosa se ignora.
badgesnoClaves de las insignias del lector, p. ej. ["vip"], que coinciden con las claves SSO de Badges. Si no lo envías, sus insignias no cambian; [] quita las que obtuvo por esta vía. Las insignias dadas desde el panel se mantienen.
audsíLa app key de tu widget, exactamente como en el código de inserción.
iat, expsíEmisión y caducidad, en segundos. El token puede durar como máximo una hora. Se tolera un minuto de diferencia de reloj.

No hace falta un claim email y no se usa: Crowment nunca asocia cuentas por correo.

// npm install jsonwebtoken
import jwt from 'jsonwebtoken'

const ssoToken = jwt.sign(
  { sub: String(user.id), name: user.displayName, avatar: user.avatarUrl },
  process.env.CROWMENT_SSO_SECRET,
  { algorithm: 'HS256', audience: CROWMENT_APP_KEY, expiresIn: '1h' },
)

3. Pásalo al widget

En páginas renderizadas en el servidor, pon el token en el código de inserción:

<script defer src="https://embeds.crowment.com/comments.js"></script>

<!-- signed in: pass the token your backend signed for this page view -->
<crow-comments app-key="YOUR_APP_KEY" sso-token="SIGNED_TOKEN"></crow-comments>

<!-- signed out: leave sso-token out -->
<crow-comments app-key="YOUR_APP_KEY"></crow-comments>

Pasa un token en cada página en la que el lector tenga la sesión iniciada. Una página sin token indica al widget que el lector cerró sesión, y el widget también la cierra en los comentarios. Visitar más páginas no vuelve a iniciar la sesión cada vez: el widget mantiene su sesión y solo intercambia un token nuevo cuando cambia el lector.

En una aplicación de una sola página, añade y quita el atributo a medida que cambia tu estado de sesión, y escucha los eventos del widget:

const widget = document.querySelector('crow-comments')

// after your site signs the reader in
widget.setAttribute('sso-token', await fetchCrowmentToken())

// after your site signs the reader out
widget.removeAttribute('sso-token')

// the token expired while the page was open: hand over a fresh one
widget.addEventListener('crow:sso-expired', async () => {
  widget.setAttribute('sso-token', await fetchCrowmentToken())
})

// Required mode without a sign-in page: show your own login
widget.addEventListener('crow:login-required', () => openLoginDialog())
  • crow:sso-expired: el widget necesitaba iniciar la sesión del lector, pero el token había caducado. Pasa uno nuevo.
  • crow:login-required: modo Required, sin página de inicio de sesión definida, y el lector pulsó el botón de iniciar sesión.

Los lectores que iniciaron sesión a través de tu sitio la cierran en tu sitio. Sin página de cierre de sesión, el widget oculta su propio botón de cerrar sesión, ya que omitir el token en la siguiente página ya cierra la sesión.

4. Vinculación de cuentas

Un lector que ya tiene una cuenta de Crowment puede vincularla desde la sección de comentarios, con el icono de enlace junto a su avatar. Inicia sesión en Crowment en una ventana emergente y confirma en una página de Crowment. A partir de entonces, tu sitio inicia su sesión con su cuenta de Crowment, y los comentarios que escribió con la cuenta de tu sitio pasan a ella.

La vinculación permite que tu sitio inicie la sesión de ese lector con su cuenta de Crowment solo en tus propias páginas; la página de confirmación se lo indica. Puede desvincularla en cualquier momento en Profile → Linked sites de la User Console; sus comentarios se quedan con él. Puedes desactivar la vinculación con Account linking en los ajustes de SSO.

Los nombres y avatares de tu token actualizan el perfil de comentarios del lector en cada inicio de sesión. Las cuentas de Crowment vinculadas conservan su propio nombre y avatar.

Seguridad

  • Guarda el secreto en tu servidor. Quien lo tenga puede iniciar la sesión de cualquier lector en tu sitio en nombre de cualquiera.
  • Si se filtra, elige Replace secret. Los tokens firmados con el secreto anterior dejan de funcionar al instante, así que despliega el nuevo de inmediato. Los lectores que ya tenían sesión en los comentarios la mantienen.
  • Firma tokens solo para el lector de la petición actual y mantenlos de corta duración.

Solución de problemas

SíntomaCausa probable
invalid_sso_tokenSecreto incorrecto o sustituido, aud no es la app key, un algoritmo distinto de HS256, sub enviado como número, un name vacío o una duración superior a una hora.
sso_token_expiredEl exp del token ya pasó o el reloj de tu servidor está desajustado. Firma un token nuevo por cada vista de página.
SSO is not enabled for this appEl modo es Off o no se creó ningún secreto.
Request origin does not matchLa página no está en el dominio de tu widget ni en uno de sus subdominios.