> ## 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.

# Token İptali

> Kullanıcı çıkış yaptığında veya uygulamanın erişimini sonlandırmanız gerektiğinde access ve refresh token'ları iptal edin.

Token iptali, bir access token veya refresh token'ı **süresi dolmadan önce** geçersiz kılmak için kullanılır. Tipik senaryolar:

* Kullanıcı uygulamanızdan çıkış yaptı
* Kullanıcı cihazını kaybetti ve siz ön taraftan "tüm oturumları sonlandır" tetikliyorsunuz
* Güvenlik olayı nedeniyle kullanıcının tüm token'larını temizliyorsunuz

<Note>
  Bir kullanıcı Flextell panelinden uygulamanıza verdiği yetkiyi geri çekerse, o uygulamaya ait tüm access ve refresh token'lar anında iptal edilir. Bu durumda ek bir istek atmanıza gerek yoktur.
</Note>

## OpenID Connect ile oturum sonlandırma

Kullanıcıyı "Flextell'den çıkış yaptır + bana geri yönlendir" akışıyla logout etmek için **OpenID Connect RP-Initiated Logout 1.0** standardındaki `end_session_endpoint` kullanılır. Flextell'in `end_session_endpoint`'i:

```
https://dev.flextell.ai/oauth/logout
```

Bu URL'i kod tarafında sabitlemek yerine [discovery URL](/authentication/openid-connect#discovery)'den (`end_session_endpoint` alanı) dinamik çekmenizi öneririz.

### İstek

Kullanıcıyı tarayıcı üzerinden aşağıdaki URL'e yönlendirin:

```
GET https://dev.flextell.ai/oauth/logout
  ?id_token_hint=KULLANICININ_ID_TOKENI
  &post_logout_redirect_uri=https%3A%2F%2Fapp.example.com%2Fgoodbye
  &state=RASTGELE
  &client_id=SIZIN_CLIENT_ID
```

<ParamField query="id_token_hint" type="string">
  Daha önce kullanıcıya verilmiş `id_token` değeri. Flextell bu token'ın imzasını RS256 ile doğrular; `sub` (kullanıcı) ve `aud` (`client_id`) claim'lerini çıkarır. **Süresi dolmuş id\_token'lar da kabul edilir** — spec gereğince bu token yalnızca kimlik tespiti için kullanılır, yetkilendirme için değil.
</ParamField>

<ParamField query="post_logout_redirect_uri" type="string">
  Çıkış sonrası kullanıcının yönlendirileceği URL. Uygulamanızın panelinde kayıtlı **Çıkış Sonrası Yönlendirme URI'leri** listesindeki bir değerle **birebir eşleşmelidir**. Eşleşmezse Flextell bu parametreyi yok sayar ve kullanıcıyı kendi onay sayfasına yönlendirir.
</ParamField>

<ParamField query="state" type="string">
  Callback'te `post_logout_redirect_uri`'ye aynen eklenip geri dönen opak değer. CSRF koruması için rastgele üretip dönüşte karşılaştırın.
</ParamField>

<ParamField query="client_id" type="string">
  `id_token_hint` yoksa hangi uygulama için logout olduğunu anlamak için gönderilebilir. `id_token_hint` varken zorunlu değildir.
</ParamField>

### Davranış — first-party vs third-party

Flextell, istekteki `id_token_hint`'in imzasını doğruladıktan sonra hangi client için logout yapıldığını belirler ve iki farklı yol izler:

* **First-party istemci** (Flextell'in kendi uygulamaları): Onay ekranı **gösterilmez**, logout doğrudan yapılır ve kullanıcı (varsa) `post_logout_redirect_uri`'ye yönlendirilir.
* **Third-party istemci** (sizin uygulamanız): Kullanıcıya "Çıkmak istediğinize emin misiniz?" onay ekranı gösterilir. Kullanıcı onayladığında POST ile logout tetiklenir. Bu, kullanıcının haberi olmadan oturumunun kapatılmasını engeller.

### Ne silinir?

Onaylanmış logout tetiklendiğinde Flextell şunları yapar:

1. O kullanıcı + o `client_id` için **tüm aktif access token'ları revoke eder.**
2. Bu access token'lara bağlı **tüm refresh token'ları revoke eder.**
3. Kullanıcının **Flextell web oturumunu** (session cookie ve DB kaydı) tamamen siler.

### Başarılı yönlendirme

```
https://app.example.com/goodbye?state=RASTGELE
```

Eğer `post_logout_redirect_uri` geçersizse / listede yoksa / `id_token_hint` gönderilmediyse Flextell kullanıcıyı kendi "çıkış yapıldı" onay sayfasında tutar.

<Warning>
  `end_session_endpoint` Flextell'deki oturumu kapatır ve **o uygulama + o kullanıcı** için token'ları iptal eder. Kendi veritabanınızda sakladığınız access/refresh token kayıtlarını **siz de temizlemelisiniz** — aksi halde elinizde geçersiz token'lar kalır.
</Warning>

### Post-Logout Redirect URI nasıl kaydedilir?

Panelde **Bağlantılar → Uygulamalar** ekranında uygulamanızı düzenleyin, **Çıkış Sonrası Yönlendirme URI'leri** alanına logout sonrası yönlendirileceğiniz URL'leri ekleyin:

* HTTPS zorunludur; yalnızca `http://localhost` ve `http://127.0.0.1` istisnadır.
* Tam eşleşme zorunludur (query string, trailing slash dahil).
* Birden fazla URL ekleyebilirsiniz (ör. prod ve staging ayrı).
* Native uygulamalar için custom scheme (`myapp://logout-callback`) kabul edilir.

## Kullanıcı uygulamayı panelden kaldırırsa

Kullanıcı panelden **Bağlantılar → Yetkilendirdiğim Uygulamalar** ekranına gidip uygulamanıza verdiği erişimi kaldırırsa:

* O kullanıcıya ait tüm access token'lar anında geçersizleşir
* O kullanıcıya ait tüm refresh token'lar anında iptal edilir
* Uygulamanız bundan sonra o kullanıcı adına yaptığı her API çağrısında `401 Unauthorized` alır
* Yeniden erişim için kullanıcıyı Authorization Code akışından tekrar geçirmelisiniz

## İyi pratik: çıkış sırasında yerel temizlik

Kullanıcı uygulamanızdan çıkış yaptığında, token'ları kendi tarafınızda da temizleyin. Yalnızca cookie silmek yeterli değildir; refresh token'ı veritabanından da kaldırın:

```js theme={null}
async function logout(userId) {
  // 1. Token'ları kendi DB'nizden silin
  await db.oauthTokens.delete({ where: { userId } });

  // 2. Kullanıcıyı OIDC logout akışına gönderin
  const params = new URLSearchParams({
    post_logout_redirect_uri: "https://app.example.com/goodbye",
    state: generateState(),
  });
  return `https://dev.flextell.ai/oauth/logout?${params}`;
}
```

## Client secret sızıntısı

`client_secret` sızdıysa:

1. **Hemen** panelden uygulamanızı silin — mevcut tüm token'lar iptal olur.
2. Yeni bir uygulama oluşturun; yeni `client_id`/`client_secret` alın.
3. Kullanıcılarınızı yeni uygulama ile Authorization Code akışından tekrar geçirin.

Secret'ın sızdığı kullanım süresini mümkün olduğunca kısa tutmak için alarm/monitoring kurmak tavsiye edilir.
