ବିଷୟବସ୍ତୁକୁ ଯାଆନ୍ତୁ
ଡକ୍ୟୁମେଣ୍ଟେସନ · ୱେବହୁକ

ୱେବହୁକ

ଏକ ଏନଭାଇରନମେଣ୍ଟରେ ଯାହା ଘଟେ, ଘଟିବା ମାତ୍ରେ Usher ତାହା ଆପଣଙ୍କ ସର୍ଭରକୁ ଜଣାଇପାରେ: କେହି ଯୋଗଦିଅନ୍ତି, ସାଇନ ଇନ କରନ୍ତି, ନିଜ ବିବରଣୀ ବଦଳାନ୍ତି କିମ୍ବା ଚାଲିଯାଆନ୍ତି। ପ୍ରତ୍ୟେକ ଇଭେଣ୍ଟ ଆପଣ ବାଛିଥିବା ଠିକଣାକୁ ଏକ ସାଇନ କରାଯାଇଥିବା POST, ଏବଂ ଆପଣଙ୍କ ସର୍ଭର ଉତ୍ତର ନଦେଲେ ପୁଣି ଚେଷ୍ଟା କରାଯାଏ।

ଏକ ଏଣ୍ଡପଏଣ୍ଟ ଯୋଡ଼ନ୍ତୁ

Usher Consoleରେ ଏନଭାଇରନମେଣ୍ଟ ଖୋଲନ୍ତୁ, ତାପରେ ୱେବହୁକ → ନୂଆ ଏଣ୍ଡପଏଣ୍ଟ। ଆପଣଙ୍କର ଏକ https:// ଠିକଣା ଦିଅନ୍ତୁ ଏବଂ ଏହା କେଉଁ ଇଭେଣ୍ଟ ବିଷୟରେ ଜାଣିବା ଉଚିତ ତାହା ବାଛନ୍ତୁ। Console ଏଣ୍ଡପଏଣ୍ଟର ସାଇନିଂ ସିକ୍ରେଟ (whsec_…) ଥରେ ଦେଖାଏ: ଏହାକୁ ଆପଣଙ୍କ ସର୍ଭରର ଅନ୍ୟ ସିକ୍ରେଟ ସହ ରଖନ୍ତୁ।

ଇଭେଣ୍ଟକେବେ
user.createdକେହି ଏକ ଆକାଉଣ୍ଟ ତିଆରି କଲେ
user.updatedଏକ ଆକାଉଣ୍ଟ ବଦଳିଲା: ଇମେଲ, ନାମ, ଯାଞ୍ଚ କିମ୍ବା ନିଷେଧ (SCIM ମାଧ୍ୟମରେ ଆପଣଙ୍କ ସଂସ୍ଥାର ଡିରେକ୍ଟୋରୀ ଦ୍ୱାରା ନିଷେଧ ସମେତ)
user.deletedଏକ ଆକାଉଣ୍ଟ ଡିଲିଟ ହେଲା
session.createdକେହି ସାଇନ ଇନ କଲେ
session.endedଏକ ସେସନ ଶେଷ ହେଲା: ସାଇନ ଆଉଟ, ରଦ୍ଦ କିମ୍ବା ଆଗୁଆ ମିଆଦ ପୂରିଲା

ଏକ ଟେଷ୍ଟ ପଠାନ୍ତୁ କେବଳ ସେହି ଏଣ୍ଡପଏଣ୍ଟକୁ ଏକ webhook.test ଇଭେଣ୍ଟ ପଠାଏ, ଏହା ଯାହା ପାଇଁ ବି ସବସ୍କ୍ରାଇବ କରିଥାଉ।

କ’ଣ ଆସେ

ଅନୁରୋଧ
POST /usher/webhooks HTTP/1.1
content-type: application/json
user-agent: Usher-Webhooks/1
webhook-id: msg_2fk7x…
webhook-timestamp: 1793643116
webhook-signature: v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=
ବଡି
{
  "type": "user.created",
  "timestamp": "2026-11-02T18:11:56.412Z",
  "data": {
    "user": {
      "id": "Qz3m…",
      "email": "lena@acme.com",
      "emailVerified": false,
      "name": "Lena Live",
      "image": null,
      "banned": false,
      "createdAt": "2026-11-02T18:11:56.380Z",
      "updatedAt": "2026-11-02T18:11:56.380Z"
    }
  }
}

ଇଭେଣ୍ଟଗୁଡ଼ିକ ଲୋକ ଓ ସେସନ ବିଷୟରେ କହେ, କେବେ ସିକ୍ରେଟ ବିଷୟରେ ନୁହେଁ: କୌଣସି ଟୋକେନ ନାହିଁ, ପାସୱାର୍ଡ ହ୍ୟାସ ନାହିଁ, ଭୂମିକା ନାହିଁ, ଏବଂ କାହାକୁ କାହିଁକି ନିଷେଧ କରାଗଲା ତାହା ନାହିଁ।

ପ୍ରତ୍ୟେକ ଡେଲିଭରି ଯାଞ୍ଚ କରନ୍ତୁ

Usher Standard Webhooks ସ୍ପେସିଫିକେସନ ଅନୁସାରେ ସାଇନ କରେ, ତେଣୁ ଏହାର ଯେକୌଣସି ଲାଇବ୍ରେରୀ ଆପଣଙ୍କ ପାଇଁ ସିଗ୍ନେଚର ଯାଞ୍ଚ କରେ। ଯାଞ୍ଚରେ ପାସ ନହେଉଥିବା ସବୁକିଛି ପ୍ରତ୍ୟାଖ୍ୟାନ କରନ୍ତୁ। ଲାଇବ୍ରେରୀଗୁଡ଼ିକ ପାଞ୍ଚ ମିନିଟରୁ ଅଧିକ ଦୂରର ଟାଇମଷ୍ଟାମ୍ପ ମଧ୍ୟ ପ୍ରତ୍ୟାଖ୍ୟାନ କରନ୍ତି, ତେଣୁ ଏକ ପୁରୁଣା ଡେଲିଭରି ପୁଣି ଚଳାଯାଇପାରିବ ନାହିଁ।

app/usher/webhooks/route.ts
// a route that receives Usher's webhooks (Node, the standardwebhooks package)
import { Webhook } from 'standardwebhooks'

const wh = new Webhook(process.env.USHER_WEBHOOK_SECRET!) // whsec_…, from Usher Console

export async function POST(request: Request) {
  const body = await request.text() // the raw body: the signature covers it byte for byte
  let event: { type: string; timestamp: string; data: Record<string, unknown> }
  try {
    event = wh.verify(body, Object.fromEntries(request.headers)) as typeof event
  } catch {
    return new Response('bad signature', { status: 400 })
  }
  // webhook-id is the same on every attempt: skip one you have handled already
  if (await alreadyHandled(request.headers.get('webhook-id')!)) return new Response(null, { status: 204 })
  await queue(event) // answer quickly; do the work afterwards
  return new Response(null, { status: 204 })
}
  • 15 ସେକେଣ୍ଡ ଭିତରେ ଉତ୍ତର ଦିଅନ୍ତୁ, ଯେକୌଣସି 2xx ସହ। ଅନ୍ୟ ସବୁକିଛି, ରିଡାଇରେକ୍ଟ ସମେତ, ବିଫଳତା ଭାବେ ଗଣାଯାଏ।
  • ପୁନରାବୃତ୍ତି ଆଶା କରନ୍ତୁ। ଏକ ମେସେଜ ପ୍ରତ୍ୟେକ ଚେଷ୍ଟାରେ ନିଜ webhook-id ରଖେ; ଆପଣ ପୂର୍ବରୁ ସମ୍ଭାଳିଥିବା ମେସେଜ ଛାଡ଼ିଦିଅନ୍ତୁ।
  • କ୍ରମ ଉପରେ ନିର୍ଭର କରନ୍ତୁ ନାହିଁ। ପୁନଃଚେଷ୍ଟା ନୂଆ ଇଭେଣ୍ଟ ପରେ ପହଞ୍ଚିପାରେ।

ଆପଣଙ୍କ ସର୍ଭର ଉତ୍ତର ନଦେଲେ

Usher 5 ସେକେଣ୍ଡ, 5 ମିନିଟ, 30 ମିନିଟ, 2 ଘଣ୍ଟା, 5 ଘଣ୍ଟା, 10 ଘଣ୍ଟା ଓ 10 ଘଣ୍ଟା ପରେ ପୁଣି ଚେଷ୍ଟା କରେ (ମୋଟ ପ୍ରାୟ ଦେଢ଼ ଦିନ), ତାପରେ ଛାଡ଼ିଦିଏ। Consoleର ଡେଲିଭରି ଲଗ ପ୍ରତ୍ୟେକ ମେସେଜର ଚେଷ୍ଟା ଓ ଆପଣଙ୍କ ସର୍ଭରର ଶେଷ ଉତ୍ତର ଦେଖାଏ, ଏବଂ ପୁଣି ପଠାନ୍ତୁ ଏକ ଡେଲିଭରି ନୂଆ କରି ଆରମ୍ଭ କରେ।

ଏକ ନୂଆ ସିକ୍ରେଟ

Consoleରେ ନୂଆ ସିକ୍ରେଟ ଆଉ ଏକ ସିକ୍ରେଟ ତିଆରି କରେ ଏବଂ ଥରେ ଦେଖାଏ। ପରବର୍ତ୍ତୀ 24 ଘଣ୍ଟା ପାଇଁ ପ୍ରତ୍ୟେକ ଡେଲିଭରିରେ ଦୁଇଟି ସିଗ୍ନେଚର ଥାଏ, ପ୍ରତି ସିକ୍ରେଟ ପାଇଁ ଗୋଟିଏ, ତେଣୁ କିଛି ନହରାଇ ଆପଣ ନୂଆ ସିକ୍ରେଟ ଡିପ୍ଲୟ କରିପାରିବେ। ତା’ପରେ କେବଳ ନୂଆଟି ସାଇନ କରେ।

ଡେଲିଭରି କେଉଁଠାରୁ ଆସେ

ୱେବହୁକ Usherର ଇଗ୍ରେସ ପ୍ରକ୍ସି ଦେଇ ବାହାରେ, ଯାହା ପ୍ରାଇଭେଟ କିମ୍ବା ଆଭ୍ୟନ୍ତରୀଣ ଠିକଣାକୁ ସଂଯୋଗ କରେ ନାହିଁ। ଏକ ଏଣ୍ଡପଏଣ୍ଟ ପବ୍ଲିକ ନାମରେ ଏକ https:// ଠିକଣା ହେବା ଦରକାର: IP ଠିକଣା, ପ୍ରାଇଭେଟ ନାମ, କିମ୍ବା Usherର ନିଜ ଡୋମେନରେ ଥିବା ଠିକଣା ନୁହେଁ।