client_secret saklayamayan istemciler için güvenli hale getiren bir uzantıdır. Flextell, PKCE’yi tüm OAuth istemcileri için destekler ve SPA / native mobil uygulamalar için zorunlu kılmanızı öneririz.
Neden PKCE?
Tarayıcıda çalışan bir SPA veya native bir mobil uygulamanın kaynak kodu son kullanıcının cihazında çalışır. Bu ortama gömdüğünüzclient_secret’ı tersine mühendislik ile çıkarmak önemsiz kolaydır. PKCE, secret yerine tek seferlik dinamik bir secret (code_verifier) üreterek bu riski ortadan kaldırır.
Karşıladığı tehdit
Authorization Code interception: Kötü niyetli bir uygulama, hedef uygulamanınredirect_uri şemasını ele geçirirse (özellikle mobilde myapp://callback gibi custom URI’ler), kullanıcının yetkilendirme dönüşünde gelen code’u yakalayıp access token’a değişebilir. PKCE, sadece doğru code_verifier’a sahip istemcinin code’u token’a çevirebilmesini sağlar.
Akış
Adım 1 — code_verifier ve code_challenge üret
code_verifier, 43–128 karakter uzunluğunda kriptografik olarak rastgele üretilmiş bir string’tir. Her yetkilendirme akışı için yeni bir tane üretilmelidir.
code_challenge, code_verifier’ın SHA-256 özetinin base64url (padding’siz) kodlanmış halidir.
JavaScript örneği
Python örneği
Adım 2 — Yetkilendirmeye yönlendir
Standart authorize URL’inecode_challenge ve code_challenge_method=S256 parametrelerini ekleyin:
Ek parametreler
code_verifier’ın SHA-256 özeti, base64url (padding’siz).Her zaman
S256 kullanın. plain metodu destekleniyor olsa da zayıftır — production’da kullanmayın.Adım 3 — Token değişimi (verifier ile)
code’u aldıktan sonra /oauth/token endpoint’ine code_verifier parametresi ile istek atın. client_secret göndermeyin — zaten saklamıyorsunuz:
Başarılı yanıt
openid scope’u talep ettiyseniz id_token da döner. Detay: OpenID Connect.
Hata yanıtları
| HTTP | error | Sebep |
|---|---|---|
| 400 | invalid_request | code_challenge gönderildi ama code_challenge_method eksik (veya tersi). |
| 400 | invalid_grant | code_verifier → SHA-256 → base64url sonucu, saklanan code_challenge ile eşleşmiyor. |
| 400 | invalid_grant | code başka bir istemci için üretilmiş (client_id uyuşmuyor). |
Güvenlik kontrol listesi
- Her akış için yeni
code_verifierüretin. Verifier’ı yeniden kullanmayın. -
S256kullanın;plainproduction’da kabul edilemez. -
code_verifier’ı logging sistemine yazmayın — kısa ömürlü olsa bile. - SPA’da
statevecode_verifier’ısessionStorage’da, callback sayfasında tek seferlik okuyup hemen silin. - Native mobilde güvenli depolama (Keychain / EncryptedSharedPreferences) kullanın.
-
stateparametresini her akışta doğrulayın — PKCE, state kontrolünü ikame etmez.
Confidential client’larda PKCE
Sunucu tabanlı (confidential) istemciler için PKCE zorunlu değildir ama ek katman olarak kullanmakta sakınca yoktur. Hemclient_secret hem code_verifier göndermek kabul edilir.
Hangi kütüphaneler bu akışı hazır yapar?
Çoğu OAuth / OIDC kütüphanesi PKCE’yi otomatik yürütür:- Web:
oidc-client-ts,@auth0/auth0-spa-jsbenzeri generic OIDC client’lar. - Node.js:
openid-client. - iOS: AppAuth-iOS.
- Android: AppAuth-Android.
https://dev.flextell.ai/.well-known/openid-configuration) verip code_challenge_method=S256 ayarını açmanız çoğunlukla yeterlidir.
Sonraki adımlar
OpenID Connect
id_token doğrulama, discovery, userinfo.
Authorization Code
Akışın standart (confidential client) hali.