Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-15.01

OAuth actors, code flow ve scopes

Mina, Atlas Exporter’a yalnız seçtiği notları okuma yetkisi verir. OAuth rollerini, code exchange’i ve API’nin kendi kararını bu tek delegation üzerinden ayır.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Okuma izni

  1. Callback sonrası

    Sahne kabul edilmiş callback sonrasından başlar; browser redirect ve owner authentication bu dilimde çizilmez.

    Client
    Code alias elde; callback bağlandı
    Authorization server
    Code geçerli; token yok
    Resource server
    Henüz request yok
  2. Exchange hazır

    Client code, redirect ve seçili verifier bağlamını hazırlar; hazırlama kendi içinde bir işlemdir.

    Client
    Token request hazır; code API’ye gitmez
    Authorization server
    Code geçerli; token yok
    Resource server
    Henüz request yok
  3. AS request aldı

    Token request AS’ye ulaştı; client/code/redirect/PKCE kontrolü henüz tamamlanmış değildir.

    Client
    Token request hazır; code API’ye gitmez
    Authorization server
    Token request alındı; gate pending
    Resource server
    Henüz request yok
  4. AS gate geçti

    Seçili code ve binding gate’leri geçti; code consumed ve token response hazır durumu AS içinde oluşur.

    Client
    Token request hazır; code API’ye gitmez
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Henüz request yok
  5. Token response geldi

    Client access token ve optional refresh alias’ını aldı; bu receipt henüz Notes API izni değildir.

    Client
    AT alias elde; API gate yok
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Henüz request yok
  6. İşlem seçildi

    Client, notes-api alıcısında read işlemi için access-A ile request hazırlar. Token audience değeri notes-api ve verilen scope notes:read olarak kalır; alıcı kendi kabul kararını verecektir.

    Client
    notes-api read request hazır
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Henüz request yok
  7. API request aldı

    Request notes-api alıcısına ulaştı. Access-A bağlamı artık alıcıdadır, fakat audience, zaman, scope ve object koşulları henüz değerlendirilmedi.

    Client
    notes-api read request hazır
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    notes-api request aldı; policy bekliyor
  8. API kararı

    notes-api için audience eşleşir; now=1050, expiresAt=2000 sınırının içindedir. notes:read scope’u ve seçili tenant/owner ilişkisi read işlemini kabul ettirir. Karar allow olsa da bu sahne note bytes okumaz ve client’a body göndermez.

    Client
    notes-api read request hazır
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Read policy allow; bytes okunmadı

Scope dar

  1. Callback sonrası

    Sahne kabul edilmiş callback sonrasından başlar; browser redirect ve owner authentication bu dilimde çizilmez.

    Client
    Code alias elde; callback bağlandı
    Authorization server
    Code geçerli; token yok
    Resource server
    Henüz request yok
  2. Exchange hazır

    Client code, redirect ve seçili verifier bağlamını hazırlar; hazırlama kendi içinde bir işlemdir.

    Client
    Token request hazır; code API’ye gitmez
    Authorization server
    Code geçerli; token yok
    Resource server
    Henüz request yok
  3. AS request aldı

    Token request AS’ye ulaştı; client/code/redirect/PKCE kontrolü henüz tamamlanmış değildir.

    Client
    Token request hazır; code API’ye gitmez
    Authorization server
    Token request alındı; gate pending
    Resource server
    Henüz request yok
  4. AS gate geçti

    Seçili code ve binding gate’leri geçti; code consumed ve token response hazır durumu AS içinde oluşur.

    Client
    Token request hazır; code API’ye gitmez
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Henüz request yok
  5. Token response geldi

    Client access token ve optional refresh alias’ını aldı; bu receipt henüz Notes API izni değildir.

    Client
    AT alias elde; API gate yok
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Henüz request yok
  6. İşlem seçildi

    Client, notes-api alıcısında write işlemi için access-A ile request hazırlar. Token audience değeri notes-api ve verilen scope notes:read olarak kalır; alıcı kendi kabul kararını verecektir.

    Client
    notes-api write request hazır
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Henüz request yok
  7. API request aldı

    Request notes-api alıcısına ulaştı. Access-A bağlamı artık alıcıdadır, fakat audience, zaman, scope ve object koşulları henüz değerlendirilmedi.

    Client
    notes-api write request hazır
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    notes-api request aldı; policy bekliyor
  8. API kararı

    notes-api için audience ve zaman uygundur; fakat write isteği notes:write gerektirirken verilen scope yalnız notes:read içerir. Sonuç scope-denied olur. Bu dalda yazma yapılmaz ve client’a resource body gönderilmez.

    Client
    notes-api write request hazır
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Write policy deny; read scope only

Yanlış API

  1. Callback sonrası

    Sahne kabul edilmiş callback sonrasından başlar; browser redirect ve owner authentication bu dilimde çizilmez.

    Client
    Code alias elde; callback bağlandı
    Authorization server
    Code geçerli; token yok
    Resource server
    Henüz request yok
  2. Exchange hazır

    Client code, redirect ve seçili verifier bağlamını hazırlar; hazırlama kendi içinde bir işlemdir.

    Client
    Token request hazır; code API’ye gitmez
    Authorization server
    Code geçerli; token yok
    Resource server
    Henüz request yok
  3. AS request aldı

    Token request AS’ye ulaştı; client/code/redirect/PKCE kontrolü henüz tamamlanmış değildir.

    Client
    Token request hazır; code API’ye gitmez
    Authorization server
    Token request alındı; gate pending
    Resource server
    Henüz request yok
  4. AS gate geçti

    Seçili code ve binding gate’leri geçti; code consumed ve token response hazır durumu AS içinde oluşur.

    Client
    Token request hazır; code API’ye gitmez
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Henüz request yok
  5. Token response geldi

    Client access token ve optional refresh alias’ını aldı; bu receipt henüz Notes API izni değildir.

    Client
    AT alias elde; API gate yok
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Henüz request yok
  6. İşlem seçildi

    Client, archive-api alıcısında read işlemi için access-A ile request hazırlar. Token audience değeri notes-api ve verilen scope notes:read olarak kalır; alıcı kendi kabul kararını verecektir.

    Client
    archive-api read request hazır
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    Henüz request yok
  7. API request aldı

    Request archive-api alıcısına ulaştı. Access-A bağlamı artık alıcıdadır, fakat audience, zaman, scope ve object koşulları henüz değerlendirilmedi.

    Client
    archive-api read request hazır
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    archive-api request aldı; policy bekliyor
  8. API kararı

    Request alıcısı archive-api, access-A audience değeri ise notes-api’dır. Bu eşleşmediği için alıcı audience-denied kararı verir; olumlu scope veya tenant/owner ilişkisi başka alıcıya izin vermez. Body üretilmez ve client henüz bu kararı almamıştır.

    Client
    archive-api read request hazır
    Authorization server
    Code consumed; AT+optional RT hazır
    Resource server
    archive-api: audience-denied; body yok

Code süresi doldu

  1. Zaman sınırı

    Kabul edilmiş callback bağlamında code elde; seçili clock tam code expiration anına geldi.

    Client
    Code alias elde; now=1100
    Authorization server
    Code expiresAt=1100; unused
    Resource server
    Request yok
  2. Exchange hazır

    Client aynı normal token request’i hazırlar; code’un geçerliliği yine AS’nin yerel gate’ine bağlıdır.

    Client
    Normal token request hazır
    Authorization server
    Code expiresAt=1100; unused
    Resource server
    Request yok
  3. AS receipt

    Token request AS’ye ulaştı; receipt expiry kontrolünü veya token issuance’ı tamamlamaz.

    Client
    Normal token request hazır
    Authorization server
    Request alındı; expiry pending
    Resource server
    Request yok
  4. Expiry deny

    Zero-leeway fixture now=expiresAt olduğundan code’u reddeder; access veya refresh token yaratılmaz.

    Client
    Normal token request hazır
    Authorization server
    Code expired; error ready; no tokens
    Resource server
    Request yok
  5. Hata receipt

    Client seçili exchange error sonucunu aldı; Notes API’ye yeni credential ile ilerlemez.

    Client
    Exchange failed; no AT; no API call
    Authorization server
    Code expired; error ready; no tokens
    Resource server
    Request yok

ROLLER · STATE · VERİ AKIŞI

Şifreyi paylaşmadan sınırlı yetki

Mina’nın notları Notes API’de durur; Atlas Exporter bunları bir dosyaya dönüştürmek isteyen ayrı uygulamadır. Exporter’a Mina’nın parolasını vermek, bu tek işin ötesinde yetki ve credential saklama sorumluluğu taşır. Delegated authorization, kullanıcının seçtiği erişimin client’a aktarılmasını düzenler. OAuth hangi API erişiminin verildiğini ele alır; tek başına standart bir kullanıcı kimliği veya her uygulamada ortak login sonucu tanımlamaz. Federation ise uygulamanın başka bir identity authority’nin authentication bilgisini güven sözleşmesiyle kabul etmesidir; bir sonraki derste OIDC bu ayrımı somutlaştırır.

Resource owner Mina, client Atlas Exporter, authorization server id.example.org ve resource server Notes API dört ayrı roldür. AS ve RS aynı işletme veya süreçte bulunabilir; yine de token issuance ile resource enforcement farklı kararlardır. Client terimi burada server-side uygulamayı ifade eder, browser ile eş anlamlı değildir. Browser front-channel redirect taşır; confidential client’ın credential’ı browser koduna gömülmez. Consent ekranı da her defasında şart bir protokol görünümü değildir: AS policy’si daha önce verilmiş approval’ı kullanabilir.

Code bir geçiş belgesidir

Client önce seçili AS için transaction açar; redirect URI, requested scopes ve browser’a bağlı correlation bilgisini saklar. Browser AS’ye gider; AS resource owner’ı authenticate eder ve grant kararını verir. Callback’te kısa ömürlü, tek kullanımlık code döner. Client bu dönüşü kendi başlattığı transaction’a bağladıktan sonra code’u token endpoint’te exchange eder. Code API’ye sunulmaz. AS code’un client, redirect URI, validity ve kullanım bağlarını denetler; seçtiğimiz S256 PKCE profilinde verifier’ın code’a bağlı challenge’a uyumu ayrıca gerekir.

Animasyon callback kabulünden sonraki parçayı gösterir: client→AS token request, AS’nin yerel gate’i, client’a token response ve RS’ye normal resource request. Mina’nın authentication’ı, browser redirect’leri ve TLS handshake’leri artifact timeline’ında açıklanır; sahnede görünmez. Token response’un client’a ulaşması, RS’nin bir notu okuduğu anlamına gelmez. Red branch’ler de gerçek provider hatası değil, aynı normal akışın açıkça belirtilmiş policy sonuçlarıdır.

Token’ın adresi ve scope’un sınırı

Access token, seçili RS’de erişim için kullanılan credential’dır; OAuth bütün access token’ların JWT olmasını gerektirmez. Opaque token’ın audience ve scope bilgisi RS’nin güvenilir doğrulama bağlamından gelebilir. Artifact’te bu bilgileri okunur policy alanları olarak gösteriyoruz, token bytes olarak değil. Requested notes:read notes:write yerine yalnız notes:read grant edilirse client bu daralmayı kabul eder. Scope adları AS’nin tanımladığı case-sensitive değerlerdir; “read” her uygulamada aynı yetki değildir. RS audience, süre ve scope kontrolünü her request’te kendi resource policy’siyle birleştirir.

Refresh token’ın alıcısı token endpoint’tir; Notes API değildir. Yeni access token almak içindir, otomatik sonsuz session veya genişleyen yetki değildir. Issuance opsiyoneldir, client binding korunur ve refresh ile ilk grant dışındaki scopes istenemez. Public client için güncel BCP sender constraint veya rotation ister; confidential client’ın refresh token’ı kendi client’ına bağlıdır. Fixture’da refresh yalnız alias ve daralma matrisiyle yer alır; rotation veya gerçek credential üretimi çalıştırılmaz.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Tenant farklı

  1. Resource action kapsamı seçildi

    Mina’nın atlas-exporter client’ı access-A alias’ını kullanır. Bu access context notes:read grant’i taşır; authorization code veya refresh token RS credential’ı gibi kullanılmaz.

    Access grant context
    case=foreign-tenant
    Resource-server policy
    RS policy uygulanmadı
    Resource boundary
    Resource grant yok
  2. Requested ve granted scope ayrıldı

    Client notes:read ile notes:write istemiştir, fakat grantedScopes yalnız notes:read içerir. Request edilen scope, consent/grant sonucunda verilmiş yetki değildir.

    Access grant context
    Granted: notes:read
    Resource-server policy
    RS policy uygulanmadı
    Resource boundary
    Resource grant yok
  3. Recipient gate’i değerlendirildi

    Audience notes-api eşleşir ve requiredScope notes:read grant içinde bulunur. Bu olumlu koşullar farklı tenant için object relation kontrolünü kaldırmaz.

    Access grant context
    Granted: notes:read
    Resource-server policy
    Audience match; scope present
    Resource boundary
    Resource grant yok
  4. Object koşulu scope’tan ayrı kaldı

    sameTenant=false, ownerMatches=true’dur. Ownership’ın eşleşmesi tenant scope’u geçersiz kılamaz; read sınıfının grant’i bütün notlara erişim vermez.

    Access grant context
    Read grant kapsamı
    Resource-server policy
    Tenant mismatch
    Resource boundary
    Resource grant yok
  5. RS action kararı olumsuz kaldı

    Expected result object-denied olur. Code exchange’in başka bir anda başarılı olması, bu resource decision’ı allow’a çevirmez.

    Access grant context
    Grant exists; this action denied
    Resource-server policy
    Reason: object-denied
    Resource boundary
    Resource allowance yok
  6. Actor authority sınırı korundu

    Client callback correlation, AS code binding ve RS token/resource policy farklı owner’lardadır. Bu sahne RS reason’ını açıklar; gerçek IdP, token signature veya body delivery sonucu eklemez.

    Access grant context
    Known: declared read grant
    Resource-server policy
    Known: RS object-denied
    Resource boundary
    No broadened resource authority

Audience farklı

  1. Resource action kapsamı seçildi

    Mina’nın atlas-exporter client’ı access-A alias’ını kullanır. Bu access context notes:read grant’i taşır; authorization code veya refresh token RS credential’ı gibi kullanılmaz.

    Access grant context
    case=wrong-audience
    Resource-server policy
    RS policy uygulanmadı
    Resource boundary
    Resource grant yok
  2. Requested ve granted scope ayrıldı

    Client notes:read ile notes:write istemiştir, fakat grantedScopes yalnız notes:read içerir. Request edilen scope, consent/grant sonucunda verilmiş yetki değildir.

    Access grant context
    Granted: notes:read
    Resource-server policy
    RS policy uygulanmadı
    Resource boundary
    Resource grant yok
  3. Recipient gate’i değerlendirildi

    Resource case archive-api recipient’ını seçer, access audience ise notes-api’dir. RS recipient mismatch’i audience-denied olarak ayırır; token genel olarak sahte diye adlandırılmaz.

    Access grant context
    Granted: notes:read
    Resource-server policy
    Audience mismatch
    Resource boundary
    Resource grant yok
  4. Object koşulu scope’tan ayrı kaldı

    sameTenant ve ownerMatches true olsa da failed recipient gate’i telafi edilmez. Object ilişkisi farklı API için access token authority’si üretmez.

    Access grant context
    Read grant kapsamı
    Resource-server policy
    Audience mismatch retained
    Resource boundary
    Resource grant yok
  5. RS action kararı olumsuz kaldı

    Expected result audience-denied olur. Code exchange’in başka bir anda başarılı olması, bu resource decision’ı allow’a çevirmez.

    Access grant context
    Grant exists; this action denied
    Resource-server policy
    Reason: audience-denied
    Resource boundary
    Resource allowance yok
  6. Actor authority sınırı korundu

    Client callback correlation, AS code binding ve RS token/resource policy farklı owner’lardadır. Bu sahne RS reason’ını açıklar; gerçek IdP, token signature veya body delivery sonucu eklemez.

    Access grant context
    Known: declared read grant
    Resource-server policy
    Known: RS audience-denied
    Resource boundary
    No broadened resource authority

VARSAYIM · SINIR · KONTROL

Hangi yanlış varsayım yetkiyi genişletir?

Exporter yalnız notes:read almışken not kaydetme düğmesinin görünmesi yetki kanıtı değildir. Artifact’te own-note/read allow; own-note/write scope-denied olur. İkinci sonuç bir login hatası değildir: grant gerçek olsa bile seçili action grant dışında kalır. Foreign-tenant/read satırında scope yeterlidir fakat object policy deny verir. Scope denetimini object ownership’in yerine koyan tasarım, izin verilen işlem sınıfını tüm nesnelere yayar; etki hangi verinin okunduğu veya değiştirildiğiyle ölçülür.

Wrong-audience branch’inde client yanlış API seçmiştir; token başka bir RS için geçerlidir. Notes API’nin onu reddetmesi token’ı genel olarak sahte yapmaz, alıcının yanlış olduğunu gösterir. Benzer şekilde code-expired branch’inde AS code exchange’i durdurur, client’a access token oluştu diye davranma hakkı doğmaz. Kararın gerekli koşullarını actor’a göre ayır: callback correlation client’ta, code binding AS’de, token audience ve resource policy RS’dedir. Bir actor’ın olumlu kararı diğerinin gate’ini atlatmaz.

Bearer taşımanın etkisi

Bearer kullanımında possession erişim için önemlidir; bu yüzden token’ı sıradan log veya frontend gösterim alanı saymak yanlış bir saklama varsayımıdır. Burada sender-constrained mekanizmalar yalnız tasarım seçeneği olarak anılır; bearer alias’ın cryptographic client binding sağladığını iddia etmeyiz. PKCE de access token’ı API’de sender-constrained yapmaz ve client secret’ın yerini bütün bağlamlarda almaz. Bu sınırlamalar bir payload veya müdahale yöntemi değil, credential’ın hangi sınırı koruduğunu anlamak içindir.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Code deadline

  1. Code exchange evidence seçildi

    Code-A expiresAt=1100 ve issuedAt=1000 ile client/redirect/PKCE binding metadata’sı taşır. Bu alias API’de resource permission veren access token değildir.

    Grant/code observation
    code-A declaration
    AS contract review
    AS gate incelenmedi
    Acceptance scope
    Token issuance bilinmiyor
  2. Confidential client koşulu okundu

    Bu profile confidential server-side client’tır. Normal ve time-boundary case’lerinde clientAuthenticated=true ayrıca verilmiştir; PKCE match client authentication’ın tüm bağlamlarda yerine geçmez.

    Grant/code observation
    Client: confidential server-side
    AS contract review
    Client/redirect/PKCE binding true
    Acceptance scope
    Token issuance bilinmiyor
  3. Last-valid ve equality karşılaştırıldı

    now=1099 için expected=true, now=1100 için expected=false’tur. Bu fixture’ın deadline sınırı code acceptance’ı kapatır; access token expiry aynı deadline olarak varsayılmaz.

    Grant/code observation
    Last valid=1099; deadline=1100
    AS contract review
    Equality code exchange denied
    Acceptance scope
    Access issuance bu case’te desteklenmez
  4. Code ile access sonucu ayrıldı

    Equality branch’inde code predicate olumsuzdur. Client code alias’ının elinde bulunmasını access-A oluştu diye yorumlayamaz; AS sonucu ayrı kanıttır.

    Grant/code observation
    Code acceptance=false
    AS contract review
    Known: expiry boundary denial
    Acceptance scope
    No inferred access token
  5. Correlation kanıtı kapsamlandı

    Profile one-use state ve browser-bound transaction seçer. Code matrix bu client callback correlation’ın runtime’da uygulandığını veya gerçek AS interoperability’yi ölçmez.

    Grant/code observation
    Selected: state + browser binding
    AS contract review
    Declared AS predicates
    Acceptance scope
    Runtime callback evidence yok
  6. AS hükmü RS hükmüne dönüşmedi

    Code deadline denial bilinir; AS’den yeni access context türetilmez. Başka grant veya önceki access alias’ının resource-server kabulü bu kayıttan çıkarılmaz.

    Grant/code observation
    Known: code expiry equality
    AS contract review
    No inferred token issuance
    Acceptance scope
    UNKNOWN: other access acceptance

Scope ledger

  1. Grant scope kaydı seçildi

    requestedScopes read ve write içerir; grantedScopes yalnız read içerir. İnceleme consent isteği ile AS grant sonucunu iki farklı observation olarak tutar.

    Grant/code observation
    Requested: read+write
    AS contract review
    Grant incelenmedi
    Acceptance scope
    Refresh scope bilinmiyor
  2. AS grant sonucu karşılaştırıldı

    access-A grantedScopes=[notes:read] olarak verilmiştir. Client UI’da write seçeneği bulunması, omitted grant’in verildiği anlamına gelmez.

    Grant/code observation
    Requested: read+write
    AS contract review
    Granted: read only
    Acceptance scope
    Refresh scope bilinmiyor
  3. Refresh recipient ve scope ayrıldı

    refresh-A yalnız AS token endpoint’ine yöneliktir ve originalScopes=[notes:read] taşır. Resource server’a credential olarak sunulacak access context değildir.

    Grant/code observation
    Refresh original: notes:read
    AS contract review
    Recipient: AS token endpoint
    Acceptance scope
    Rotation runtime yok
  4. Scope omission ile yükseltme ayrıldı

    Refresh request’inde scope parametresi omitted ise mevcut original scope için expected=true olur. notes:write istenirse expected=false’tur; omission yeni grant yaratmaz.

    Grant/code observation
    Original scope retained
    AS contract review
    Omitted/read accepted; write denied
    Acceptance scope
    No inferred scope expansion
  5. Resource action sonucu ilişkilendirildi

    RS own-note read için allow, write için scope-denied verir. Bunlar grant scope ile uyumludur; tenant/object koşulları read action’da da ayrıca gereklidir.

    Grant/code observation
    Grant: notes:read
    AS contract review
    Read allow; write scope-denied
    Acceptance scope
    Object policy ayrıca gerekir
  6. Grant scope kanıtı sınırlandı

    Bu ledger declared scopes ve finite decision sonuçlarını gösterir. Refresh rotationExecuted=false’tur; current revocation, gerçek token bytes veya ağ capture sonucu eklenmez.

    Grant/code observation
    Known: declared grant scope
    AS contract review
    Known: no scope expansion
    Acceptance scope
    UNKNOWN: runtime lifecycle

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Normal akışı dar ve denetlenebilir kur

Atlas için confidential server-side client, code flow ve S256 PKCE seçiyoruz. Transaction correlation browser’a ve seçili AS’ye bağlanır; credential ve verifier browser’a gönderilmez. Redirect URI kaydı tam karşılaştırılır; native localhost port istisnası bu web profilinde yoktur. Güncel BCP public client için PKCE’yi zorunlu, confidential client için önerilen kılar; CSRF korunması zorunludur fakat her profil aynı state mekanizmasını gerektirmez. Biz tek kullanımlık state’i ayrıca seçeriz. Çok AS’li client issuer veya ayrı redirect gibi mix-up savunmasını açıkça tasarlar.

Yeni entegrasyonda BCP’nin grant seçimlerini doğru ağırlıkla uygula: password grant MUST NOT; implicit kullanım SHOULD NOT olup yalnız belirtilen riskler giderilirse istisna tartışılır. Bu ders code profilini seçer. Minimum scopes, hedef RS audience’i ve kısa credential kullanım süresi tasarımda görünür olur. RS’de allow kararı token doğrulama, requested action ve tenant/object koşullarının birlikte doğru olmasını ister. UI kararına veya client’ın “scope var” metnine güvenilmez; kaynak ve job erişimleri aynı policy bağlamını korur.

Resource regression kanıtı

Regression matrisi olumlu own-note/read satırını ve üç ayrı olumsuz sınırı kapsar: write scope’u yok, audience farklı, foreign tenant. Code zaman sınırını 1100 anında expired, 1099’da geçerli olarak sınarız; bu seçili fixture’ın zero-leeway kuralıdır. Sonuç kayıtlarında alias, karar adı ve güvenli correlation bulunur, code veya token bytes bulunmaz. Bu model check’i gerçek AS interoperability’si, token signature testi ya da kullanıcı lab doğrulaması değildir; bunlar ayrı uygulama ve kanıt ister.

ŞİMDİ VAKAYA UYGULA

AS grant’i hangi RS resource kararını tamamlamaz?

Atlas exporter için code, access ve refresh alias’ları farklı recipients ve purposes taşır. Requested scope, granted scope ve object permission ayrı tutulur.

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

Atlas delegation karar tablosu

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "profile": {
    "clientType": "confidential server-side",
    "flow": "authorization_code",
    "pkce": "S256",
    "oneUseStateSelected": true,
    "browserBoundTransaction": true,
    "actualProtocolRun": false,
    "actualTokensIncluded": false,
    "actualSignatureVerification": false
  },
  "actors": {
    "resourceOwner": "Mina",
    "client": "atlas-exporter",
    "authorizationServer": "https://id.example.org",
    "resourceServer": "notes-api"
  },
  "timeline": [
    "client creates AS/browser-bound transaction",
    "browser visits AS authorization endpoint",
    "AS authenticates owner and decides grant",
    "browser follows code callback",
    "client validates transaction correlation",
    "client exchanges code at token endpoint",
    "client receives access token plus optional refresh token",
    "RS validates token context and requested resource"
  ],
  "code": {
    "alias": "code-A",
    "clientId": "atlas-exporter",
    "redirectUri": "https://atlas.example.org/callback",
    "issuedAt": 1000,
    "expiresAt": 1100,
    "used": false,
    "pkceBindingDeclared": true
  },
  "codeCases": [
    {
      "name": "normal",
      "now": 1050,
      "clientMatches": true,
      "redirectMatches": true,
      "pkceMatches": true,
      "used": false,
      "expected": true,
      "clientAuthenticated": true
    },
    {
      "name": "last-valid",
      "now": 1099,
      "clientMatches": true,
      "redirectMatches": true,
      "pkceMatches": true,
      "used": false,
      "expected": true,
      "clientAuthenticated": true
    },
    {
      "name": "expiry-equality",
      "now": 1100,
      "clientMatches": true,
      "redirectMatches": true,
      "pkceMatches": true,
      "used": false,
      "expected": false,
      "clientAuthenticated": true
    },
    {
      "name": "already-consumed",
      "now": 1050,
      "clientMatches": true,
      "redirectMatches": true,
      "pkceMatches": true,
      "used": true,
      "expected": false,
      "clientAuthenticated": true
    },
    {
      "name": "binding-unmet",
      "now": 1050,
      "clientMatches": true,
      "redirectMatches": true,
      "pkceMatches": false,
      "used": false,
      "expected": false,
      "clientAuthenticated": true
    },
    {
      "name": "client-auth-unmet",
      "now": 1050,
      "clientMatches": true,
      "redirectMatches": true,
      "pkceMatches": true,
      "clientAuthenticated": false,
      "used": false,
      "expected": false
    }
  ],
  "access": {
    "alias": "access-A",
    "representation": "opaque alias, metadata is declarative validated context",
    "audience": "notes-api",
    "requestedScopes": [
      "notes:read",
      "notes:write"
    ],
    "grantedScopes": [
      "notes:read"
    ],
    "expiresAt": 2000
  },
  "refresh": {
    "alias": "refresh-A",
    "recipient": "AS token endpoint only",
    "optional": true,
    "clientBound": true,
    "originalScopes": [
      "notes:read"
    ],
    "rotationExecuted": false
  },
  "refreshCases": [
    {
      "requestedScopes": [
        "notes:read"
      ],
      "expected": true
    },
    {
      "requestedScopes": [],
      "expected": true,
      "scopeParameterOmitted": true
    },
    {
      "requestedScopes": [
        "notes:write"
      ],
      "expected": false
    }
  ],
  "resourceCases": [
    {
      "case": "normal",
      "audience": "notes-api",
      "action": "read",
      "requiredScope": "notes:read",
      "now": 1050,
      "sameTenant": true,
      "ownerMatches": true,
      "expected": "allow"
    },
    {
      "case": "scope-denied",
      "audience": "notes-api",
      "action": "write",
      "requiredScope": "notes:write",
      "now": 1050,
      "sameTenant": true,
      "ownerMatches": true,
      "expected": "scope-denied"
    },
    {
      "case": "wrong-audience",
      "audience": "archive-api",
      "action": "read",
      "requiredScope": "notes:read",
      "now": 1050,
      "sameTenant": true,
      "ownerMatches": true,
      "expected": "audience-denied"
    },
    {
      "case": "foreign-tenant",
      "audience": "notes-api",
      "action": "read",
      "requiredScope": "notes:read",
      "now": 1050,
      "sameTenant": false,
      "ownerMatches": true,
      "expected": "object-denied"
    }
  ]
}
actors
Role sahipliği; dört rol ayrı karardır.
code
Client/redirect/time/use/PKCE bağları; code bytes değildir.
access
Granted scope ve RS audience bağlamı; JWT claim iddiası değildir.
refreshCases
İlk grant’i aşmayan scope kümeleri; credential yenileme çalıştırılmaz.
resourceCases
Scope ile object policy’yi ayrı tutan selected kararlar.

Bütün code/token değerleri alias’tır. Scene callback sonrasından başlar; browser, gerçek AS, TLS, PKCE hash üretimi, signature/introspection ve refresh çalışmaz.

İki yanlış kanı

Access token bir kullanıcı login belgesidir.

OAuth access token RS erişimi içindir; standart authentication bilgisini OIDC ID token ekler.

Read scope’u varsa kullanıcının bütün notları açılır.

RS her request’te audience, scope ve tenant/object policy’yi birlikte denetler.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

Client notes:read ve notes:write istedi, fakat access context yalnız notes:read içeriyor. Write yapılabilir mi?

  1. Hayır. Sonuç scope-denied.
  2. Evet. Authorization request’inde write istemek yeterlidir.
Gerekçeli cevabı oku

Hayır. Sonuç scope-denied. — AS yalnız read scope’unu vermiştir. Scope istemek izin oluşturmaz; RS, write için gereken scope’un verilip verilmediğini denetler.

Code, refresh ve access alias’ları aynı endpoint’e mi gönderilir?

Dersten seçilen artifact alanları; öğretim örneği

code.clientId
atlas-exporter
refresh.recipient
AS token endpoint only
access.audience
notes-api
  1. RS, refresh alias’ını API request’inde access yerine kabul eder.
  2. Code exchange ve refresh AS’ye; access notes-api’ye aittir.
Gerekçeli cevabı oku

Code exchange ve refresh AS’ye; access notes-api’ye aittir. — Code exchange ve refresh, AS token endpoint’inde gerçekleşir. Access token resource server içindir; bu örnekte refresh alıcısı yalnız AS olarak tanımlıdır.

Audience ve read scope geçerli, fakat istenen resource başka tenant’a ait. Object kontrolü neden hâlâ gerekir?

Gerekçeli cevabı oku

RS önce audience, zaman ve verilen scope’lar açısından token context’ini değerlendirir; sonra istenen object için tenant/owner policy’sini uygular. Read scope başka tenant’ın bütün note kayıtlarını açmaz. Authorization code, browser callback aşamasında taşınır; API access token değildir. Buradaki kayıtlar bu kararları açıklayan örneklerdir; gerçek OAuth akışı çalıştırılmamıştır.

□ Scope’u belirli bir object için erişim izni saymadım.

□ Authorization code ile API access token’ı ayırdım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam