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

# Маркетплейс

> Публикуйте приложения, чтобы другие пространства могли их обнаруживать и устанавливать.

# Маркетплейс

Публикация приложения на маркетплейсе делает его доступным для обнаружения и установки другими пространствами Kazzle.

## Что делает публикация

Публикация делает приложение устанавливаемым другими пространствами. Люди видят имя приложения, подзаголовок, значок, издателя и видимость, а затем устанавливают его в своё пространство. Для публикации требуется `subtitle` в `kazzle.config.ts` — однострочный слоган под названием приложения.

Опубликованная версия использует последний коммит в `main`. Для опубликованных приложений нет отдельной ветки релиза.

Определение приложения явно выбирает, открывает ли клик на установленное приложение компонент, открывает встроенный или внешний URL или не имеет поверхности запуска. Приложения также могут требовать идентификацию Kazzle перед открытием или получать вебхуки жизненного цикла.

Инструкции по публикации приложения см. в разделе [Публикуйте своё приложение](/apps/build-and-publish).

## Установки

Когда кто-то устанавливает опубликованное приложение, Kazzle создаёт запись об установке в их пространстве. Пространство, выполняющее установку, владеет установкой и всеми связанными с ней данными.

## Идентификация пользователя

Когда авторизованный пользователь Kazzle открывает установленное приложение, Kazzle предоставляет приложению информацию о текущем пользователе.

Kazzle прикрепляет недолговечный JWT как токен-носитель. Приложение может проверить токен по открытому JWKS Kazzle, чтобы прочитать пользователя, пространство и установку.

Токен содержит эти утверждения:

| Утверждение | Значение                                          |
| ----------- | ------------------------------------------------- |
| `aud`       | `kazzle:app`                                      |
| `iss`       | `https://api.kazzle.app`                          |
| `sub`       | ID пользователя Kazzle                            |
| `user`      | `{ id, email }` пользователя                      |
| `space`     | ID пространства, в котором установлено приложение |
| `install`   | ID этой конкретной установки                      |

Пример проверки:

```ts theme={"theme":"material-theme-darker"}
import { jwtVerify, createRemoteJWKSet } from 'jose';

const JWKS = createRemoteJWKSet(new URL('https://api.kazzle.app/auth/.well-known/jwks.json'));

async function getUserFromToken(token: string) {
  const { payload } = await jwtVerify(token, JWKS, {
    audience: 'kazzle:app',
    issuer: 'https://api.kazzle.app',
  });
  return payload;
}
```

Определение приложения управляет поведением запуска для опубликованных приложений:

* `launch`: выбирает `none`, именованный компонент приложения или URL с явной встроенной или внешней целью.
* `kazzleAuth`: `required` означает, что только авторизованные пользователи Kazzle могут открыть приложение; `optional` позволяет открыть приложение без идентификации Kazzle.

## Вебхуки

Если определение приложения включает `webhookUrl`, Kazzle отправляет HTTP POST запросы на него при установке или удалении приложения.

`app.installed` включает ключ установки, который бэкенд издателя может использовать для аутентификации к API для каждой установки:

```json theme={"theme":"material-theme-darker"}
{
  "event": "app.installed",
  "installId": "...",
  "appId": "...",
  "spaceId": "...",
  "apiUrl": "https://api.kazzle.app",
  "installKey": "kzl_inst_...",
  "user": { "id": "...", "email": "..." }
}
```

`app.uninstalled` содержит событие, ID установки, ID приложения, ID пространства и URL API. Издатель должен прекратить использование ключа установки после получения этого события.

## API для каждой установки

Каждая установка может вызывать ограниченный API на `https://api.kazzle.app`. Вызовы аутентифицируются либо ключом установки (из бэкенда издателя), либо токеном идентификации пользователя (из размещённого интерфейса). Все операции автоматически ограничены этой установкой.

Доступные конечные точки:

Полные схемы запросов и ответов опубликованы в спецификации OpenAPI Kazzle по адресу `https://api.kazzle.app/openapi.json` в этих путях.

| Метод  | Путь                  | Описание                                        |
| ------ | --------------------- | ----------------------------------------------- |
| GET    | `/apps/secrets`       | Список имён секретов, сохранённых для установки |
| GET    | `/apps/secrets/:name` | Прочитать значение секрета                      |
| PUT    | `/apps/secrets/:name` | Сохранить значение секрета                      |
| DELETE | `/apps/secrets/:name` | Удалить секрет                                  |
| GET    | `/apps/metadata`      | Прочитать несекретные метаданные для установки  |
| PUT    | `/apps/metadata`      | Объединить обновления в метаданные установки    |

Секреты, записанные через этот API, зашифрованы в покое и изолированы для конкретной установки. Они отделены от секретов, хранящихся в хранилище пространства.

## Следующие шаги

* [Публикуйте своё приложение](/apps/build-and-publish) — как опубликовать приложение и что происходит после.
