OpenID Connect (OIDC) Nedir?
Kısa tanım
OpenID Connect (OIDC), OAuth 2.0'ın üzerine kurulmuş bir kimlik doğrulama katmanıdır. OAuth bir uygulamaya kullanıcı adına kaynaklara erişim yetkisi verirken OIDC, kullanıcının kim olduğunu ve nasıl doğrulandığını da güvenilir biçimde bildirir. Bunun için kimlik sağlayıcı, istemci uygulamaya özel, imzalı bir JWT olan ID token üretir. “Google ile giriş yap” gibi tek oturum açma senaryolarının çoğu OIDC ile çalışır; spesifikasyonu OpenID Foundation yayımlar.
Diğer adları: OIDC, OpenID, OpenID Connect 1.0, ID token

OAuth'un yanıtlamadığı soru: “Bu kişi kim?”
OAuth 2.0, bir uygulamaya “şu API'de, şu izinlerle işlem yapabilirsin” diyen bir yetkilendirme çerçevesidir. Ortaya çıkan erişim token'ı API için üretilir; istemci uygulamaya kullanıcının kimliğini standart ve doğrulanabilir bir biçimde söylemez. Buna rağmen pek çok uygulama yıllarca “token aldıysam kullanıcı giriş yapmıştır” varsayımıyla OAuth'u giriş sistemi gibi kullandı. Bu yaklaşım, başka bir uygulama için alınmış bir token'ın sizin uygulamanıza sunulması gibi hatalara açıktır.
OpenID Connect bu boşluğu standart bir yanıtla kapatır. Rolleri de kendi adlarıyla anar: kimliği doğrulayan taraf OpenID Provider (OP), kimlik bilgisine güvenen uygulama Relying Party (RP)'dir.
Akış: openid kapsamı ve ID token
OIDC ayrı bir protokol kurmaz, OAuth akışlarına küçük eklemeler yapar. En yaygın kullanılan authorization code akışında istemci kullanıcıyı yönlendirirken scope değerine openid ekler; bu değer olmadan istek bir OIDC isteği sayılmaz. Gerekirse profile ve email gibi kapsamlar da istenir ve tekrar saldırılarına karşı bir nonce değeri gönderilir. Kullanıcı kimlik sağlayıcıda giriş yapıp onay verdikten sonra istemci kodu token endpoint'inde takas eder ve şu yapıda bir yanıt alır:
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"expires_in": 3600,
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.eyJpc3Mi..."
}ID token'ın içinde ne var?
ID token her zaman bir JWT'dir. Spesifikasyona göre iss (token'ı üreten kimlik sağlayıcı), sub (kullanıcının o sağlayıcıdaki kalıcı kimliği), aud (token'ın kime üretildiği; istemcinin client_id değerini içermek zorundadır), exp ve iat alanları zorunludur. Duruma göre auth_time (girişin ne zaman yapıldığı), nonce, acr ve amr (hangi doğrulama yöntemlerinin kullanıldığı, örneğin parola ile birlikte tek kullanımlık kod) da eklenir.
Pratik bir kural: kullanıcıyı kendi veritabanınızda iss ve sub ikilisiyle eşleştirin, e-posta adresiyle değil. E-posta değişebilir, hatta bir sağlayıcıda başka bir kişiye yeniden atanabilir; sub ise spesifikasyon gereği o sağlayıcı içinde hiçbir zaman başka birine verilmez.
ID token'ı doğrulamak
- İmzayı, sağlayıcının yayınladığı açık anahtarlarla (JWKS) doğrulayın. Anahtarların ve endpoint'lerin adresleri
/.well-known/openid-configurationkeşif belgesinde bulunur. issdeğerinin beklenen sağlayıcıyla birebir eşleştiğini kontrol edin.audiçinde kendiclient_id'nizin bulunduğundan emin olun.expgeçmişte kalmışsa token'ı reddedin.- İstekte nonce gönderdiyseniz, token'daki değerin sizin oturumunuzda sakladığınız değerle aynı olduğunu kontrol edin.
Doğrulama başarılıysa uygulama kendi oturumunu başlatır. Ad, profil fotoğrafı gibi ek bilgilere ihtiyaç varsa erişim token'ıyla UserInfo endpoint'i çağrılabilir. Ayrıntılar OpenID Connect Core 1.0 spesifikasyonundadır.
ID token ile access token aynı şey değildir
| ID token | Access token | |
|---|---|---|
| Kime hitap eder? | İstemci uygulamaya | Kaynak sunucusuna (API) |
| Biçim | Her zaman JWT | Opak bir dize veya JWT olabilir |
| Anlattığı şey | Kullanıcının kim olduğu ve nasıl giriş yaptığı | Hangi işlemlere izin verildiği |
| API'ye gönderilir mi? | Hayır | Evet, Authorization başlığında |
ID token'ı API çağrılarında taşıyıcı token gibi kullanmak sık yapılan bir hatadır; API'ler kendileri için üretilmiş erişim token'ını beklemelidir. Kurumsal tek oturum açma tarafında aynı ihtiyacı XML tabanlı SAML 2.0 da karşılar; yeni web ve mobil projelerinde ise OIDC daha yaygın tercihtir.

