Integrações

Login único (SSO)

Leitores conectados ao seu site também ficam conectados aos comentários. Sem segunda conta, sem segundo login.

Como funciona

  1. Enquanto um leitor está conectado ao seu site, o seu servidor assina um token de curta duração que diz quem ele é.
  2. Sua página passa esse token ao widget de comentários no atributo sso-token.
  3. O Crowment confere a assinatura e conecta o leitor aos comentários com essa identidade.

O token é assinado com um segredo que só o seu servidor e o Crowment conhecem, então ninguém consegue conectar leitores como outra pessoa. O login único está disponível em todos os planos.

1. Ative

Abra Site Console → seu widget → Single Sign-On. Donos e administradores podem mudar as configurações.

Crie o segredo de assinatura

Só o dono do widget pode fazer isso. O segredo é mostrado uma única vez: guarde-o nas variáveis de ambiente do seu servidor, por exemplo como CROWMENT_SSO_SECRET. Nunca o coloque em código do navegador, no pacote de um aplicativo ou em um repositório público.

Escolha um modo

  • Off: os leitores entram somente com o Crowment.
  • Optional: leitores conectados ao seu site entram automaticamente; o login com Crowment continua disponível.
  • Required: só as contas do seu site podem entrar. Comentários e sessões existentes continuam.

Defina suas páginas de entrada e saída (opcional)

As duas precisam estar no domínio do seu widget. O botão de login do widget leva os leitores à sua página de entrada com um parâmetro return_to que guarda a página de onde vieram. Confira se return_to aponta para o seu próprio site antes de redirecionar.

2. Assine um token no seu servidor

Assine um JWT com HS256 e o seu segredo a cada visualização de página em que um leitor estiver conectado.

ClaimObrigatórioValor
subsimO ID do leitor no seu site, como string, com no máximo 128 caracteres. Use um ID que nunca mude e nunca seja reaproveitado; um endereço de e-mail é uma má escolha.
namesimO nome exibido ao lado dos comentários, até 100 caracteres. HTML é removido.
avatarnãoUma URL de imagem https://. Qualquer outra coisa é ignorada.
badgesnãoChaves das insígnias do leitor, ex. ["vip"], iguais às chaves SSO definidas em Badges. Se omitido, as insígnias não mudam; [] remove as obtidas por esta via. Insígnias dadas pelo painel permanecem.
audsimA app key do seu widget, exatamente como no código de incorporação.
iat, expsimEmissão e expiração, em segundos. O token pode durar no máximo uma hora. Um minuto de diferença de relógio é tolerado.

Um claim email não é necessário nem usado: o Crowment nunca associa contas pelo 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. Passe o token ao widget

Em páginas renderizadas no servidor, coloque o token no código de incorporação:

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

Passe um token em todas as páginas em que o leitor estiver conectado. Uma página sem token diz ao widget que o leitor saiu, e o widget também o desconecta dos comentários. Visitar mais páginas não refaz o login a cada vez: o widget mantém a sessão e só troca um token novo quando o leitor muda.

Em um aplicativo de página única, adicione e remova o atributo conforme o estado de login muda e ouça os eventos do 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: o widget precisava conectar o leitor, mas o token tinha expirado. Passe um novo.
  • crow:login-required: modo Required, sem página de entrada definida, e o leitor clicou no botão de login.

Leitores que entraram pelo seu site saem pelo seu site. Sem página de saída, o widget esconde o próprio botão de sair, já que omitir o token na próxima página já desconecta o leitor.

4. Vinculação de contas

Um leitor que já tem uma conta Crowment pode vinculá-la na seção de comentários, pelo ícone de link ao lado do avatar. Ele entra no Crowment em uma janela pop-up e confirma em uma página do Crowment. A partir daí, seu site o conecta com a conta Crowment, e os comentários que ele escreveu com a conta do seu site passam para ela.

A vinculação permite que seu site conecte esse leitor com a conta Crowment apenas nas suas próprias páginas; a página de confirmação avisa isso. Ele pode desvincular quando quiser em Profile → Linked sites, no User Console; os comentários continuam com ele. Você pode desligar a vinculação em Account linking, nas configurações de SSO.

Nomes e avatares do seu token atualizam o perfil de comentários do leitor a cada login. Contas Crowment vinculadas mantêm o próprio nome e avatar.

Segurança

  • Mantenha o segredo no seu servidor. Quem tiver o segredo consegue conectar leitores como qualquer pessoa no seu site.
  • Se ele vazar, escolha Replace secret. Tokens assinados com o segredo antigo param de funcionar na hora, então publique o novo imediatamente. Leitores já conectados aos comentários continuam conectados.
  • Assine tokens apenas para o leitor da requisição atual e mantenha-os com vida curta.

Solução de problemas

SintomaCausa provável
invalid_sso_tokenSegredo errado ou substituído, aud diferente da app key, algoritmo diferente de HS256, sub enviado como número, name vazio ou duração acima de uma hora.
sso_token_expiredO exp do token já passou ou o relógio do seu servidor está errado. Assine um token novo a cada visualização de página.
SSO is not enabled for this appO modo está em Off ou nenhum segredo foi criado.
Request origin does not matchA página não está no domínio do seu widget nem em um de seus subdomínios.