Entegrasyonlar

Tek oturum açma (SSO)

Sitenizde oturum açmış okuyucular yorumlarda da oturum açmış olur. İkinci hesap yok, ikinci giriş yok.

Nasıl çalışır

  1. Bir okuyucu sitenizde oturum açıkken sunucunuz, onun kim olduğunu söyleyen kısa ömürlü bir token imzalar.
  2. Sayfanız bu token'ı sso-token özelliğiyle yorum widget'ına verir.
  3. Crowment imzayı doğrular ve okuyucuyu yorumlarda o kimlikle oturum açmış hâle getirir.

Token yalnızca sunucunuzun ve Crowment'in bildiği bir anahtarla imzalanır; böylece kimse okuyucuları başkası olarak oturum açtıramaz. Tek oturum açma her planda kullanılabilir.

1. Açın

Site Console → widget'ınız → Single Sign-On sayfasını açın. Ayarları sahipler ve yöneticiler değiştirebilir.

İmzalama anahtarını oluşturun

Bunu yalnızca widget sahibi yapabilir. Anahtar yalnızca bir kez gösterilir: sunucunuzun ortam değişkenlerinde saklayın, örneğin CROWMENT_SSO_SECRET olarak. Asla tarayıcı koduna, bir uygulama paketine ya da herkese açık bir depoya koymayın.

Bir mod seçin

  • Off: okuyucular yalnızca Crowment ile oturum açar.
  • Optional: sitenizde oturum açmış okuyucular otomatik olarak oturum açar; Crowment ile giriş de kullanılabilir kalır.
  • Required: yalnızca sitenizin hesapları oturum açabilir. Mevcut yorumlar ve oturumlar kalır.

Giriş ve çıkış sayfalarınızı belirleyin (isteğe bağlı)

İkisi de widget'ınızın alan adında olmalıdır. Widget'ın giriş düğmesi okuyucuları, geldikleri sayfayı tutan bir return_to parametresiyle giriş sayfanıza gönderir. Yönlendirmeden önce return_to'nun kendi sitenizi gösterdiğini kontrol edin.

2. Sunucunuzda bir token imzalayın

Okuyucunun oturum açık olduğu her sayfa görüntülemesinde HS256 ve anahtarınızla bir JWT imzalayın.

ClaimZorunluDeğer
subevetOkuyucunun sitenizdeki kullanıcı kimliği, string olarak, en fazla 128 karakter. Hiç değişmeyen ve asla yeniden kullanılmayan bir kimlik seçin; e-posta adresi iyi bir seçim değildir.
nameevetYorumlarının yanında gösterilen ad, en fazla 100 karakter. HTML temizlenir.
avatarhayırhttps:// ile başlayan bir görsel URL'si. Diğer her şey yok sayılır.
badgeshayırOkurun sahip olduğu rozetlerin anahtarları, ör. ["vip"]; Badges sayfasındaki SSO anahtarlarıyla eşleşir. Gönderilmezse rozetleri değişmez; [] bu yolla verilenleri kaldırır. Panelden verilen rozetler kalır.
audevetWidget'ınızın uygulama anahtarı, embed kodundakiyle birebir aynı.
iat, expevetSaniye cinsinden oluşturulma ve bitiş zamanı. Token en fazla bir saat yaşayabilir. Bir dakikalık saat farkı tolere edilir.

email claim'i gerekmez ve kullanılmaz: Crowment hesapları asla e-postaya göre eşleştirmez.

// 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. Token'ı widget'a verin

Sunucuda üretilen sayfalarda token'ı embed koduna yazı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>

Okuyucunun oturum açık olduğu her sayfada bir token verin. Token içermeyen bir sayfa widget'a okuyucunun oturumu kapattığını söyler; widget da onun yorumlardaki oturumunu kapatır. Başka sayfaları gezmek onu her seferinde yeniden oturum açtırmaz: widget oturumunu korur ve yalnızca okuyucu değiştiğinde yeni bir token alışverişi yapar.

Tek sayfalı bir uygulamada oturum durumunuz değiştikçe özelliği ekleyip kaldırın ve widget'ın olaylarını dinleyin:

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: widget'ın okuyucuyu oturum açtırması gerekti ama token'ın süresi dolmuştu. Yeni bir token verin.
  • crow:login-required: Required modu açık, giriş sayfası tanımlı değil ve okuyucu giriş düğmesine bastı.

Sitenizden oturum açan okuyucular oturumu sitenizden kapatır. Çıkış sayfası tanımlı değilse widget kendi çıkış düğmesini gizler; çünkü bir sonraki sayfada token'ın verilmemesi zaten oturumu kapatır.

4. Hesap bağlama

Zaten bir Crowment hesabı olan okuyucu, onu yorum bölümünden, avatarının yanındaki bağlantı simgesiyle bağlayabilir. Bir açılır pencerede Crowment'e giriş yapar ve bir Crowment sayfasında onaylar. Bundan sonra siteniz onu Crowment hesabıyla oturum açtırır ve site hesabıyla yazdığı yorumlar bu hesaba taşınır.

Bağlama, sitenizin o okuyucuyu yalnızca kendi sayfalarınızda Crowment hesabıyla oturum açtırmasına izin verir; onay sayfası bunu okuyucuya söyler. Okuyucu bağlantıyı istediği zaman User Console'da Profile → Linked sites altından kaldırabilir; yorumları onda kalır. SSO ayarlarındaki Account linking ile bağlamayı kapatabilirsiniz.

Token'ınızdaki ad ve avatar, her girişte okuyucunun yorum profilini günceller. Bağlanmış Crowment hesapları kendi ad ve avatarlarını korur.

Güvenlik

  • Anahtarı sunucunuzda tutun. Ona sahip olan herkes okuyucuları sitenizde herhangi biri olarak oturum açtırabilir.
  • Anahtar sızarsa Replace secret'ı seçin. Eski anahtarla imzalanmış token'lar hemen çalışmaz hâle gelir; yenisini hemen yayına alın. Yorumlarda zaten oturum açmış okuyucuların oturumu açık kalır.
  • Token'ları yalnızca o anki isteğin okuyucusu için imzalayın ve kısa ömürlü tutun.

Sorun giderme

BelirtiOlası neden
invalid_sso_tokenYanlış ya da değiştirilmiş anahtar, aud uygulama anahtarı değil, HS256 dışında bir algoritma, sayı olarak gönderilen sub, boş bir name ya da bir saati aşan ömür.
sso_token_expiredToken'ın exp zamanı geçmiş ya da sunucunuzun saati kaymış. Her sayfa görüntülemesi için yeni bir token imzalayın.
SSO is not enabled for this appMod Off durumunda ya da hiç anahtar oluşturulmamış.
Request origin does not matchSayfa widget'ınızın alan adında ya da onun bir alt alan adında değil.