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

# Kanal Yetkilendirme

> POST /api/broadcasting/auth — private kanallara abone olmadan önce yetkilendirme imzası alın.

Flextell'in tüm realtime kanalları **private** kanallardır. Bir istemci WebSocket üzerinden `chat-log.{tenantId}` kanalına abone olmak istediğinde, Pusher önce `/api/broadcasting/auth` endpoint'ine bir istek atar ve yetkilendirme imzası bekler.

<Note>
  Normal şartlarda bu endpoint'i **elle çağırmanıza gerek yoktur**. pusher-js (veya uyumlu bir Pusher istemcisi) abonelik akışının bir parçası olarak otomatik çağırır. Kendi WebSocket kütüphanenizi yazıyorsanız bu sayfa detayları verir.
</Note>

## Endpoint

```http theme={null}
POST /api/broadcasting/auth
Authorization: Bearer $TOKEN
Content-Type: application/x-www-form-urlencoded
```

### İstek gövdesi

Pusher protokolü şu iki alanı gönderir:

<ParamField body="socket_id" type="string" required>
  İstemci WebSocket bağlantısının benzersiz kimliği. pusher-js bunu otomatik üretir ve gönderir.
</ParamField>

<ParamField body="channel_name" type="string" required>
  Abone olunmak istenen kanalın adı. Private kanallarda `private-` önek'i ile başlar. Örn. `private-chat-log.12`.
</ParamField>

### Başarılı yanıt

```json theme={null}
{
  "auth": "<pusher_app_key>:<hmac_sha256_signature>",
  "channel_data": null
}
```

Pusher istemcisi bu imzayı alır, WebSocket üzerinden Pusher'a iletir ve Pusher kanalı açar.

<Warning>
  Bu endpoint'in yanıtını kendi uygulamanızda saklamayın veya başka bir kullanıcıyla paylaşmayın — imza yalnızca ilgili `socket_id` için geçerlidir ve kısa ömürlüdür.
</Warning>

## Kimlik doğrulama

* **Bearer token zorunludur.** Token yok veya geçersizse `401 Unauthorized` döner.
* **X-Tenant header'ı gerekmez.** Tenant kontrolü, kanal adının içindeki `{tenantId}` üzerinden yapılır. Flextell, abone olmak istediğiniz tenant'a erişiminiz olup olmadığını otomatik doğrular.

### Olası hatalar

| Durum                                  | Sonuç                                      |
| -------------------------------------- | ------------------------------------------ |
| Token yok/geçersiz                     | `401 Unauthorized`                         |
| Kanal `chat-log.<id>` formatında değil | `403 Forbidden` (tanımsız kanala abonelik) |
| Kullanıcı o tenant'a erişemiyor        | `403 Forbidden`                            |
| Tenant bulunamıyor                     | `403 Forbidden`                            |

403 aldığınızda istemciye "bu tenant'a erişiminiz yok" gibi açıklayıcı bir mesaj göstermek iyi bir pratiktir — Pusher tarafında `subscription_error` callback'i ile yakalayabilirsiniz.

## pusher-js ile otomatik yetkilendirme

pusher-js kullandığınızda `auth.headers` ayarı sayesinde Bearer token her auth çağrısına otomatik eklenir:

```js theme={null}
import Pusher from "pusher-js";

const pusher = new Pusher("YOUR_PUSHER_APP_KEY", {
  cluster: "eu",
  forceTLS: true,
  authEndpoint: "https://dev.flextell.ai/api/broadcasting/auth",
  auth: {
    headers: {
      Authorization: `Bearer ${accessToken}`,
    },
  },
});

// Abonelik:
const channel = pusher.subscribe(`private-chat-log.${tenantId}`);

channel.bind("App\\Events\\ChatLogCreated", (event) => {
  console.log("Yeni mesaj:", event);
});
```

pusher-js, abonelik sırasında `authEndpoint`'e çağrı atar ve alınan imzayla kanalı açar.

## Backend-tarafı (server-side) abone olma

Sunucudan sunucuya dinleme yapmak istiyorsanız (ör. bir entegrasyon servisi) Pusher'ın sunucu SDK'larından birini kullanabilir ve kanala `/broadcasting/auth` üzerinden abone olabilirsiniz. Bu tarz kullanımlarda genellikle sürekli bir WebSocket bağlantısı yerine [webhook](/integrations/overview) veya doğrudan REST poll önerilir.

## Token yenileme ile etkileşim

Access token'ınızın süresi dolduğunda mevcut WebSocket bağlantısı çalışmaya devam eder; ancak yeni bir kanala abone olmaya çalışırsanız `/broadcasting/auth` isteği `401` döner. Bu durumda:

1. [Refresh Token](/authentication/refresh-tokens) akışıyla yeni bir access token alın.
2. Pusher istemcinizin `auth.headers.Authorization` değerini güncelleyin.
3. Gerekirse yeniden bağlanın (`pusher.disconnect()` + yeni `new Pusher(...)` örneği).

<Warning>
  Uzun süre açık kalan sayfalarda (ör. canlı destek paneli) token süresi dolduğunda otomatik refresh mantığı şarttır. Aksi halde kullanıcı fark etmeden realtime akışı "sessiz" olarak kesilebilir.
</Warning>
