12 — Güvenli Çıkış (Logout) ve Token İptali
Kimin için: Kullanıcı oturumlarını sonlandıran ve token iptali yapan geliştiriciler.
Ön koşul: Oturum Yönetimi.
Tahmini süre: 10 dakika.
Ne Öğreneceksiniz
- Yerel Çıkış (Local Logout) ile Merkezi Çıkış (Single Logout) farkını,
- OIDC RP-Initiated Logout uç noktasını (
/oauth/logout) kullanmayı, - İptal uç noktası (
/oauth/revoke) ile Refresh Token'ı geçersiz kılmayı.
Çıkış Seviyeleri
- Yerel Çıkış (Local Logout):
Uygulamanız yalnızca kendi çerezlerini veya yerel oturumunu temizler. Kullanıcı TALOST ID ana platformunda ve diğer bağlı uygulamalarda oturum açmış kalmaya devam eder. - Merkezi Çıkış (RP-Initiated Single Logout):
Kullanıcı uygulamanızdan çıkış yaptığında TALOST ID oturumunu da kapatmak isterse, tarayıcı TALOST ID çıkış ucuna yönlendirilir.
Merkezi Çıkış Akışı (`GET /oauth/logout`)
Kullanıcı "Çıkış Yap" butonuna bastığında tarayıcı aşağıdaki adrese yönlendirilir:
- Uç Nokta:
GET {{ISSUER}}/oauth/logout - Parametreler:
id_token_hint: Kullanıcının giriş anında aldığıid_tokendeğeri (Kullanıcı teyidi sormadan doğrudan yönlendirme için tavsiye edilir).post_logout_redirect_uri: Çıkış tamamlandıktan sonra kullanıcının geri döneceği adres (İstemci ayarlarında Post Logout Redirect URIs listesinde kayıtlı olmalıdır).state: Geri dönüşte kontrol edilecek rastgele dize.
Token İptali (`POST /oauth/revoke`)
Kullanıcı cihazından çıkış yaptığında veya oturum kapatıldığında, saklanan refresh_token veya access_token derhal iptal edilmelidir:
typescript
// revoke.ts
export async function revokeToken(token: string, typeHint: "access_token" | "refresh_token" = "refresh_token") {
await fetch(`${process.env.TALOST_ISSUER}/oauth/revoke`, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
client_id: process.env.TALOST_CLIENT_ID!,
client_secret: process.env.TALOST_CLIENT_SECRET!,
token: token,
token_type_hint: typeHint,
}),
});
}
Back-Channel Oturum İptali
Planlanıyor
OIDC Back-Channel Logout standardı (sunucudan sunucuya oturum sonlandırma sinyali) yol haritasındadır. Güncel sistemde merkezi oturum sonlandırmaları ve şifre sıfırlamaları için [Webhook (09)](09-webhooklar.md) altındaki **`session.revoked`** olayı tetiklenmektedir. Bu olayı dinleyerek kullanıcının yerel oturumunu veritabanınızdan geçersiz kılabilirsiniz.
OIDC Back-Channel Logout standardı (sunucudan sunucuya oturum sonlandırma sinyali) yol haritasındadır. Güncel sistemde merkezi oturum sonlandırmaları ve şifre sıfırlamaları için [Webhook (09)](09-webhooklar.md) altındaki **`session.revoked`** olayı tetiklenmektedir. Bu olayı dinleyerek kullanıcının yerel oturumunu veritabanınızdan geçersiz kılabilirsiniz.
Kod Örneği: Next.js Çıkış Rotası
typescript
// app/api/auth/logout/route.ts
import { NextResponse } from "next/server";
import { cookies } from "next/headers";
export async function GET() {
const cookieStore = await cookies();
const idToken = cookieStore.get("id_token")?.value;
const refreshToken = cookieStore.get("refresh_token")?.value;
// 1. Refresh Token'ı arka planda iptal et
if (refreshToken) {
try {
await fetch(`${process.env.TALOST_ISSUER}/oauth/revoke`, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
client_id: process.env.TALOST_CLIENT_ID!,
client_secret: process.env.TALOST_CLIENT_SECRET!,
token: refreshToken,
token_type_hint: "refresh_token",
}),
});
} catch (e) {
console.error("Token revoke hatası:", e);
}
}
// 2. Yerel çerezleri temizle
cookieStore.delete("session_user");
cookieStore.delete("id_token");
cookieStore.delete("refresh_token");
// 3. TALOST ID Logout uç noktasına yönlendir
const logoutUrl = new URL(`${process.env.TALOST_ISSUER}/oauth/logout`);
if (idToken) logoutUrl.searchParams.set("id_token_hint", idToken);
logoutUrl.searchParams.set("post_logout_redirect_uri", `${process.env.APP_URL}/login`);
return NextResponse.redirect(logoutUrl.toString());
}
Güvenlik Notları
post_logout_redirect_uriparametresi Geliştirici Portalında kayıtlı olan adreslerden biri olmalıdır; aksi halde açık yönlendirme (Open Redirect) açığını önlemek için yönlendirme yapılmaz.
İlgili Sayfalar
Son doğrulama: 2026-10-04 · Kaynak: _envanter.md, src/app/oauth/logout/route.ts, src/app/oauth/revoke/route.ts
Son doğrulama: 2026-10-04 · Kaynak: `_envanter.md`, `src/app/oauth/logout/route.ts`, `src/app/oauth/revoke/route.ts`