Login único (SSO)
Como funciona
- Enquanto um leitor está conectado ao seu site, o seu servidor assina um token de curta duração que diz quem ele é.
- Sua página passa esse token ao widget de comentários no atributo
sso-token. - 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.
| Claim | Obrigatório | Valor |
|---|---|---|
sub | sim | O 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. |
name | sim | O nome exibido ao lado dos comentários, até 100 caracteres. HTML é removido. |
avatar | não | Uma URL de imagem https://. Qualquer outra coisa é ignorada. |
badges | não | Chaves 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. |
aud | sim | A app key do seu widget, exatamente como no código de incorporação. |
iat, exp | sim | Emissã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' },
)
// composer require firebase/php-jwt
use Firebase\JWT\JWT;
$now = time();
$ssoToken = JWT::encode([
'sub' => (string) $user->id,
'name' => $user->display_name,
'avatar' => $user->avatar_url,
'aud' => CROWMENT_APP_KEY,
'iat' => $now,
'exp' => $now + 3600,
], getenv('CROWMENT_SSO_SECRET'), 'HS256');
# pip install pyjwt
import os
from datetime import datetime, timedelta, timezone
import jwt
now = datetime.now(timezone.utc)
sso_token = jwt.encode(
{
"sub": str(user.id),
"name": user.display_name,
"avatar": user.avatar_url,
"aud": CROWMENT_APP_KEY,
"iat": now,
"exp": now + timedelta(hours=1),
},
os.environ["CROWMENT_SSO_SECRET"],
algorithm="HS256",
)
// go get github.com/golang-jwt/jwt/v5
now := time.Now()
ssoToken, err := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"sub": strconv.FormatInt(user.ID, 10),
"name": user.DisplayName,
"avatar": user.AvatarURL,
"aud": crowmentAppKey,
"iat": now.Unix(),
"exp": now.Add(time.Hour).Unix(),
}).SignedString([]byte(os.Getenv("CROWMENT_SSO_SECRET")))
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
| Sintoma | Causa provável |
|---|---|
invalid_sso_token | Segredo 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_expired | O 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 app | O modo está em Off ou nenhum segredo foi criado. |
| Request origin does not match | A página não está no domínio do seu widget nem em um de seus subdomínios. |