Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-15.S01

PKCE, redirect ve identity binding

Code continuity, callback correlation ve local account binding’i birbirinden ayır.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Normal login

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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

  1. 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
  2. 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
  3. 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
  4. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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ı

  1. 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
  2. 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
  3. 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ı
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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ı

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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?

  1. Evet. Geçerli identity veya eşleşen email otomatik link iznidir.
  2. 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}]
  1. Hayır. Yalnız kayıtlı exact URL true.
  2. 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