Sorunuzun yanıtı kod düzeyinde, protokol düzeyinde veya mimari düzeyde olabilir. Protokol seviyesi sorunlarının çoğunu burada özetlemeye çalışacağım çünkü bu genellikle artıları ve eksileri analizinde kritiktir. Unutmayın OAuth2 çok daha fazla olduğunu Kaynak Sahibi Şifre Kimlik Bilgileri , şartnamesine göre, "eski veya geçiş nedenlerle" için vardır, "Diğer hibe türlerinden daha yüksek riskli" olarak kabul edilir ve şartname açıkça belirtmektedir ki istemciler ve yetkilendirme sunucuları "Bu hibe türünün kullanımını en aza indirmeli ve mümkün olduğunda diğer hibe türlerini kullanmalıdır".
Temel kimlik doğrulaması yerine ROPC kullanmanın birçok avantajı vardır, ancak buna girmeden önce OAuth2 ve temel kimlik doğrulaması arasındaki temel protokol farkını anlayalım. Lütfen bunları açıkladığım için bana katlanın ve daha sonra ROPC'ye geleceğim.
Kullanıcı kimlik doğrulama akışları
OAuth2 spesifikasyonunda tanımlanan dört rol vardır. Örneklerle bunlar:
- Kaynak sahibi: Örneğin, sizin durumunuzda, bazı kullanıcıların REST API'sine farklı erişim seviyeleri olabilir;
- İstemci: genellikle kullanıcının kullandığı uygulama ve kullanıcıya hizmet sağlamak için kaynağa erişmesi gerekir;
- Kaynak sunucu: durumunuzdaki REST API'sı; ve
- Yetkilendirme sunucusu: Kullanıcının kimlik bilgilerinin sunulduğu ve kullanıcının kimliğini doğrulayacak sunucu.
Bir istemci uygulaması çalıştırıldığında, kullanıcıya dayalı kaynaklara erişim izni verilir. Bir kullanıcının yönetici ayrıcalıkları varsa, REST API'sinde kullanıcının kullanabileceği kaynaklar ve işlemler yönetici ayrıcalıkları olmayan bir kullanıcıdan çok daha fazla olabilir.
OAuth2 aynı zamanda birden çok istemciyle ve birden çok kaynak için tek bir yetkilendirme sunucusu kullanma olanağı sağlar. Örnek olarak, bir kaynak sunucu kullanıcının Facebook ile kimlik doğrulamasını kabul edebilir (bu durumda yetkilendirme sunucusu olarak işlev görebilir). Kullanıcı bir uygulamayı (yani istemciyi) çalıştırdığında, kullanıcıyı Facebook'a gönderir. Kullanıcı kimlik bilgilerini Facebook'ta yazar ve istemci kaynak sunucuya sunabileceği bir "simge" geri alır. Kaynak sunucusu jetona bakar ve Facebook'un aslında yayınladığını doğruladıktan ve kullanıcının kaynağa erişmesine izin verdikten sonra kabul eder. Bu durumda, müşteri hiçbir zaman kullanıcının kimlik bilgilerini (yani Facebook kimlik bilgilerini) görmez.
Ancak diyelim ki Facebook yerine kullanıcı kimliğinizi yönetiyorsunuz (ve bir yetkilendirme sunucunuz var), bu da müşterinize zaten jeton veriyor. Şimdi bir ortağınız olduğunu ve uygulamalarının (yani istemci) REST API'nize erişmesine izin vermek istediğinizi varsayalım. Temel kimlik doğrulama (hatta ROPC) ile, kullanıcı bu istemciye yetkilendirme sunucusuna gönderecek kimlik bilgileri sağlar. Yetkilendirme sunucusu daha sonra istemci tarafından kaynaklara erişmek için kullanılabilecek bir belirteç sağlayacaktır. Ne yazık ki, bu, kullanıcının kimlik bilgilerinin artık bu istemci tarafından da görülebileceği anlamına gelir. Ancak, bir iş ortağının başvurusunun (kuruluşunuzun dışında olabilecek) bir kullanıcının şifresini bile bilmesini istemezsiniz. Bu şimdi bir güvenlik sorunu. Bu hedefe ulaşmak için,
Bu nedenle, OAuth2 ile bu gibi durumlarda ideal olarak ROPC kullanılmayacak, bunun yerine yetkilendirme kodu akışı gibi farklı bir tane kullanılacaktır. Bu, herhangi bir uygulamayı yalnızca yetkilendirme sunucusuna sunulan kullanıcının kimlik bilgilerini bilmekten korur. Böylece, bir kullanıcının kimlik bilgileri sızdırılmaz. Aynı sorunlar temel kimlik doğrulaması için de geçerlidir, ancak bir sonraki bölümde ROPC'nin nasıl daha iyi olduğunu açıklayacağım çünkü kullanıcının kimlik bilgilerinin istemciler tarafından kalıcı erişim için ROPC'de istemci tarafından saklanması gerekmiyor.
Kullanıcı yetkilendirme sunucusuna gittiğinde, yetkilendirme sunucusunun kullanıcıdan istemcinin kendi adına kaynaklara erişmesine izin vermek isteyip istemediğini onaylamasını isteyebileceğini unutmayın. Bu nedenle, yetkilendirme sunucusu olarak adlandırılır, çünkü istemcinin kaynaklara erişmesi için yetkilendirme işlemi bu sürece dahil edilir. Kullanıcı istemciyi yetkilendirmezse, kaynaklara erişemez. Benzer şekilde, kullanıcının kaynaklara erişimi yoksa, yetkilendirme sunucusu yine de erişimi reddedebilir ve bir belirteç veremez.
Temel kimlik doğrulamasında, yetkilendirme sunucusu ve kaynak sunucusu bile tek bir varlıkta birleştirilir. Bu nedenle, kaynak sunucu kullanıcıyı yetkilendirmek ister, bu nedenle istemciden kimlik bilgilerini ister. İstemci, kaynak sunucu tarafından kullanıcının kimliğini doğrulamak için kullanılan kimlik bilgilerini sağlar. Bu, birden çok kaynak sunucunun temel olarak kullanıcıdan kimlik bilgileri gerektireceği anlamına gelir.
Jeton düzenleme
İstemciler yetkilendirme sunucusundan jeton alır, onları saklar ve kaynaklara erişmek için bunları kullanır (aşağıda jetonlarla ilgili daha fazla ayrıntı). İstemciler asla kullanıcının şifresini bilmez (ROPC dışındaki akışlarda) ve saklanması gerekmez. ROPC'de, istemciler kullanıcının parolasını bilmelerine rağmen, kaynaklara erişmek için bu belirteçleri kullandıkları için yine de saklamaları gerekmez. Buna karşılık, temel kimlik doğrulamasında, bir istemcinin her oturumda kimlik bilgileri sağlaması istemiyorsa, kullanıcının bir dahaki sefere verebilmesi için kullanıcının parolasını saklaması gerekir. İstemci yalnızca bir web uygulaması olmadıkça, temel kimlik doğrulamanın kullanılmasının en büyük dezavantajı bu durumda çerezler bu endişelerin bazılarını ele alabilir. Yerel uygulamalarda, bu genellikle bir seçenek değildir.
OAuth2'nin tokenlerin nasıl verildiği ve nasıl çalıştığı ile ilgili başka bir yönü daha var. Bir kullanıcı yetkilendirme sunucusuna kimlik bilgileri verdiğinde (ROPC'de bile), yetkilendirme sunucusu iki tür belirtecin bir veya daha fazlasını verebilir: 1) erişim belirteci ve 2) yenileme belirteci.
Erişim belirteçleri, onaylandıktan sonra kaynaklara erişim sağlayacak kaynak sunucuya gönderilir ve genellikle kısa bir ömürleri vardır, örneğin 1 saat. Yenileme belirteçleri, süresi dolduğunda başka bir erişim belirteci almak için istemci tarafından yetkilendirme sunucusuna gönderilir ve genellikle uzun bir ömre sahiptir (örneğin birkaç gün ila aylar hatta yıllar).
İstemci kaynak sunucusuna erişim belirtecini sağladığında, belirtecine bakar ve doğruladıktan sonra erişime izin verilip verilmeyeceğini belirlemek için belirtecin içine bakar. Erişim belirteci geçerli olduğu sürece istemci bunu kullanmaya devam edebilir. Kullanıcının uygulamayı kapatıp ertesi gün başlattığını ve erişim belirtecinin süresinin dolduğunu varsayalım. Artık istemci, yetkilendirme sunucusunu arayacak ve süresi dolmadığı varsayılarak yenileme jetonunu sunacaktır. Yetkilendirme sunucusu, belirteci zaten yayınladığından, doğrular ve kullanıcının kimlik bilgilerini tekrar sağlaması gerekmediğini belirleyebilir ve böylece istemciye başka bir erişim belirteci verir. İstemci artık kaynak sunucuya tekrar erişebilir. Facebook ve Twitter için istemci uygulamaları genellikle bir kez kimlik bilgilerini ister ve daha sonra kullanıcının kimlik bilgilerini tekrar vermesini gerektirmez. Bu uygulamaların hiçbir zaman kullanıcıların kimlik bilgilerini bilmeleri gerekmez ve kullanıcı uygulamayı her başlattığında kaynaklara erişebilir.
Artık kullanıcı yetkilendirme sunucusuna gidebilir (örneğin Facebook kullanıcı profilinde), istemci uygulamalarını etkilemeden şifreyi değiştirebilir. Hepsi düzgün çalışmaya devam edecektir. Kullanıcı, yenileme belirteçleri olan bir uygulamaya sahip olduğu bir cihazı kaybederse, yetkilendirme sunucusuna (örn. Facebook), yetkilendirme sunucusunun (örn. Facebook) var olan herhangi bir onurlandırılmadan gerçekleştireceği uygulamaların "oturumunu kapatmasını" söyleyebilir. belirteçleri yenileyin ve kullanıcıyı bu uygulamalar aracılığıyla kaynaklara erişmeye çalıştıklarında kimlik bilgilerini tekrar sağlamaya zorlayın.
JWT , genellikle OAuth2 ve OpenID Connect ile kullanılan simge biçimidir. Simgeyi imzalama ve doğrulama yöntemleri, başka bir çözüm uygulayan her kaynak sunucusu yerine kütüphaneler için standartlaştırılmıştır. Bu nedenle, avantaj, incelenmiş ve desteklenmeye devam edilen kodun yeniden kullanılabilirliğinde yatmaktadır.
Güvenlik uygulamaları
Yukarıdaki senaryolardan herhangi biri resimde olduğunda temel kimlik doğrulama daha zayıf olacaktır. Ayrıca, uygulamalarındaki ortak güvenlik açıklarından kaçınmak için içindeki önerileri kullanabilen geliştiriciler için OAuth2 için kapsamlı bir tehdit modeli de bulunmaktadır. Tehdit modelinden geçerseniz, uygulamayla ilgili birçok güvenlik açığının (açık yeniden yönlendirici ve CSRF gibi) de kapsandığını göreceksiniz. Bu yanıtta temel kimlik doğrulamasına karşı olanları karşılaştırmadım.
OAuth2'nin son büyük avantajı, protokolün standartlaştırılmış olması ve çoklu yetkilendirme sunucularının, istemcilerinin ve kaynak sunucularının onurlandırmasıdır. Geliştiriciler, uygulamalarda güvenlik sorunları bulunduğundan, birlikte çalışabilirlik sağlarken güncellenen çok sayıda kütüphane mevcuttur.
Sonuç
Yeni bir uygulama olan IMO yazıyorsanız, ideal durum, içlerinde bulunan sorunlar nedeniyle hem temel kimlik doğrulamasından hem de ROPC'den kaçınmak olacaktır. Bununla birlikte, her uygulamanın farklı ihtiyaçları, zaman çizelgeleri, geliştirici yeterliliği vb. Vardır, bu nedenle karar duruma göre yapılır. Ancak, temel kimlik doğrulamasından daha fazlasına ihtiyacınız olmasa bile, onu seçerek, kendinizi genişletmesi kolay olmayan bir mimariye kilitleyebilirsiniz (örneğin, gelecekte birden fazla sunucunuz varsa, mutlaka sahip olmak istemezsiniz) kullanıcı, her birine kimlik bilgileri sağlar, daha sonra yalnızca bir kez yetkilendirme sunucusuna sağlar; bu da belirteçleri dağıtabilir vb.)
Kimlik bilgilerinin tel üzerinden nasıl gönderildiği hakkındaki yorumunuzu ele almadığımı unutmayın, çünkü bunlar TLS veya benzer bir protokol veya mülkiyet kanıtı vb. Kullanılarak güvence altına alınabilir. Daha önce önerildiği gibi, temel 64 kodlaması 0 güvenliktir, lütfen bununla kandırılmak. Yukarıda bahsedilen farklılıklar genellikle mimari düzeydedir ve bu yüzden odaklandığım yer budur çünkü mimari bir kez uygulandığında değişmesi en zor olanıdır.
Azure Active Directory B2C Basic , üzerinde çalıştığım ve yakın zamanda genel önizleme için piyasaya sürülen bir hizmet, üçüncü taraf uygulamasının AAD'yi sosyal IDP'lerle (Facebook, Google vb.) Birlikte çalışabilirlikle yetkilendirme sunucusu olarak kullanmasına izin veriyor. Ayrıca, kullanıcıların sosyal IDP'leri kullanmak yerine kendi hesaplarını oluşturmalarına olanak tanır ve bunlar daha sonra kimlik doğrulama amacıyla kullanılabilir. Bunun gibi başka birkaç hizmet daha var (örneğin tanıdığım bir diğeri auth0) geliştiriciler tarafından kimlik doğrulaması ve kullanıcı yönetimi için uygulamaları ve kaynakları tamamen dış kaynak sağlamak amacıyla kullanılabilir. Yukarıda bahsettiğim aynı protokol özellikleri, geliştiriciler tarafından yetkilendirme sunucusunu (AAD), bir kaynağı (örneğin REST API'lerini), istemciyi (örneğin mobil uygulamalarını) ve kullanıcıları ayırmak için kullanılır. Umarım bu açıklama biraz yardımcı olur.