Intégrations

Authentification unique (SSO)

Les lecteurs connectés à votre site sont aussi connectés aux commentaires. Pas de second compte, pas de seconde connexion.

Fonctionnement

  1. Tant qu'un lecteur est connecté à votre site, votre serveur signe un jeton de courte durée qui indique qui il est.
  2. Votre page transmet ce jeton au widget de commentaires via l'attribut sso-token.
  3. Crowment vérifie la signature et connecte le lecteur aux commentaires sous cette identité.

Le jeton est signé avec un secret que seuls votre serveur et Crowment connaissent : personne ne peut donc connecter des lecteurs sous l'identité de quelqu'un d'autre. L'authentification unique est disponible dans toutes les offres.

1. Activez-la

Ouvrez Site Console → votre widget → Single Sign-On. Les propriétaires et les administrateurs peuvent modifier les réglages.

Créez le secret de signature

Seul le propriétaire du widget peut le faire. Le secret n'est affiché qu'une seule fois : stockez-le dans les variables d'environnement de votre serveur, par exemple sous CROWMENT_SSO_SECRET. Ne le placez jamais dans du code exécuté par le navigateur, dans le bundle d'une application ou dans un dépôt public.

Choisissez un mode

  • Off : les lecteurs se connectent uniquement avec Crowment.
  • Optional : les lecteurs connectés à votre site sont connectés automatiquement ; la connexion Crowment reste disponible.
  • Required : seuls les comptes de votre site peuvent se connecter. Les commentaires et sessions existants sont conservés.

Définissez vos pages de connexion et de déconnexion (facultatif)

Les deux doivent se trouver sur le domaine de votre widget. Le bouton de connexion du widget envoie les lecteurs vers votre page de connexion avec un paramètre return_to contenant la page d'où ils viennent. Vérifiez que return_to pointe vers votre propre site avant de rediriger.

2. Signez un jeton sur votre serveur

Signez un JWT avec HS256 et votre secret à chaque affichage de page où un lecteur est connecté.

ClaimObligatoireValeur
subouiL'identifiant du lecteur sur votre site, sous forme de chaîne, 128 caractères au maximum. Choisissez un identifiant qui ne change jamais et n'est jamais réutilisé ; une adresse e-mail est un mauvais choix.
nameouiLe nom affiché à côté de ses commentaires, jusqu'à 100 caractères. Le HTML est supprimé.
avatarnonUne URL d'image en https://. Tout le reste est ignoré.
badgesnonClés des badges du lecteur, par ex. ["vip"], correspondant aux clés SSO définies dans Badges. Sans ce claim, ses badges restent inchangés ; [] retire ceux obtenus par cette voie. Les badges attribués depuis le tableau de bord restent.
audouiL'app key de votre widget, exactement comme dans le code d'intégration.
iat, expouiDate d'émission et d'expiration, en secondes. Le jeton peut vivre une heure au maximum. Un écart d'horloge d'une minute est toléré.

Un claim email n'est ni nécessaire ni utilisé : Crowment n'associe jamais des comptes par e-mail.

// 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. Transmettez-le au widget

Sur les pages rendues côté serveur, placez le jeton dans le code d'intégration :

<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>

Transmettez un jeton sur chaque page où le lecteur est connecté. Une page sans jeton indique au widget que le lecteur s'est déconnecté, et le widget le déconnecte aussi des commentaires. Visiter d'autres pages ne le reconnecte pas à chaque fois : le widget conserve sa session et n'échange un nouveau jeton que lorsque le lecteur change.

Dans une application monopage, ajoutez et retirez l'attribut au fil des changements de connexion, et écoutez les événements du 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 : le widget devait connecter le lecteur, mais le jeton avait expiré. Fournissez-en un nouveau.
  • crow:login-required : mode Required, aucune page de connexion définie, et le lecteur a cliqué sur le bouton de connexion.

Les lecteurs connectés via votre site se déconnectent sur votre site. Sans page de déconnexion, le widget masque son propre bouton de déconnexion, puisque l'absence de jeton sur la page suivante les déconnecte de toute façon.

4. Association de comptes

Un lecteur qui possède déjà un compte Crowment peut l'associer depuis l'espace de commentaires, avec l'icône de lien à côté de son avatar. Il se connecte à Crowment dans une fenêtre pop-up et confirme sur une page Crowment. Dès lors, votre site le connecte avec son compte Crowment, et les commentaires écrits avec son compte de votre site y sont transférés.

L'association permet à votre site de connecter ce lecteur avec son compte Crowment sur vos propres pages uniquement ; la page de confirmation le lui indique. Il peut dissocier son compte à tout moment depuis Profile → Linked sites dans la User Console ; ses commentaires restent les siens. Vous pouvez désactiver l'association avec Account linking dans les réglages SSO.

Le nom et l'avatar de votre jeton mettent à jour le profil de commentaires du lecteur à chaque connexion. Les comptes Crowment associés conservent leurs propres nom et avatar.

Sécurité

  • Gardez le secret sur votre serveur. Quiconque le possède peut connecter n'importe quel lecteur sous n'importe quelle identité sur votre site.
  • En cas de fuite, choisissez Replace secret. Les jetons signés avec l'ancien secret cessent immédiatement de fonctionner : déployez le nouveau sans attendre. Les lecteurs déjà connectés aux commentaires le restent.
  • Ne signez de jetons que pour le lecteur de la requête en cours, et gardez-les de courte durée.

Dépannage

SymptômeCause probable
invalid_sso_tokenSecret incorrect ou remplacé, aud différent de l'app key, algorithme autre que HS256, sub envoyé sous forme de nombre, name vide ou durée de vie supérieure à une heure.
sso_token_expiredLe exp du jeton est dépassé, ou l'horloge de votre serveur est décalée. Signez un nouveau jeton à chaque affichage de page.
SSO is not enabled for this appLe mode est sur Off, ou aucun secret n'a été créé.
Request origin does not matchLa page n'est pas sur le domaine de votre widget ni sur l'un de ses sous-domaines.