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.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Okuma izni
- 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
- 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
- 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
- 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
- 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
- İş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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- İş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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- İş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
- 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
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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?
- Hayır. Sonuç scope-denied.
- 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
- RS, refresh alias’ını API request’inde access yerine kabul eder.
- 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
- RFC 6749 — The OAuth 2.0 Authorization Framework§1.1 Roles; §1.2 Protocol Flow; §1.3.1 Authorization Code · §1.4 Access Token; §1.5 Refresh Token · §3.2.1 Client Authentication; §3.3 Access Token Scope · §4.1.1–4.1.4 Authorization Code Grant · §5.1 Successful Response; §6 Refreshing an Access Token; §7 Accessing Protected Resources
- RFC 9700 — Best Current Practice for OAuth 2.0 Security§2.1 Protecting Redirect-Based Flows; §2.1.1 Authorization Code Grant · §2.1.2 Implicit Grant; §2.2.1 Access Tokens; §2.2.2 Refresh Tokens · §2.3 Access Token Privilege Restriction; §2.4 Resource Owner Password Credentials Grant; §2.5 Client Authentication
- RFC 7636 — Proof Key for Code Exchange by OAuth Public Clients§4.3 Client Sends the Code Challenge; §4.4 Server Returns the Code · §4.5 Client Sends Code and Verifier; §4.6 Server Verifies code_verifier
- RFC 6750 — The OAuth 2.0 Authorization Framework: Bearer Token Usage§1.2 Terminology: Bearer Token · §2.1 Authorization Request Header Field · §2.3 URI Query Parameter security qualifications
- OWASP OAuth2 Cheat SheetTerminology; OAuth 2.0 Essential Basics · PKCE — Proof Key for Code Exchange Mechanism · Access Token Privilege Restriction
- OWASP Authorization Cheat SheetRecommendations / Enforce Least Privileges · Recommendations / Deny by Default; Validate the Permissions on Every Request
- OpenID Connect Core 1.0 — Final incorporating errata set 2§1 Introduction; §1.2 Terminology: OP and RP