Web uygulamasında müşteri girişi¶
Bu sayfa, sitenize "Kuveyt Türk ile bağlan" düğmesi eklemeyi anlatır. Depodaki
examples/web_app klasöründe aynı akışı uygulayan, çalışır durumda bir Flask uygulaması vardır.
Akış¶
sequenceDiagram
participant Tarayıcı
participant Uygulama as Sizin uygulamanız
participant Banka as Kuveyt Türk
Tarayıcı->>Uygulama: GET /login
Uygulama-->>Tarayıcı: Bankaya yönlendir (state ile)
Tarayıcı->>Banka: Giriş + izin
Banka-->>Tarayıcı: Redirect URI'ye yönlendir (code, state)
Tarayıcı->>Uygulama: GET /callback?code=...&state=...
Uygulama->>Banka: code -> token (sunucudan sunucuya)
Uygulama-->>Tarayıcı: Hesaplar sayfası
Kod¶
import secrets
from flask import Flask, redirect, request, session, url_for
from kuveytturk_api import AuthenticationError, AuthorizationRequiredError, KuveytTurk
kt = KuveytTurk.from_env(".env", token_store=veritabani_token_deposu)
app = Flask(__name__)
app.secret_key = "..." # sabit ve gizli olmalı
def ziyaretci() -> str:
# Kendi üyelik sisteminiz varsa burada kullanıcı kimliğini kullanın.
session.setdefault("ziyaretci", secrets.token_urlsafe(16))
return session["ziyaretci"]
@app.get("/login")
def login():
session["oauth_state"] = kt.auth.new_state()
return redirect(kt.auth.authorization_url(["accounts", "offline_access"],
state=session["oauth_state"]))
@app.get("/callback")
def callback():
try:
code = kt.auth.parse_callback(request.url, state=session.pop("oauth_state", None))
kt.auth.exchange_code(code, user=ziyaretci())
except AuthenticationError as hata: # izin reddedildi, state uyuşmadı, kod geçersiz
return f"Bağlanılamadı: {hata}", 400
return redirect(url_for("hesaplar"))
@app.get("/hesaplar")
def hesaplar():
try:
yanit = kt.as_user(ziyaretci()).tpp_accounts.account_list_v2()
except AuthorizationRequiredError: # token yok ya da refresh token'ın süresi doldu
return redirect(url_for("login"))
return {"hesaplar": yanit["accountList"]}
Callback rotasının yolu, portaldaki Redirect URI ile birebir aynı olmalıdır.
Güvenlik kontrol listesi¶
-
stateher girişte yeniden üretilir, oturumda saklanır ve callback'te doğrulanır; kullanıldıktan sonra silinir. - Token'lar sunucuda saklanır; tarayıcıya (çereze, sayfaya, URL'ye) asla gitmez. Çerezde yalnızca ziyaretçiyi tanıyan rastgele bir anahtar durur.
- Her müşterinin token'ı kendi anahtarıyla saklanır ve
kt.as_user(...)ile kullanılır. - Çıkış (
logout)POSTile yapılır ve token'ı depodan siler. - Canlıda Redirect URI
https://olur, oturum çereziSecureveHttpOnlyişaretlenir. - Birden çok süreç ya da sunucu varsa token'lar ortak bir depoda (veritabanı, Redis) ve şifreli tutulur. Refresh token her yenilemede değiştiği için depoya yazma güvenilir olmalıdır.
Örneği çalıştırmak¶
Uygulama, .env içindeki KUVEYTTURK_REDIRECT_URI adresinin portunda açılır
(ör. http://localhost:8000/).