Skip to content

Commit a164833

Browse files
committed
feat: update docs for @gramio/init-data
1 parent 365ca97 commit a164833

File tree

3 files changed

+198
-39
lines changed

3 files changed

+198
-39
lines changed

.cursor/rules/translation-sync.mdc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ alwaysApply: true
1313
- Exclude double translation (do not translate docs/ru/ back into docs/ru/).
1414
- You can check updates via `Recent changes`
1515
- Correct grammatical punctuation and other errors in both: original and other language modified files.
16+
- Please dont delete `// ^?` it used internally
1617

1718
Examples:
1819
- docs/plugins/official/scenes.md <=> docs/ru/plugins/official/scenes.md

docs/ru/tma/init-data.md

Lines changed: 86 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,16 @@ head:
1313

1414
# Валидация WebAppInitData
1515

16-
Библиотека `@gramio/init-data` позволяет проверять подлинность данных, передаваемых из Telegram Mini Apps на ваш сервер, обеспечивая безопасное взаимодействие между веб-приложением и ботом.
16+
`@gramio/init-data` — это библиотека на TypeScript для безопасной проверки, разбора и генерации строк инициализации (init data) Telegram Web App. Она предоставляет набор утилит для работы с init data Telegram Mini App, обеспечивая целостность и подлинность пользовательских данных, передаваемых из Telegram-клиента на ваш сервер. Библиотека не зависит от фреймворка.
17+
18+
Основные возможности:
19+
20+
- Проверка подлинности init data Telegram Web App с помощью токена бота
21+
- Разбор и получение структурированных данных пользователя и чата из строки init data
22+
- Генерация валидных строк init data для тестирования и документации
23+
- Строгие типы TypeScript для всех структур и методов
24+
25+
[Документация и справочник](https://jsr.io/@gramio/init-data@latest/doc)
1726

1827
## Установка
1928

@@ -32,70 +41,114 @@ pnpm add @gramio/init-data
3241
```
3342

3443
```bash [bun]
35-
bun add @gramio/init-data
44+
bun install @gramio/init-data
3645
```
3746

3847
:::
3948

40-
### validateAndParseInitData
49+
# getBotTokenSecretKey
50+
51+
Получает секретный ключ из токена вашего Telegram-бота. Этот ключ необходим для проверки хэша строки init data, отправленной из Telegram Web App. Всегда используйте этот метод для генерации ключа перед валидацией или подписью init data, если хотите максимальную производительность. Если не передавать ключ в методы проверки, он будет вычисляться **при каждом вызове**.
52+
53+
```ts
54+
import { getBotTokenSecretKey } from "@gramio/init-data";
55+
56+
const botToken = process.env.BOT_TOKEN as string;
57+
const secretKey = getBotTokenSecretKey(botToken);
58+
// используйте secretKey далее
59+
```
60+
61+
# validateAndParseInitData
62+
63+
Проверяет подлинность строки init data Telegram Web App с помощью секретного ключа или токена бота. Если данные валидны, возвращает объект [WebAppInitData](https://core.telegram.org/bots/webapps#webappinitdata). Если данные некорректны — возвращает `false`.
4164

4265
```ts
43-
import { validateAndParseInitData } from "@gramio/init-data";
66+
import {
67+
validateAndParseInitData,
68+
getBotTokenSecretKey,
69+
} from "@gramio/init-data";
4470

45-
const initData = validateAndParseInitData(initDataString, "BOT_TOKEN");
71+
const botToken = process.env.BOT_TOKEN as string;
72+
const secretKey = getBotTokenSecretKey(botToken);
4673

47-
if (!initData) {
48-
throw new Error("Invalid init data");
74+
const initData = req.headers["x-init-data"] as string;
75+
const result = validateAndParseInitData(initData, secretKey);
76+
77+
if (!result) {
78+
// Данные невалидны или подделаны
4979
}
5080

51-
console.log(initData.user);
81+
// Доступ к данным пользователя и чата
82+
const userId = result.user?.id;
83+
const chatId = result.chat?.id;
5284
```
5385

54-
## Проверка init-data
86+
# validateInitData
87+
88+
Проверяет подлинность строки init data Telegram Web App с помощью секретного ключа или токена бота. Возвращает `true`, если данные валидны, иначе — `false`. Этот метод только проверяет данные и **не разбирает** их. Используйте, если нужно только проверить подлинность без извлечения информации о пользователе или чате.
5589

5690
```ts
57-
import { validateInitData } from "@gramio/init-data";
91+
import { validateInitData, getBotTokenSecretKey } from "@gramio/init-data";
5892

59-
// Получаем init-data из запроса
60-
const initDataString = req.query.initData;
93+
const botToken = process.env.BOT_TOKEN as string;
94+
const secretKey = getBotTokenSecretKey(botToken);
6195

62-
// Валидируем с использованием токена бота
63-
const isValid = validateInitData(initDataString, "BOT_TOKEN");
96+
const initData = req.headers["x-init-data"] as string;
97+
const isValid = validateInitData(initData, secretKey);
6498

65-
if (isValid) {
66-
// Данные действительно пришли из Telegram
67-
console.log("Данные прошли проверку");
68-
} else {
69-
// Данные не прошли проверку или были подделаны
70-
console.log("Внимание: Данные не прошли проверку!");
99+
if (!isValid) {
100+
// Данные невалидны или подделаны
71101
}
102+
// Если true — строке init data можно доверять
72103
```
73104

74-
## Получение данных пользователя
105+
# parseInitData
106+
107+
Разбирает строку init data Telegram Web App и возвращает объект [WebAppInitData](https://core.telegram.org/bots/webapps#webappinitdata). Этот метод **не выполняет проверку** подлинности или целостности — используйте его только после проверки через `validateInitData` или `validateAndParseInitData`.
75108

76109
```ts
77110
import { parseInitData } from "@gramio/init-data";
78111

79-
// Разбор строки init-data
80-
const initData = parseInitData(initDataString);
112+
const initData = req.headers["x-init-data"] as string;
113+
const parsed = parseInitData(initData);
81114

82-
// Теперь можно получить доступ к данным
83-
console.log(initData.user); // Информация о пользователе
84-
console.log(initData.auth_date); // Дата аутентификации
85-
console.log(initData.hash); // Хэш для проверки
115+
// Доступ к данным пользователя и чата
116+
const userId = parsed.user?.id;
117+
const chatId = parsed.chat?.id;
86118
```
87119

88-
## Безопасность
120+
# signInitData
89121

90-
Всегда проверяйте данные init-data перед использованием, чтобы гарантировать, что запрос действительно поступил из Telegram и данные не были подделаны.
122+
Генерирует валидную строку init data из объекта данных и секретного ключа или токена бота. Полезно для тестирования, документации или генерации примеров для клиентов API.
91123

92-
## Пример интеграции с Elysia
124+
```ts
125+
import {
126+
signInitData,
127+
getBotTokenSecretKey,
128+
type WebAppUser,
129+
} from "@gramio/init-data";
130+
131+
const botToken = process.env.BOT_TOKEN as string;
132+
const secretKey = getBotTokenSecretKey(botToken);
133+
134+
const data = {
135+
user: {
136+
id: 1,
137+
first_name: "durov",
138+
username: "durov",
139+
},
140+
} satisfies WebAppUser;
93141

94-
Этот пример демонстрирует, как интегрировать `@gramio/init-data` с Elysia с помощью удобного плагина с типо-безопасностью.
142+
const signedInitData = signInitData(data, secretKey);
143+
// Используйте signedInitData как валидную строку init data для тестов
144+
```
145+
146+
# Пример: интеграция с Elysia
95147

96-
`examples` в `x-init-data` заголовке являются валидными сгенерированными `init-data`, которые позволяют легче тестировать ваш API в OpenAPI клиентах.
148+
Вы можете использовать `@gramio/init-data` с любым backend-фреймворком. Ниже — бонус: пример интеграции с Elysia для типобезопасной аутентификации.
97149

98-
```ts twoslash
150+
```ts
151+
twoslash;
99152
import {
100153
validateAndParseInitData,
101154
signInitData,

docs/tma/init-data.md

Lines changed: 111 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
# Init data
22

3-
WIP
3+
`@gramio/init-data` is a TypeScript library for securely validating, parsing, and generating Telegram Web App init data strings. It provides a set of utilities to help you work with the Telegram Mini App authentication init data, ensuring the integrity and authenticity of user data passed from the Telegram client to your backend. The library is framework-agnostic.
4+
5+
Key features:
6+
7+
- Validates the authenticity of Telegram Web App init data using your bot token
8+
- Parses and exposes structured user and chat data from the init data string
9+
- Generates valid init data strings for testing and documentation
10+
- Provides strong TypeScript types for all data structures and methods
11+
12+
[Reference](https://jsr.io/@gramio/[email protected]/doc)
413

514
### Installation
615

@@ -24,13 +33,109 @@ bun install @gramio/init-data
2433

2534
:::
2635

27-
## Elysia integration example
36+
# getBotTokenSecretKey
37+
38+
Get a secret key from your Telegram bot token. This secret key is required to validate the hash of the init data string sent by the Telegram Web App. Always use this method to generate the secret key before validating or signing init data if you wants reach maximum performance. If you don't provide it to validate init data methods it will execute it on **every call**.
39+
40+
```ts
41+
import { getBotTokenSecretKey } from "@gramio/init-data";
42+
43+
const botToken = process.env.BOT_TOKEN as string;
44+
const secretKey = getBotTokenSecretKey(botToken);
45+
// use it later
46+
```
47+
48+
# validateAndParseInitData
49+
50+
Verifies the authenticity of the Telegram Web App init data string using the secret key or bot token. If the data is valid, it parses and returns the [WebAppInitData](https://core.telegram.org/bots/webapps#webappinitdata) object. If the data is invalid, it returns `false`.
51+
52+
```ts
53+
import {
54+
validateAndParseInitData,
55+
getBotTokenSecretKey,
56+
} from "@gramio/init-data";
57+
58+
const botToken = process.env.BOT_TOKEN as string;
59+
const secretKey = getBotTokenSecretKey(botToken);
60+
61+
const initData = req.headers["x-init-data"] as string;
62+
const result = validateAndParseInitData(initData, secretKey);
63+
64+
if (!result) {
65+
// Handle invalid or tampered data
66+
}
67+
68+
// Access user and chat data
69+
const userId = result.user?.id;
70+
const chatId = result.chat?.id;
71+
```
72+
73+
# validateInitData
74+
75+
Checks the authenticity of the Telegram Web App init data string using the secret key or bot token. Returns `true` if the data is valid, otherwise returns `false`. This method only validates the data and does **not parse** it. Use this when you only need to check authenticity without extracting user or chat information.
76+
77+
```ts
78+
import { validateInitData, getBotTokenSecretKey } from "@gramio/init-data";
79+
80+
const botToken = process.env.BOT_TOKEN as string;
81+
const secretKey = getBotTokenSecretKey(botToken);
82+
83+
const initData = req.headers["x-init-data"] as string;
84+
const isValid = validateInitData(initData, secretKey);
85+
86+
if (!isValid) {
87+
// Handle invalid or tampered data
88+
}
89+
// If valid, you can safely trust the init data string
90+
```
91+
92+
# parseInitData
93+
94+
Parses the Telegram Web App init data string and returns the [WebAppInitData](https://core.telegram.org/bots/webapps#webappinitdata) object. This method does not perform any validation or authenticity checks. Use it only if you have already verified the data with `validateInitData` or `validateAndParseInitData`.
95+
96+
```ts
97+
import { parseInitData } from "@gramio/init-data";
98+
99+
const initData = req.headers["x-init-data"] as string;
100+
const parsed = parseInitData(initData);
101+
102+
// Access user and chat data
103+
const userId = parsed.user?.id;
104+
const chatId = parsed.chat?.id;
105+
```
106+
107+
# signInitData
108+
109+
Generates a valid init data string from a data object and a secret key or bot token. This is useful for testing, documentation, or generating example values for API clients.
110+
111+
```ts
112+
import {
113+
signInitData,
114+
getBotTokenSecretKey,
115+
type WebAppUser,
116+
} from "@gramio/init-data";
117+
118+
const botToken = process.env.BOT_TOKEN as string;
119+
const secretKey = getBotTokenSecretKey(botToken);
120+
121+
const data = {
122+
user: {
123+
id: 1,
124+
first_name: "durov",
125+
username: "durov",
126+
},
127+
} satisfies WebAppUser;
128+
129+
const signedInitData = signInitData(data, secretKey);
130+
// Use signedInitData as a valid init data string for testing
131+
```
28132

29-
This example shows how to integrate `@gramio/init-data` with Elysia via convenient plugin with type safety.
133+
# Example: Elysia integration
30134

31-
`examples` at `x-init-data` header is valid generated init-data which allows you to more easily test your API in OpenAPI Client.
135+
You can use `@gramio/init-data` in any backend framework. Here is a bonus example of integrating it with Elysia for type-safe authentication:
32136

33-
```ts twoslash
137+
```ts
138+
twoslash;
34139
import {
35140
validateAndParseInitData,
36141
signInitData,
@@ -84,6 +189,6 @@ const app = new Elysia()
84189
.use(authElysia)
85190
.get("/user", ({ user }) => {
86191
user;
87-
// ^?
192+
// ^?
88193
});
89194
```

0 commit comments

Comments
 (0)