
Sprache 🇩🇪 Deutsch
Val Town-Installation
Live-Kommentare zu Val Town-Apps hinzufügen
Val Town führt TypeScript auf Deno aus, sodass ein Val ein echter Server ist. Das macht es zu einer guten Wahl für FastComments: Das Widget ist ein Script‑Tag auf der Seite, und alles, was ein Geheimnis benötigt, wie Secure SSO oder die Verifizierung eines Webhooks, kann serverseitig im selben Val ausgeführt werden.
Dieser Leitfaden behandelt das Hinzufügen des Kommentar‑Widgets zu einem HTTP‑Val, das Anzeigen von Kommentarzahlen auf einer Indexseite, das Anmelden von Benutzern mit dem bereits vorhandenen Val‑Town‑Konto und das Empfangen von Kommentar‑Webhooks.
Sie benötigen kein Konto, um es auszuprobieren. Die Beispiele verwenden tenantId: "demo", eine gemeinsam genutzte Sandbox, und Schritt 2 behandelt das Wechseln zu Ihrem eigenen.
Schritt 1: Widget hinzufügen 
The widget is a script tag and a container element, so it drops into whatever your val already renders. This example uses Hono JSX, which is what Val Town's HTTP templates use.
Run 
Wählen Sie eine urlId, bevor Sie veröffentlichen
urlId entscheidet, in welchem Thread ein Kommentar landet. Lassen Sie es unverändert, wird es standardmäßig auf eine bereinigte Version der aktuellen Seiten‑URL gesetzt, was genau das ist, was sich bei Val Town ändert: Ein Val hat einen langen *.web.val.run Hostnamen, bis Sie eine Subdomain beanspruchen, Zweige erhalten eigene URLs, und das Umbenennen einer Seite ändert den Pfad. Jede Variation wird stillschweigend zu einem separaten, leeren Thread, und das Symptom lautet „meine Kommentare sind verschwunden“.
Setzen Sie es auf etwas Stabiles, das Sie kontrollieren, wie den Beitrags‑Slug oder eine Datenbank‑ID, wie oben gezeigt. Übergeben Sie auch url, damit Benachrichtigungs‑E‑Mails und die Moderations‑Tools zurück zur echten Seite verlinken können.
Kommentare ohne JavaScript beibehalten
FastComments rendert einen vollständigen Thread serverseitig, den ein Val in einen <noscript>‑Block einfügen kann:
Run 
URL‑kodieren Sie die Parameter. Die serverseitige Version unterstützt anonyme und angemeldete Kommentare, SSO und verschachtelte Antworten.
Schritt 2: Verwenden Sie Ihr eigenes Konto 
tenantId: "demo" ist ein gemeinsam genutzter öffentlicher Sandbox. Sie funktioniert ohne Anmeldung, weshalb die Beispiele sie verwenden, aber alle anderen, die FastComments ausprobieren, schreiben in dieselben Threads und jeder kann sie moderieren. Wechseln Sie, bevor Sie etwas veröffentlichen, das Ihnen wichtig ist.
Ihre Tenant-ID finden Sie auf der API-Geheimnis-Seite.
Eine Tenant-ID ist öffentlich und gehört in den Browser‑Code. Ein API‑Geheimnis ist das nicht, und nichts auf dieser Seite benötigt eines.
Aus einer Umgebungsvariable lesen
Val Town Vals sind im kostenlosen Tarif öffentlich, sodass ihr Quellcode weltlesbar ist. Bewahren Sie alles Sensible in Umgebungsvariablen auf, lesen Sie sie mit Deno.env.get:
Run 
Das ist auf Val Town aus einem zweiten Grund wichtiger als üblich: Beim Remix eines Vals werden Umgebungsvariablen‑Schlüssel kopiert, aber nicht deren Werte. Ein in einer Umgebungsvariable aufbewahrtes Geheimnis folgt Ihrem Val nicht in das Konto eines anderen. Ein in einer Datei geschriebenes Geheimnis tut es.
Das Zurückfallen auf "demo" lässt den Val für jeden funktionieren, der ihn remixt, bevor er seinen eigenen Tenant festlegt.
EU-Konten
Ein Konto, seine Daten und seine Schlüssel befinden sich in einer Region. Wenn Ihres auf eu.fastcomments.com erstellt wurde, benötigt jede Widget‑Konfiguration ebenfalls region: "eu", und die Skripte werden von cdn-eu.fastcomments.com geladen. Andernfalls lassen Sie beide unverändert.
Kommentaranzahl auf einer Indexseite 
On an index page, don't render one comment-count widget per row. That is one request per post. Use the bulk count, which takes a single request for the whole page.
Mark each row with the urlId its thread uses, then load the bulk widget once:
Run 
The script finds every .fast-comments-count element on the page and fills in its count.
data-fast-comments-url-id has to match the urlId that post's comment widget uses. If the widget uses the slug, the marker uses the slug. A mismatch shows zero on a thread that has comments.
The script polls for window.FastCommentsBulkCountConfig, so it does not matter whether you set the config before or after the script tag.
Sichere SSO mit std/oauth 
If Ihr Val bereits weiß, wer der Besucher ist, übergibt Secure SSO diese Identität an das Widget, sodass sie nie einen zweiten Login sehen. Es gibt keine Endpunkte zu erstellen und nichts, das zur Laufzeit aufgerufen werden muss: Sie berechnen drei Werte serverseitig und übergeben sie in der Widget‑Konfiguration.
Val Town liefert eine Null‑Konfigurations‑Anmeldung mit std/oauth, sodass der Besucher sich mit dem Val Town‑Konto anmelden kann, das er bereits hat. Ersetzen Sie dies durch das, was Ihre App verwendet; der FastComments‑Teil ändert sich nicht.
Build the payload on the server
The API secret signs the payload and must never reach browser code. Install the SDK from npm, which works on Val Town's Deno runtime as‑is:
Run 
getPayload() gibt { userDataJSONBase64, verificationHash, timestamp } zurück. Diese drei Werte sind alles, was den Browser erreicht. Das Geheimnis signiert sie und wird dann verworfen, sodass nichts auf der Seite einem Leser ermöglicht, einen anderen Benutzer zu fälschen.
Pass it to the widget
Run 
oauthMiddleware fügt GET /auth/login, GET /auth/callback und POST /auth/logout für Sie hinzu. Beachten Sie, dass Logout ein POST ist, während das Widget zu logoutURL mit einem GET navigiert, also richten Sie logoutURL auf eine kleine eigene Route, die den POST ausführt.
Wenn der Besucher abgemeldet ist, übergeben Sie sso nur mit einer loginURL. Das Widget zeigt dann eine Anmeldeaufforderung anstelle eines anonymen Kommentarfelds.
Things that go wrong
timestamp ist Epoch Millisekunden, darf nicht in der Zukunft liegen und nicht älter als zwei Tage sein. Generieren Sie es auf dem Server in derselben Anfrage, die den Hash berechnet. Die Erzeugung im Browser ist der klassische Fehler: Der Wert unterscheidet sich von dem, der gehasht wurde, und jeder Kommentar wird abgelehnt.
Setzen Sie niemals isAdmin oder isModerator vom Identitätsanbieter. Die Anmeldung mit einem Val Town‑Konto sagt nichts darüber aus, wer Ihre Seite moderieren sollte.
Siehe den SSO guide für die vollständige Feldliste, gruppenbasierte Threads und Badges.
Empfangen von Webhooks 
Ein val ist ein natürlicher Webhook‑Empfänger: Er hat eine stabile URL, kann eine Signatur verifizieren und hat SQLite‑ und Blob‑Speicher integriert.
FastComments signiert ${timestamp}.${body} mit dem API‑Geheimnis Ihres Kontos und sendet zwei Header:
Run 
Die Methode überträgt das Ereignis: PUT für einen erstellten oder aktualisierten Kommentar, DELETE für einen gelöschten.
Run 
Zwei Dinge, die Probleme verursachen
Verifiziere die rohen Bytes. Das Parsen des JSON und das erneute Serialisieren ändert die Schlüsselreihenfolge und Leerzeichen, sodass der Hash abweicht und jede Zustellung fehlschlägt, ohne offensichtlichen Grund. Das ist der übliche Grund, warum ein Webhook‑Empfänger „einfach nicht funktioniert“.
Vergleiche in konstanter Zeit. Ein einfaches === auf die Signatur leckt, wie viele Bytes übereinstimmen, was ausreicht, um Byte für Byte zu fälschen.
Ereignisse verarbeiten
Antworte schnell. FastComments versucht es bei einem Nicht‑2xx‑Status erneut, und ein Endpunkt, der ständig fehlschlägt, wird schließlich automatisch deaktiviert. Führe daher die eigentliche Arbeit erst nach der Antwort aus, nicht inline.
Stelle sicher, dass die Verarbeitung anhand der Kommentar‑ID idempotent ist. Ein Retry wird mit einem neuen Zeitstempel erneut signiert, und dieselbe Kommentar‑ID kommt bei Bearbeitung und Löschung erneut, sodass es nichts Stabiles zum Deduplizieren gibt.
Beispielwerte 
Vier öffentliche Vals, die Sie remixen können, jede deckt einen Teil dieses Leitfadens ab.
Blog mit Kommentaren (live) ist ein Markdown‑Blog mit einem Thread unter jedem Beitrag und einer Gesamtsumme der Kommentare im Index. Er funktioniert sofort, wenn Sie ihn remixen, und eine Umgebungsvariable verweist auf Ihr eigenes Konto.
SSO‑Demo (live) meldet den Besucher mit seinem Val‑Town‑Konto an und übergibt diese Identität an das Widget, sodass kein zweiter Login nötig ist.
Webhook‑Empfänger (live) prüft die HMAC‑Signatur bei jeder Zustellung und speichert Ereignisse in SQLite. Er hat einen Button, der eine Test‑Payload signiert und an sich selbst liefert, sodass Sie die erfolgreiche Verifizierung beobachten können, bevor Sie einen echten Webhook konfigurieren.
Agent‑Skills (live) ist eine Bibliothek von FastComments‑Agent‑Skills, die das Widget, SSO, die REST‑API, Moderation und die Migration von Disqus abdecken. Remixen Sie sie und der Agent von Val Town, Townie, übernimmt die Skills automatisch aus skills/, sodass Ihr Agent weiß, wie Kommentare eingerichtet werden, ohne dass Sie Dokumentation in den Chat einfügen müssen.
Die gleichen Skills können überall sonst mit npx skills add fastcomments/skills installiert werden.
Domain-Fehler 
Sobald Sie den demo-Mandanten ausschalten, kann das Widget mit einem Autorisierungsfehler die Ladeverweigerung zeigen. Das liegt daran, dass FastComments nicht weiß, dass Ihr Konto auf dieser Domain verwendet werden darf.
Gehen Sie hier, um Ihre Site zu Ihrem Konto hinzuzufügen.
Val Town lohnt hier einen zweiten Blick, weil ein Val über mehr als einen Hostnamen erreichbar sein kann:
- Jeder HTTP-Val hat einen langen Standard-Endpunkt,
<org>--<id>.web.val.run. - Das Beanspruchen einer benutzerdefinierten Subdomain fügt
<name>.val.runhinzu. - Eine benutzerdefinierte Domain fügt eine dritte hinzu.
- Branches erhalten eigene URLs.
Fügen Sie die Hostnamen hinzu, von denen Sie das Widget tatsächlich bereitstellen. Wenn Sie nach der Einrichtung eine Subdomain beanspruchen, fügen Sie diese ebenfalls hinzu, sonst funktioniert das Widget nur mit der alten URL und schlägt bei der neuen fehl.