
Језик 🇷🇸 Српски
Инсталација Val Town
Додајте живо коментарисање у апликације Val Town
Val Town извршава TypeScript на Deno, тако да је вал прави сервер. То га чини добрим избором за FastComments: виџет је script ознака на страници, а све што захтева тајну, као што су Secure SSO или верификација вебхука, може да се изврши на серверу у истом валу.
Овај водич обухвата додавање виџета за коментаре у HTTP вал, приказ броја коментара на индекс страници, пријављивање корисника помоћу постојећег Val Town налога, и примање вебхукова за коментаре.
Не треба вам налог да бисте пробали. Примери користе tenantId: "demo", заједничку песочницу, а корак 2 објашњава како да пређете на ваш сопствени.
Корак 1: Додајте виџет 
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 
Одаберите urlId пре него што објавите
urlId одређује у који се разговор (тема) ставља коментар. Ако га оставите непостављеним, подразумева се чиста верзија тренутног URL‑а странице, што је управо оно што се мења на Val Town: вал има дуго *.web.val.run име хоста док не заузмете поддомени, гране добијају сопствене URL‑ове, а преименовање странице мења путању. Свака варијација тихо постаје одвојена, празна тема, а симптом се манифестује као „моји коментари су нестали“.
Поставите га на нешто стабилно што контролишете, као што је slug поста или ID у бази података, као у горе наведеном. Проследите и url, како би е‑мејлови за обавештење и алати за модерацију могли да врате везу ка стварној страници.
Чување коментара без JavaScript‑а
FastComments рендерује целу тему на серверу, што вал може да убаци у <noscript> блок:
Run 
URL‑кодујте параметре. Верзија на серверу подржава анонимно и пријављено коментарисање, SSO и угнежђене одговоре.
Корак 2: Користите свој налог 
tenantId: "demo" је дељени јавни песак. Ради без регистрације, због чега се примери користе, али сви остали који користе FastComments пишу у истим темама и свако их може модерирати. Промените пре него што објавите било шта што вам је важно.
Ваш tenant ID је на страници за API тајну.
Tenant ID је јаван и треба да буде у коду у прегледачу. API тајна није, и ништа на овој страници не захтева једну.
Прочитајте га из променљиве окружења
Val Town валови су јавни у бесплатном слоју, тако да је њихов извор читљив свима. Чувајте све осетљиво у променљивим окружења, читајте их помоћу Deno.env.get:
Run 
Ово је важније него обично на Val Town из другог разлога: ремиксовање вал‑а копира кључеве променљивих окружења, али не и њихове вредности. Тајна сачувана у променљивој окружења не прати ваш вал у налог друге особе. Тајна уписана у датотеку то чини.
Враћање на "demo" одржава вал у раду за свакога ко га ремиксује пре него што постави сопствени tenant.
EU налози
Налог, његови подаци и кључеви живе у једној региони. Ако је ваш креиран на eu.fastcomments.com, свака конфигурација виџета такође треба region: "eu", а скрипте се учитавају са cdn-eu.fastcomments.com. У супротном оставите оба нетакнута.
Број коментара на индекс страници 
На индекс страници, немојте да рендерујете један widget за број коментара по реду. То је један захтев по посту. Користите групни број, који захтева један захтев за целу страницу.
Означите сваки ред urlId‑ом који користи његова тема, а затим учитајте групни widget једном:
Run 
Скрипта проналази сваки елемент .fast-comments-count на страници и попуњава његов број.
data-fast-comments-url-id мора да се поклапа са urlId‑ом који користи widget за коментаре поста. Ако widget користи slug, маркер користи slug. Неусаглашеност приказује нулу на теми која има коментаре.
Скрипта проверава window.FastCommentsBulkCountConfig, па није битно да ли постављате конфигурацију пре или после script таг‑а.
Сигурни SSO са std/oauth 
If your val already knows who the visitor is, Secure SSO hands that identity to the widget so they never see a second login. There are no endpoints to build and nothing to call at runtime: you compute three values server‑side and pass them in the widget config.
Val Town ships zero‑config login with std/oauth, so the visitor can sign in with the Val Town account they already have. Swap that for whatever your app uses; the FastComments half does not change.
Изградња полезног терета на серверу
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() returns { userDataJSONBase64, verificationHash, timestamp }. Those three values are all that reach the browser. The secret signs them and is then dropped, so nothing in the page lets a reader forge a different user.
Прослеђивање у виџет
Run 
oauthMiddleware adds GET /auth/login, GET /auth/callback and POST /auth/logout for you. Note that logout is a POST, while the widget navigates to logoutURL with a GET, so point logoutURL at a small route of your own that submits the POST.
When the visitor is logged out, pass sso with only a loginURL. The widget then shows a login prompt instead of an anonymous comment box.
Ствари које могу да крене
timestamp is epoch milliseconds, must not be in the future, and must not be more than two days old. Generate it on the server in the same request that computes the hash. Generating it in the browser is the classic failure: the value differs from the one that was hashed and every comment is rejected.
Never set isAdmin or isModerator from the identity provider. Signing in with a Val Town account says nothing about who should moderate your site.
See the SSO guide for the full field list, group‑gated threads, and badges.
Примање вебхукова 
A val је природни прималац вебхука: има стабилну URL адресу, може да верификује потпис, и има уграђену SQLite и blob складиште.
FastComments потписује ${timestamp}.${body} тајном вашег налога за API и шаље два заглавља:
Run 
Метод преноси догађај: PUT за креиран или ажуриран коментар, DELETE за обрисан.
Run 
Две ствари које гризу
Провери сирове бајтове. Парсирање JSON-а и поновно серијализовање мења редослед кључева и размаке, па хеш буде различит и свака испорука не успе без очигледног разлога. Ово је уобичајен разлог зашто прималац вебхука "само не ради".
Упореди у константном времену. Обичан === над потписом открива колико бајтова се поклапа, што је довољно за фалсификовање једног бајта појединачно.
Обрада догађаја
Одговори брзо. FastComments поново покушава на не‑2xx одговор, а крајња тачка која стално не успева се на крају аутоматски онемогућава, па изврши прави посао након одговора уместо унутар.
Учини да рад буде идемпотентан по ID-ју коментара. Поновни покушај се поново потписује са свежим временским жигом, а исти ID коментара се поново пошиље приликом измене и брисања, тако да нема стабилног атрибута за дедаупликацију.
Пример вредности 
Four public vals you can remix, each covering one piece of this guide.
Blog with comments (live) је Markdown блог са темом испод сваког поста и збирним бројем коментара на индексу. Ради одмах када га ремиксате, а једна променљива окружења указује на ваш налог.
SSO demo (live) пријављује посетиоца помоћу њиховог Val Town налога и прослеђује тај идентитет виџету, тако да не постоји друга пријава.
Webhook receiver (live) верификује HMAC потпис на свакој испоруци и чува догађаје у SQLite. Има дугме које потписује тестни податак и испоручује га самом себи, тако да можете видети да верификација успе пре него што подесите прави вебхоок.
Agent skills (live) је библиотека FastComments агентских вештина које обухватају виџет, SSO, REST API, модерацију и миграцију са Disqus‑а. Ремиксујте је и агент Val Town‑а, Townie, аутоматски преузима вештине из skills/, тако да ваш агент зна како да постави коментаре без да ви лепите документацију у ћаскање.
The same skills install anywhere else with npx skills add fastcomments/skills.
Грешке домена 
Када искључите demo tenant, виџет може одбити учитавање са грешком ауторизације. То је зато што FastComments не зна да треба да дозволи ваш налог да се користи на том домену.
Идите овде да додате ваш сајт у ваш налог.
Val Town заслужује поновно разматрање, јер се вал може приступити преко више од једног хост имена:
- Сваки HTTP вал има дуги подразумевани крајњи тачку,
<org>--<id>.web.val.run. - Потраживање прилагођеног поддомена додаје
<name>.val.run. - Прилагођени домен додаје трећи.
- Гране добијају своје URL-ове.
Додајте све хост имене са којих заправо служите виџет. Ако затражите поддомен након што сте подесили све, додајте га такође, иначе ће виџет радити на старом URL-у, а не успевати на новом.