WEB / WEB-15.S01
PKCE, redirect ve identity binding
Code continuity, callback correlation ve local account binding’i birbirinden ayır.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Normal login
- Callback başlangıcı
Sahne normal callback RP’ye ulaştıktan sonra başlar; pending tx-A ve AS code-A bağları declared fixture’dır.
- Atlas RP
- Callback held; session yok
- AS / OP
- Code-A bound; token yok
- Callback local gate
RP, browser-A ve state-A bağının bekleyen tx-A ile eşleştiğini kabul etti. Güvenilen AS endpoint’ine code-A, kayıtlı redirect ve verifier referansını taşıyan token request’i hazırlar; AS henüz bu request’i almamıştır.
- Atlas RP
- Callback kabul edildi; token request hazır
- AS / OP
- Code-A bound; token yok
- Token request ulaştı
Normal declared TLS token request AS’ye ulaştı; code ve verifier aliases alındı, validation henüz pending’dir.
- Atlas RP
- Callback accepted
- AS / OP
- Request alındı; pending
- AS code/verifier gate
Verilen verifier’ın S256 sonucu code-A challenge’ıyla eşleşir. Client/redirect bağları, unused=true ve now=1050 < expiresAt=1100 koşulları da uygundur; AS token response’unu hazırlar. Bu henüz RP identity kabulü değildir.
- Atlas RP
- Callback accepted
- AS / OP
- Token aliases hazır
- AS response alındı
AS response RP’ye ulaştı; bu arrival identity acceptance veya session creation olarak işaretlenmez.
- Atlas RP
- Response alındı; RP pending
- AS / OP
- Token aliases hazır
- RP response gate
RP normal token response için issuer/audience/expiry/key ve selected nonce gate’ini okur; error response identity oluşturmaz.
- Atlas RP
- Identity accepted; mapping pending
- AS / OP
- Token aliases hazır
- Local mapping policy
Existing iss/sub mapping ile login ve yeni identity’yi existing account’a link etmek iki ayrı local policy kararıdır.
- Atlas RP
- Mapping found
- AS / OP
- Token aliases hazır
- Local sonuç
Normal mapping login session’ı oluşturur; confirmation pending veya önceki deny halinde link/store değişikliği yapılmaz.
- Atlas RP
- Login session created
- AS / OP
- Token aliases hazır
State deny
- Callback başlangıcı
Sahne normal callback RP’ye ulaştıktan sonra başlar; pending tx-A ve AS code-A bağları declared fixture’dır.
- Atlas RP
- Callback held; session yok
- AS / OP
- Code-A bound; token yok
- Callback local gate
RP selected issuer ve browser/state pending bağını kontrol etti; bu adım herhangi bir HTTP transfer oluşturmaz.
- Atlas RP
- State deny; exchange yok
- AS / OP
- Code-A bound; token yok
- Transaction reddedildi
Selected state-B tx-A ile eşleşmedi; RP normal token request’i başlatmadığı için AS state’i değişmez.
- Atlas RP
- No exchange; no ID gate
- AS / OP
- Code-A bound; token yok
- Session oluşmadı
Callback local deny ile tamamlandı; ne token receipt ne de local account linking sonucu üretilir.
- Atlas RP
- No session; no link
- AS / OP
- Code-A bound; token yok
PKCE deny
- Callback başlangıcı
Sahne normal callback RP’ye ulaştıktan sonra başlar; pending tx-A ve AS code-A bağları declared fixture’dır.
- Atlas RP
- Callback held; session yok
- AS / OP
- Code-A bound; token yok
- Callback local gate
RP, browser-A ve state-A bağının bekleyen tx-A ile eşleştiğini kabul etti. Güvenilen AS endpoint’ine code-A, kayıtlı redirect ve verifier referansını taşıyan token request’i hazırlar; AS henüz bu request’i almamıştır.
- Atlas RP
- Callback kabul edildi; token request hazır
- AS / OP
- Code-A bound; token yok
- Token request ulaştı
Normal declared TLS token request AS’ye ulaştı; code ve verifier aliases alındı, validation henüz pending’dir.
- Atlas RP
- Callback accepted
- AS / OP
- Request alındı; pending
- AS code/verifier gate
AS’ye ulaşan verifier’dan hesaplanan S256, code-A’ya bağlı challenge ile eşleşmez. AS invalid_grant sonucunu hazırlar; yeni token alias’ı üretmez. RP henüz bu error response’u almadığı için sonucunu bilmez.
- Atlas RP
- Callback accepted
- AS / OP
- invalid_grant hazır
- AS response alındı
AS response RP’ye ulaştı; bu arrival identity acceptance veya session creation olarak işaretlenmez.
- Atlas RP
- Response alındı; RP pending
- AS / OP
- invalid_grant hazır
- RP response gate
RP, gelen response’un invalid_grant olduğunu işler. Bu bir ID token response’u olmadığı için issuer, audience, signature veya nonce için olumlu validation sonucu oluşmaz; local identity kurulmaz.
- Atlas RP
- Error handled; no identity
- AS / OP
- invalid_grant hazır
- Local mapping policy
Validated identity bulunmadığından RP login mapping’i veya yeni account link’i için kabul işlemi yapmaz. Daha önceki AS ret kararı, burada yeni bir local account mutation’a dönüşmez.
- Atlas RP
- No mapping change
- AS / OP
- invalid_grant hazır
- Local sonuç
Bu dal AS’nin verifier karşılaştırmasında durdu: token üretilmedi, RP identity kabul etmedi. Yeni login session’ı veya account link’i oluşmaz; başka bir mevcut session’ın iptal edildiği sonucu çıkarılmaz.
- Atlas RP
- No session; no link
- AS / OP
- invalid_grant hazır
Link pending
- Callback başlangıcı
Callback RP’ye ulaşmıştır; tx-A ve code-A bağları önceden verilidir. Link istenen local account zaten authenticated durumdadır. Yeni external identity ve account link’i henüz kabul edilmemiştir.
- Atlas RP
- Callback alındı; mevcut account authenticated; yeni link yok
- AS / OP
- Code-A bound; token yok
- Callback local gate
RP, browser-A ve state-A bağının bekleyen tx-A ile eşleştiğini kabul etti. Güvenilen AS endpoint’ine code-A, kayıtlı redirect ve verifier referansını taşıyan token request’i hazırlar; AS henüz bu request’i almamıştır.
- Atlas RP
- Callback kabul edildi; token request hazır
- AS / OP
- Code-A bound; token yok
- Token request ulaştı
Normal declared TLS token request AS’ye ulaştı; code ve verifier aliases alındı, validation henüz pending’dir.
- Atlas RP
- Callback accepted
- AS / OP
- Request alındı; pending
- AS code/verifier gate
Verilen verifier’ın S256 sonucu code-A challenge’ıyla eşleşir. Client/redirect bağları, unused=true ve now=1050 < expiresAt=1100 koşulları da uygundur; AS token response’unu hazırlar. Bu henüz RP identity kabulü değildir.
- Atlas RP
- Callback accepted
- AS / OP
- Token aliases hazır
- AS response alındı
AS response RP’ye ulaştı; bu arrival identity acceptance veya session creation olarak işaretlenmez.
- Atlas RP
- Response alındı; RP pending
- AS / OP
- Token aliases hazır
- RP response gate
RP normal token response için issuer/audience/expiry/key ve selected nonce gate’ini okur; error response identity oluşturmaz.
- Atlas RP
- Identity accepted; mapping pending
- AS / OP
- Token aliases hazır
- Local mapping policy
Yeni iss/sub identity’si doğrulanmış ve linking session bağı kurulmuştur; mevcut account da authenticated’dır. Ancak explicitConfirmation=false olduğundan link-pending kalır. Identity kabulü local link onayını tamamlamaz.
- Atlas RP
- Link confirmation pending
- AS / OP
- Token aliases hazır
- Local sonuç
Bu dalda yeni identity reddedilmedi; kullanıcının açık link onayı eksiktir. Account association değişmez ve bu yapılmamış link üzerinden yeni login yetkisi oluşmaz. Mevcut authenticated account context’iyle yeni login session’ını karıştırma.
- Atlas RP
- No new link; account unchanged
- AS / OP
- Token aliases hazır
ROLLER · STATE · VERİ AKIŞI
Bir code hangi transaction’a ait?
PKCE, authorization code ile onu başlatan client transaction’ı arasında devamlılık kurar. Client her authorization request için yeni, yüksek entropy’li code_verifier üretir; S256 challenge, ASCII verifier’ın SHA-256 sonucunun padding’siz base64url gösterimidir. Authorization request challenge ve method’u taşır; verifier daha sonra TLS token request’inde kullanılır. Challenge bir identity claim değildir ve code bir API access token değildir. AS, method/challenge’ı ürettiği code’a bağlar.
Token endpoint gelen verifier’dan aynı challenge’ı hesaplayıp code’a bağlı değerle karşılaştırır; başarısız karşılaştırma invalid_grant olur. Başarılı PKCE karşılaştırması diğer code, client, redirect ve lifetime kontrollerini kaldırmaz. RFC 9700 public client için PKCE’yi zorunlu, confidential client için önerilen koruma sayar; belirli ek önlemlerle confidential OIDC client için nonce alternatifini de tanır. Bu web profilinde S256 PKCE, state ve nonce birlikte seçilmiştir; sabit fixture string’i gerçek login verifier’ı olarak kullanılmaz.
Redirect, state ve nonce aynı alan değildir
Registered redirect, AS response’unun gideceği endpoint’tir. Güncel BCP eşleştirmeyi exact string ister; native app localhost redirect port istisnası bu server-side HTTPS profiline taşınmaz. Aynı host fakat başka path veya ek query, kayıtlı callback ile aynı string değildir. Callback transaction’ı browser-A, selected issuer ve pending state-A ile ilişkilidir. state eşleşmesi yalnız callback correlation’ını anlatır; token signature veya user identity doğrulamasını kendi başına yapmaz.
Nonce authorization request’te seçilmişse ID Token’da bulunmalı ve aynı transaction’daki değerle eşleşmelidir. RP ayrıca trusted issuer, kendi client_id audience’ı, expiry ve kabul edilen key/algorithm bağlamını okur. Seçili profil trusted issuer key’iyle signature doğrular; OIDC code flow’unun doğrudan TLS token endpoint yanıtına ilişkin dar signature alternatifi genel “signature gereksiz” kuralı değildir. PKCE, nonce ve state’in owner’ları ve kontrol anları ayrıdır; BCP’nin uygun PKCE/nonce ile CSRF koruması seçenekleri, ürünün bütün state/nonce kullanımının evrensel zorunluluk olduğu anlamına gelmez.
Doğru identity hangi local account’a bağlanır?
Validated OIDC identity’nin stable anahtarı iss ve sub ikilisidir. subject-A başka issuer altında aynı local user sayılmaz; email veya preferred_username eşitliği account linking için yeterli değildir. Önceden kurulmuş mapping ile login, mevcut local account’a yeni external identity eklemekten farklıdır. İkinci işlem sensitive account değişikliğidir: existing account session’ı, yeni identity authentication’ı ve linking transaction bağı birlikte kanıtlanmalıdır.
Atlas link-pending satırı valid ID Token almasına rağmen mapping yazmaz; explicit confirmation henüz yoktur. Bu ek onay selected local policy’dir, token’ın eksik claim’i değildir. Normal satır mevcut iss/sub mapping’ini bulur ve login session’ını ayrı local işlemde açar. Figure callback receipt’ten başlar; önceki browser redirect’i ve gerçek IdP authentication’ı gösterilmiş sayılmaz. Tablo aliases kullanır; yalnız public hash fixture’ında dönüşüm hesaplanır, gerçek code/token/JWS alışverişi yapılmaz.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
State farklı
- Received callback context’i seçildi
Bu scene callback’in RP’ye ulaştığı noktadan başlar. Pending transaction tx-A browser-A ve state-A’ya bağlıdır; callback metni kendi trust configuration’ını oluşturmaz.
- RP transaction/identity context
- Received callback
- RP validation/link gate
- Pending tx-A
- Account/session boundary
- Exchange yok
- Callback ve pending state karşılaştırıldı
state-denied satırında browserAlias=browser-A eşleşir, fakat stateAlias=state-B gelir. Doğru browser bağlamı failed state correlation’ı telafi etmez.
- RP transaction/identity context
- Callback state-B
- RP validation/link gate
- Expected state-A; mismatch
- Account/session boundary
- Exchange yok
- RP correlation gate’i durdurdu
callback=false olduğundan exchange=false kalır. RP token endpoint request’i başlatmaz; bu outcome AS’nin bir token request’ini reddetmesi değildir.
- RP transaction/identity context
- State mismatch known
- RP validation/link gate
- RP correlation denied
- Account/session boundary
- AS request başlatılmadı
- Identity validation çalışmış sayılmadı
sceneRows identity=false ve identityRef=null korur. Token response gelmeden issuer/audience/nonce veya crypto sonucu uydurulmaz.
- RP transaction/identity context
- State mismatch known
- RP validation/link gate
- No ID validation outcome
- Account/session boundary
- Identity ref=null
- Local session sınırı kapalı kaldı
Action no-session olarak verilmiştir. PKCE veya registered redirect bilgisi, RP’nin failed transaction correlation’ını geçerli kılmak için kullanılamaz.
- RP transaction/identity context
- RP callback denied
- RP validation/link gate
- No token exchange
- Account/session boundary
- Action: no-session
- Ret owner’ı doğru korundu
Bilinen failure boundary RP callback gate’idir; AS token endpoint’i burada değerlendirme yapmamıştır. Bu outcome browser’ın kötü niyetli olduğuna dair attribution üretmez.
- RP transaction/identity context
- Known: state mismatch
- RP validation/link gate
- AS not contacted
- Account/session boundary
- No local session established
Link onayı eksik
- Yeni identity link request’i seçildi
Link-pending satırında yeni external identity subject-new doğrulanmıştır. Existing local account authenticated olsa da yeni identity association ayrı sensitive değişikliktir.
- RP transaction/identity context
- New identity validated
- RP validation/link gate
- Local link pending
- Account/session boundary
- Account mutation yok
- Iss/sub mapping’i ayrı okundu
iss=https://identity.example.org ve sub=subject-new mevcut identity’den ayrıdır. Aynı email veya görünen isim yeni local mapping kurmak için yeterli anahtar değildir.
- RP transaction/identity context
- New iss/sub identity
- RP validation/link gate
- existingIdentityMatch=false
- Account/session boundary
- Account mutation yok
- Linking session koşulu korundu
existingAccountAuthenticated, newIdentityValidated ve linkSessionBound true’dur. Bu profile ayrıca explicitConfirmation ister; olumlu identity sonucu sensitive onaya eşitlenmez.
- RP transaction/identity context
- New identity validated
- RP validation/link gate
- Link session bound; confirmation pending
- Account/session boundary
- Account mutation yok
- User confirmation gate’i kapalı kaldı
explicitConfirmation=false olduğu için expected=no-link’tir. Approved-link satırı confirmation true olduğunda ayrı bir olumlu kontrol sunar; bu row o state’e taşınmaz.
- RP transaction/identity context
- New identity validated
- RP validation/link gate
- Confirmation=false
- Account/session boundary
- No link committed
- Identity acceptance ile mutation ayrıldı
Callback, exchange ve identity olumlu olduğu hâlde scene action no-link’tir. Başarılı S256 veya nonce match, RP local account policy’sini devralmaz.
- RP transaction/identity context
- Validated identity-new
- RP validation/link gate
- Account link denied until confirmation
- Account/session boundary
- No local association mutation
- Mapping authority RP’de kaldı
Bu sonuç external identity proof’unu reddetmez; limited local link action’ını bekletir. Future resource permission bu yapılmamış link üzerinden kurulmaz, notification delivery sonucu da eklenmez.
- RP transaction/identity context
- Known: external identity accepted
- RP validation/link gate
- Known: explicit approval missing
- Account/session boundary
- Known: no account link
VARSAYIM · SINIR · KONTROL
İlk başarısız gate’in etkisi
State-denied branch’inde browser context’i doğru olsa da state-B pending state-A ile eşleşmez; RP normal token request’i başlatmaz. Bu aşamada “AS token’ı reddetti” demek doğru değildir: request hiç AS’ye çizilmez. PKCE-denied branch’i ise callback gate’ini geçer, normal token request AS’ye ulaşır, seçili fixture verifier’ı code challenge’ıyla uyuşmadığından AS error response’u hazırlar. Response arrival ile RP’nin error sonucunu local olarak işlemesi ayrı state’lerdir.
Başarılı S256 sonucu user’ın local account’a kim olarak bağlanacağını söylemez. Nonce veya issuer/audience gate’i başarısızsa bir token response alınmış olması session açmaya yetmez. Verifier generation’ın biçimce doğru olması entropy kanıtı da değildir: public örnek string’i reproducible arithmetic içindir. Secret bir verifier’ın veya code/token değerinin log’da görünmesi ayrı credential handling sorunudur; dersin aliases’ını gerçek login secret’ı diye kullanma.
Eşit profile attribute identity değildir
Email-only satırında identity valid kabul edilse bile existing account session’ı ve linking session bağı yoktur; email benzerliğinden link üretilmez. Link-pending, yeni identity’nin kanıtı ile sensitive local değişikliğin onayını ayırır. Boundary bozulursa external identity yanlış local account bağlamında kullanılabilir; hangi record veya tenant’a erişileceği yine application authorization’a bağlıdır. Sorunu token formatına indirgemek doğru owner’ı gizler: local mapping kararı RP’ye aittir ve yeniden doğrulanabilir bir binding policy gerektirir.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
S256 hesabı
- Public S256 fixture seçildi
publicHashFixture verifier ve challenge değerlerini açık öğretim vektörü olarak verir. credential=false ve randomnessCertified=false sınırları korunur.
- Public transaction artifact
- Public noncredential vector
- Contract calculation/review
- Hash hesabı incelenmedi
- Evidence scope
- Protocol sonucu bilinmiyor
- Encoding zinciri okundu
Method S256 için ASCII bytes SHA-256 ile hash edilir, digest padding’siz base64url olarak temsil edilir. Bu temsil zinciri entropy üretmez veya kullanıcı identity’sini doğrulamaz.
- Public transaction artifact
- ASCII verifier bytes
- Contract calculation/review
- SHA-256 → base64url without padding
- Evidence scope
- Protocol sonucu bilinmiyor
- Declared challenge karşılaştırıldı
Fixture challenge Z71zbcb356BKqaniSqPvye_RlNZA5-R1eU2rfBz2u0I olarak verilmiştir. Bu değer fixed public input’a bağlıdır; production verifier için kopyalanacak bir secret değildir.
- Public transaction artifact
- Public verifier only
- Contract calculation/review
- Declared S256 challenge
- Evidence scope
- Entropy kanıtı yok
- Code binding rolü sınırlandı
PKCE AS token endpoint’inde code-to-verifier continuity içindir. Client authentication, RP state, ID nonce veya iss/sub account mapping aynı gate değildir.
- Public transaction artifact
- Public hash vector
- Contract calculation/review
- Code/verifier continuity role
- Evidence scope
- Other identity gates separate
- Runtime protocol kanıtı ayrıldı
Public vektörün hash equality’si yeniden hesaplanabilir. Bunun doğru olması gerçek AS code exchange, random generator veya ID signature verification çalıştığı sonucu değildir.
- Public transaction artifact
- Reproducible public arithmetic
- Contract calculation/review
- Protocol execution ayrı evidence
- Evidence scope
- UNKNOWN: actual exchange
- PKCE hükmü kendi scope’unda kaldı
Bu artifact S256 temsil hesabını ve code association metadata’sını açıklar. Bearer access token’ın API’de sender-constrained olduğu veya local identity’nin bağlandığı sonucu üretilmez.
- Public transaction artifact
- Known: public S256 representation
- Contract calculation/review
- Binding roles remain distinct
- Evidence scope
- No broadened authentication claim
Exact redirect
- Registered redirect contract seçildi
Registered string https://atlas.example.org/login/callback’tir. Bu web profile nativeRedirectExceptionSelected=false taşır; başka native-app kuralları sessiz uygulanmaz.
- Public transaction artifact
- Web redirect profile
- Contract calculation/review
- Exact rows incelenmedi
- Evidence scope
- Transaction hükmü yok
- Normal eşleşme satırı okundu
Registered string ile aynı candidate için expected=true’dur. Destination’ın eşleşmesi tek başına current browser transaction’ın pending veya state-bound olduğunu kanıtlamaz.
- Public transaction artifact
- Registered candidate exact
- Contract calculation/review
- Redirect expected=true
- Evidence scope
- Callback correlation separate
- Slash ve query satırları karşılaştırıldı
Trailing slash eklenen callback/ ve ?view=notes eklenen candidate için expected=false’tur. Bu fixture exact string contract kullanır; benzer görünen path aynı registration değildir.
- Public transaction artifact
- Alternate normal candidates
- Contract calculation/review
- Slash/query expected=false
- Evidence scope
- Registration boundary explicit
- Redirect ile state rolü ayrıldı
Redirect registered response destination’dır; state seçili callback/user-agent correlation içindir. State’in eşleşmesi, farklı registered destination kabulü üretmez.
- Public transaction artifact
- Destination role known
- Contract calculation/review
- State correlation separate
- Evidence scope
- No replaced gate
- Nonce ve identity mapping ayrı kaldı
Nonce seçili ID token transaction binding, iss/sub ise stable local federated identity key’dir. Registered callback eşitliği bu downstream identity gate’lerini tamamlamaz.
- Public transaction artifact
- Destination role known
- Contract calculation/review
- Nonce/iss-sub separate
- Evidence scope
- Identity acceptance ayrı evidence
- Exact contract hükmü kapsamlandı
Üç redirect row’unun expected sonucu açıklanabilir. Gerçek provider registration, browser navigation veya callback receipt bu static matrix’ten doğrulanmış sayılmaz.
- Public transaction artifact
- Known: declared exact redirect matrix
- Contract calculation/review
- Native exception not selected
- Evidence scope
- UNKNOWN: provider/navigation runtime
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Transaction ledger’ını owner ile kur
RP pending transaction’da selected issuer, client registration, redirect, user-agent binding, state, nonce ve verifier referansını birlikte saklar; her field’in purpose’u ayrıdır. AS code ledger’ı client, redirect, method/challenge, expiry ve one-use koşulunu bağlar. Callback local gate’inden sonra token endpoint seçimi trusted configuration’dan gelir; gelen callback’in her adresi veya key referansı yeni trust kaynağı yapılmaz. Token receipt, ID validation ve local account mutation olayları ayrı kaydedilir.
Regression normal login’i olumlu kontrol olarak tutar; state mismatch request’i AS’den önce durdurur, PKCE mismatch AS’de token production’ı durdurur, nonce mismatch RP’de identity acceptance’ı durdurur. Registered callback string’ine trailing slash veya normal query eklenen satırlar exact matching’i doğrular; native-app exception burada uygulanmaz. S256 check, ASCII bytes ve padding’siz base64url çıktısını hesaplar; gerçek random generator’ın entropy’si veya protocol compliance bu arithmetic test’inden çıkmaz.
Account link’i ayrı sensitive değişiklik say
Existing identity mapping’i iss/sub üzerinden oku; yeni link için existing account authentication’ını, yeni identity validation’ını ve current linking session bağını tekrar kontrol et. Atlas ayrıca user confirmation ister; link-pending state’inde account store değişmez ve yeni login yetkisi o link üzerinden oluşmaz. Gerekli reauthentication, unlink sonrası access sonlandırma ve user notification lifecycle’ın parçalarıdır. Bu fixture yalnız karar ledger’ını gösterir; notification göndermez, key veya token indirmez ve actual local account store’a yazmaz.
ŞİMDİ VAKAYA UYGULA
PKCE, state ve nonce hangi local account onayını vermeyebilir?
RP callback gate’i AS exchange’den önce durabilir; yeni identity validation ise explicit link onayını tamamlamaz. Public S256 vektörü ve redirect matrix yalnız kendi contract’ını açıklar.
Vakadaki identity hangi issuer ve recipient ilişkisinden geliyor? Login veya delegation başarısı ile current tenant/object permission için gereken kanıtları ayır.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Callback–code–identity binding ledger’ı
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"clientId": "atlas-web",
"issuer": "https://identity.example.org",
"registeredRedirect": "https://atlas.example.org/login/callback",
"flow": "authorization-code",
"method": "S256",
"client": "confidential server-side; authentication declared",
"nativeRedirectExceptionSelected": false,
"sceneStartsAtReceivedCallback": true,
"noActualTokens": true,
"noActualProvider": true
},
"transaction": {
"alias": "tx-A",
"browserAlias": "browser-A",
"stateAlias": "state-A",
"nonceAlias": "nonce-A",
"verifierAlias": "verifier-A",
"pending": true,
"createdFor": "login-or-explicit-link",
"oneUse": true
},
"publicHashFixture": {
"verifier": "atlas-public-pkce-fixture-AAAAAAAAAAAAAAAAAAAAAAAA",
"challenge": "Z71zbcb356BKqaniSqPvye_RlNZA5-R1eU2rfBz2u0I",
"method": "S256",
"encoding": "ASCII -> SHA-256 -> base64url without padding",
"credential": false,
"randomnessCertified": false
},
"codeAssociation": {
"codeAlias": "code-A",
"transactionAlias": "tx-A",
"clientId": "atlas-web",
"redirect": "https://atlas.example.org/login/callback",
"method": "S256",
"challenge": "Z71zbcb356BKqaniSqPvye_RlNZA5-R1eU2rfBz2u0I",
"unused": true,
"now": 1050,
"expiresAt": 1100
},
"redirectRows": [
{
"candidate": "https://atlas.example.org/login/callback",
"expected": true
},
{
"candidate": "https://atlas.example.org/login/callback/",
"expected": false
},
{
"candidate": "https://atlas.example.org/login/callback?view=notes",
"expected": false
}
],
"callbackRows": [
{
"case": "normal",
"browserAlias": "browser-A",
"stateAlias": "state-A",
"pending": true,
"expected": true
},
{
"case": "state-denied",
"browserAlias": "browser-A",
"stateAlias": "state-B",
"pending": true,
"expected": false
},
{
"case": "browser-other",
"browserAlias": "browser-B",
"stateAlias": "state-A",
"pending": true,
"expected": false
},
{
"case": "not-pending",
"browserAlias": "browser-A",
"stateAlias": "state-A",
"pending": false,
"expected": false
}
],
"exchangeRows": [
{
"case": "normal",
"verifier": "atlas-public-pkce-fixture-AAAAAAAAAAAAAAAAAAAAAAAA",
"clientId": "atlas-web",
"redirect": "https://atlas.example.org/login/callback",
"method": "S256",
"unused": true,
"now": 1050,
"expected": true
},
{
"case": "pkce-denied",
"verifier": "atlas-public-pkce-fixture-BBBBBBBBBBBBBBBBBBBBBBBB",
"clientId": "atlas-web",
"redirect": "https://atlas.example.org/login/callback",
"method": "S256",
"unused": true,
"now": 1050,
"expected": false
},
{
"case": "expired",
"verifier": "atlas-public-pkce-fixture-AAAAAAAAAAAAAAAAAAAAAAAA",
"clientId": "atlas-web",
"redirect": "https://atlas.example.org/login/callback",
"method": "S256",
"unused": true,
"now": 1100,
"expected": false
}
],
"identityRows": [
{
"case": "normal",
"nonceAlias": "nonce-A",
"now": 1050,
"expected": true
},
{
"case": "nonce-denied",
"nonceAlias": "nonce-B",
"now": 1050,
"expected": false
},
{
"case": "id-expired",
"nonceAlias": "nonce-A",
"now": 1200,
"expected": false
}
],
"accountRows": [
{
"case": "known-identity",
"iss": "https://identity.example.org",
"sub": "subject-A",
"existingIdentityMatch": true,
"existingAccountAuthenticated": true,
"linkRequested": false,
"newIdentityValidated": true,
"linkSessionBound": true,
"explicitConfirmation": false,
"expected": "existing-login"
},
{
"case": "link-pending",
"iss": "https://identity.example.org",
"sub": "subject-new",
"existingIdentityMatch": false,
"existingAccountAuthenticated": true,
"linkRequested": true,
"newIdentityValidated": true,
"linkSessionBound": true,
"explicitConfirmation": false,
"expected": "no-link"
},
{
"case": "approved-link",
"iss": "https://identity.example.org",
"sub": "subject-new",
"existingIdentityMatch": false,
"existingAccountAuthenticated": true,
"linkRequested": true,
"newIdentityValidated": true,
"linkSessionBound": true,
"explicitConfirmation": true,
"expected": "link"
},
{
"case": "email-only",
"iss": "https://other-id.example.org",
"sub": "subject-A",
"emailMatches": true,
"existingIdentityMatch": false,
"existingAccountAuthenticated": false,
"linkRequested": true,
"newIdentityValidated": true,
"linkSessionBound": false,
"explicitConfirmation": true,
"expected": "no-link"
}
],
"roles": {
"state": "selected callback/user-agent correlation",
"nonce": "selected ID Token transaction binding",
"pkce": "code-to-verifier continuity at AS token endpoint",
"redirect": "registered response destination",
"issSub": "stable local federated identity key"
},
"sceneRows": [
{
"case": "normal",
"callback": true,
"exchange": true,
"identity": true,
"action": "existing-login",
"identityRef": "identity-A"
},
{
"case": "state-denied",
"callback": false,
"exchange": false,
"identity": false,
"action": "no-session",
"identityRef": null
},
{
"case": "pkce-denied",
"callback": true,
"exchange": false,
"identity": false,
"action": "no-session",
"identityRef": null
},
{
"case": "link-pending",
"callback": true,
"exchange": true,
"identity": true,
"action": "no-link",
"identityRef": "identity-new"
}
],
"identityFixtures": {
"identity-A": {
"iss": "https://identity.example.org",
"sub": "subject-A",
"aud": [
"atlas-web"
],
"nonceAlias": "nonce-A",
"exp": 1200,
"signatureValidDeclared": true,
"keyProvenanceDeclared": true,
"registeredAlgorithmAccepted": true,
"additionalUntrustedAudience": false
},
"identity-new": {
"iss": "https://identity.example.org",
"sub": "subject-new",
"aud": [
"atlas-web"
],
"nonceAlias": "nonce-A",
"exp": 1200,
"signatureValidDeclared": true,
"keyProvenanceDeclared": true,
"registeredAlgorithmAccepted": true,
"additionalUntrustedAudience": false
}
},
"identityTemplate": {
"iss": "https://identity.example.org",
"sub": "subject-A",
"aud": [
"atlas-web"
],
"nonceAlias": "nonce-A",
"exp": 1200,
"signatureValidDeclared": true,
"keyProvenanceDeclared": true,
"registeredAlgorithmAccepted": true,
"additionalUntrustedAudience": false
}
}- transaction
- RP pending transaction’ın browser ve correlation referansları.
- publicHashFixture
- Credential olmayan fixed ASCII fixture ve S256 sonucu; entropy iddiası yok.
- codeAssociation
- AS’nin code’a bağladığı method/challenge ve diğer context.
- accountRows
- Existing login, approved link ve no-link ayrı local kararlardır.
Aliases gerçek code/token değildir. Public S256 fixture yalnız hash/encoding içindir; entropy, AS/RP, signature, browser redirect veya account store doğrulaması yapmaz.
İki yanlış kanı
PKCE geçerse account doğru bağlanmıştır.
PKCE code/verifier devamlılığını doğrular; ID Token ve local iss/sub mapping/link policy’si ayrı gate’lerdir.
Aynı email iki hesabı güvenle birleştirir.
Email stable unique identity değildir. Existing account ve yeni identity authentication’ı linking session’a bağlanmalıdır.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Callback, exchange ve identity kontrolleri geçmiş, fakat yeni identity için explicitConfirmation=false. Account link kurulur mu?
- Evet. Geçerli identity veya eşleşen email otomatik link iznidir.
- Hayır. link-pending sonucu no-link.
Gerekçeli cevabı oku
Hayır. link-pending sonucu no-link. — Yeni identity doğrulanmış olabilir, fakat bu örneğin link policy’si açık confirmation ister. Başarılı login kontrolleri tek başına account birleştirmez.
Registered callback’a trailing slash veya query eklenmesi bu web client için eşleşme sayılır mı?
Dersten seçilen artifact alanları; öğretim örneği
- profile.registeredRedirect
- https://atlas.example.org/login/callback
- profile.nativeRedirectExceptionSelected
- false
- redirectRows
- [{"candidate":"https://atlas.example.org/login/callback","expected":true},{"candidate":"https://atlas.example.org/login/callback/","expected":false},{"candidate":"https://atlas.example.org/login/callback?view=notes","expected":false}]
- Hayır. Yalnız kayıtlı exact URL true.
- Evet. Aynı host içindeki bütün callback URL’leri eşdeğer.
Gerekçeli cevabı oku
Hayır. Yalnız kayıtlı exact URL true. — callback/ ve callback?view=notes farklı adaylardır. nativeRedirectExceptionSelected=false olduğu için burada özel native-app matching kuralı varsayılmaz.
State, nonce ve PKCE bu transaction’da hangi üç ayrı bağı kurar? Public S256 hash fixture neden gerçek login veya randomness kanıtı değildir?
Gerekçeli cevabı oku
State callback’ı bekleyen browser transaction’ına bağlar. Nonce bu profile ID token transaction eşleşmesini denetler. PKCE, AS token endpoint’inde code ile verifier continuity’sini kontrol eder; diğer identity ve account koşullarını kaldırmaz. Public fixture ASCII → SHA-256 → padding’siz base64url dönüşümünü gösterir. Credential değildir; gerçek provider, token exchange veya verifier randomness’i doğrulanmış sayılmaz. Yerel identity anahtarı iss/sub çiftidir, email değil.
□ State, nonce ve PKCE rollerini birbirine çevirmedim.
□ Public hash fixture’ını gerçek login veya entropy testi saymadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- RFC 7636 — Proof Key for Code Exchange§4.1 code verifier syntax and generation · §4.2 S256 · §4.3–4.6 authorization/code association/token verifier gate
- RFC 9700 — Best Current Practice for OAuth 2.0 Security§2.1 exact registered redirect and CSRF choices · §2.1.1 client requirements; transaction/user-agent binding; S256 and AS enforcement
- OpenID Connect Core 1.0 incorporating errata set 2§3.1.3.7 issuer/audience/key/signature/expiry/nonce validation · §5.7 Claim Stability and Uniqueness
- OWASP Authentication Cheat Sheet — federated account linkingSecure Federated Account Linking · Require Re-authentication for Sensitive Features