> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raptora.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Хүсэлтийн гарын үсэг

> Танай API руу ирсэн хүсэлт Raptora-аас ирснийг шалгах.

Гарын үсэг асаахад Raptora хэрэгслийн хүсэлт бүрт `X-Raptora-Signature` header нэмнэ. Сервер тань нууц түлхүүрээр уг header-ийг шалгаж, бусдын илгээсэн хүсэлтийг татгалзана.

```mermaid theme={null}
sequenceDiagram
  participant R as Raptora
  participant S as Танай сервер
  R->>S: Хүсэлт + X-Raptora-Signature
  S->>S: Түлхүүрээр гарын үсэг тооцоолж харьцуулах
  alt Таарсан
    S-->>R: 200 хариу
  else Таараагүй эсвэл 5 минутаас хуучин
    S-->>R: 401
  end
```

## Асаах

**1. Цонх нээх**

**Хэрэгсэл** хуудасны жагсаалтын дээрх **Хүсэлтийн гарын үсэг** товчийг дарна.

**2. Түлхүүр үүсгэх**

**Түлхүүр үүсгэх** дараад түлхүүрээ хуулж серверийнхээ орчны хувьсагчид хадгална. Түлхүүр `rts_`-ээр эхэлнэ.

**3. Сервер дээрээ шалгах**

Доорх кодоор хүсэлт бүрийг шалгана. Нэг түлхүүр бүх хэрэгсэлд үйлчилнэ.

## Header-ийн бүтэц

```text theme={null}
X-Raptora-Signature: t=1760000000,v1=<hex>
```

| Хэсэг | Утга |
| - | - |
| `t` | Хүсэлт илгээсэн хугацаа, Unix секундээр |
| `v1` | `t.METHOD.path?query.body` мөрийн HMAC-SHA256 гарын үсэг |

## Шалгах код

```js Node.js theme={null}
import { createHmac, timingSafeEqual } from "node:crypto";

// X-Raptora-Signature: t=1760000000,v1=<hex>[,v1=<hex>]
export const fromRaptora = (secret, header, method, pathWithQuery, body = "") => {
  const parts = header.split(",").map((part) => part.split("="));
  const t = Number(parts.find(([key]) => key === "t")?.[1]);
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false;

  const expected = createHmac("sha256", secret)
    .update(`${t}.${method}.${pathWithQuery}.${body}`)
    .digest("hex");

  return parts.some(
    ([key, value]) =>
      key === "v1" &&
      value.length === expected.length &&
      timingSafeEqual(Buffer.from(value), Buffer.from(expected)),
  );
};
```

> [!WARNING]
>
> 5 минутаас хуучин `t`-тэй хүсэлтийг бүү хүлээж ав. Дахин илгээсэн хуучин хүсэлтээс хамгаална.

## Түлхүүр шинэчлэх

**Шинэчлэх** дарахад шинэ түлхүүр үүснэ. Хуучин түлхүүр 24 цаг хүчинтэй хэвээр байх тул энэ хугацаанд header-т хоёр `v1` ирнэ. Серверээ шинэ түлхүүрт шилжүүлэхэд хангалттай хугацаа.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.