Üçüncü taraf OAuth sağlayıcıları aracılığıyla kimlik doğrulamasına izin verirken (DotNetOpenAuth kullanarak) REST API'mi OAuth ile koruma


138

Basit bir REST API'si olan bir ürünüm var, böylece ürün kullanıcıları web kullanıcı arayüzümü kullanmadan ürünün özellikleriyle doğrudan entegre olabilirler.

Son zamanlarda, ürünümün kullanıcılarının bu üçüncü taraf uygulamasını kullanarak verilerine erişmesine izin vermek için masaüstü istemcilerini API ile entegre etme konusunda çeşitli üçüncü taraflardan ilgi duyuyorum.

Twitter'ı kullanmak isteyen uygulamaların, Twitter tarafından barındırılan ve bu kullanıcının verilerine erişmek için belirli bir uygulama izni veren bir giriş sayfası kullanarak kimlik doğrulaması yaptığını gördüm. "İzin ver" veya "Reddet" düğmesini tıklarsınız ve kimlik doğrulama işlemi tamamlanır. Facebook söyleyebileceğim en iyi mekanizmayı kullanıyor.

Daha fazla araştırma üzerine, bu eylem OAuth gibi görünüyor ve benim API .Net tabanlı olduğunu görmek, ben DotNetOpenAuth kullanmak ve benzer bir mekanizma sağlamak gerektiğini düşünüyorum. Ne yazık ki örnekler seyrek olarak belgelenmiştir (eğer varsa) ve çevrimiçi bulabileceğim tek öğretici, üçüncü taraf sağlayıcı kullanarak web sitenize giriş yapabilmeniz için kullanıcılarınız için bir giriş mekanizması sağlamanıza odaklanmış gibi görünmektedir.

Gerçekten ne yapmak istiyorum benim REST API benim web uygulaması için tüm temel kimlik doğrulama ve iş mantığı işlemek ve başlık altında, benim web uygulaması aslında sadece OAuth üzerinden API kullanan başka bir uygulama var. Kullanıcılar web sitesinde doğrudan kullanıcı adlarını ve şifrelerini kullanarak veya MyOpenID veya Facebook gibi bir üçüncü taraf sağlayıcı aracılığıyla kimlik doğrulaması yapar ve ardından web sitesi bir şekilde REST API'sine karşı kimlik doğrulaması yapmak için döndürülen jetonu kullanır.

Mimari Diyagram

Temelde bir şekilde bir OAuth hizmetini barındırmak için API'ma ihtiyacım var gibi görünüyor, ancak kullanıcıların üçüncü taraf bir OAuth hizmetini kullanmasını sağlıyor. Yardımcı olamıyorum ama OAuth üzerinde aşırı karmaşık olup olmadığım ya da yapmaya çalıştığım şeyin bir şeyler yapmak için iyi ya da kötü bir yol olup olmadığına karar vermek için yeterince kavrayışım olmadığını düşünüyorum.

Birisi bana atmam gereken adımlar hakkında en azından geniş bir genel bakış verebilir mi ya da bunun gerçekleşmesi için nelere bakmalıyım? Ya da beni bazı derslere yönlendiriyor musunuz? Ya da teklifimi patlat ve bana (mimari olarak) bunların hepsini yanlış yaptığımı söyle?


Merhaba Nathan, burada tarif ettiğiniz gibi benzer bir senaryo ile mücadele ediyorum ve API stackoverflow.com/ sorular / 16855131 /…
Jammer

Yanıtlar:


123

İlk önce kimlik doğrulama ve yetkilendirme arasındaki farkı vurgulamak istiyorum:

Bir kullanıcı , kullanıcı adı + şifre gibi bazı kimlik bilgileri vererek web sitenizin kimliğini doğrular. OpenID, kullanıcının başka bir hizmette kimliğini doğrulayarak yer değiştirmesine izin verir ve bu da kullanıcının kimliğini kullanıcının adına web sitenize verir. Siteniz üçüncü taraf hizmetine (OpenID Sağlayıcısı) güvenir ve bu nedenle oturum açmış kullanıcıyı dikkate alır.

Bir hizmet veya uygulama web sitenizin kimliğini doğrulamaz - en azından tipik olarak. Bir kullanıcı, bir hizmete veya uygulamaya kullanıcının verilerine erişme yetkisi verir . Bu genellikle servis sağlayıcısının yetkilendirilmesini isteyen uygulama tarafından yapılır, daha sonra kullanıcıyı ilk önce kimliğini doğrulayan servis sağlayıcıya gönderilir (böylece servis sağlayıcı kiminle konuştuğunu bilir) ve sonra kullanıcı siteye "evet, [uygulama] için [kısıtlı bir şekilde] verilerime erişmek iyi "". O andan itibaren, uygulama bir yetkilendirme belirteci kullanıyorservis sağlayıcı sitesindeki kullanıcı verilerine erişmek için. Uygulamanın kullanıcıymış gibi kendini doğrulamamasına dikkat edin, ancak hizmetin belirli bir kullanıcının verilerine erişmesine izin verildiğinden emin olmak için başka bir kod kullanır.

Dolayısıyla bu ayrım netleştikçe sitenizde kimlik doğrulama ve yetkilendirme hakkında tamamen bağımsız kararlar verebilirsiniz. Örneğin, kullanıcılarınızın tüm kullanıcı adı + şifre, OpenID ve Facebook ile giriş yapabilmesini istiyorsanız bunu yapabilirsiniz. Tamamen dikey bir karar, uygulamaları nasıl yetkilendirdiğinizdir (bunun için kullanabileceğiniz birçok protokol vardır, elbette OAuth oldukça popülerdir).

OpenID kullanıcı kimlik doğrulamasına odaklanmıştır . OAuth uygulama yetkilendirmesine odaklanmıştır . Ancak, Facebook ve Twitter gibi birkaç hizmet, kimlik doğrulama için OpenID ve yetkilendirme için OAuth kullanmak yerine kimlik doğrulama ve yetkilendirme için OAuth kullanmayı seçti .

Şimdi kendi projeniz için, VS Gallery'de bulunan ASP.NET MVC 2 OpenID web sitesi (C #) proje şablonuna göz atmanızı şiddetle tavsiye ederim . Kutudan çıkar çıkmaz OpenID kimlik doğrulaması ve OAuth Servis Sağlayıcısı desteği ile birlikte gelir . Bu, kullanıcılarınızın OpenID ile giriş yapabileceği ve 3. taraf uygulamaların ve hizmetlerin, web sitenize API çağrıları yapmak ve kullanıcı verilerine erişmek için OAuth'u kullanabileceği anlamına gelir.

Başladıktan sonra bu proje şablonuna eklemek istediğiniz gibi görünen şey, kullanıcılarınızın OpenID gibi kullanıcı adı + şifre ile giriş yapabilmesidir. Ayrıca, Facebook ve Twitter'ın kullanıcılarınız için bir seçenek olmasını istiyorsanız, OpenID standardını kullanmadığı için bunu da uygulamalısınız. Ancak DotNetOpenAuth indirmesi, Twitter ve Facebook ile giriş yapmak için örnekler içerir, böylece orada bazı rehberlikleriniz olur.

Yetkilendirme cephesinde yapacak bir şeyiniz olmayacağından şüpheleniyorum. Daha önce söylediğim gibi OAuth ile birlikte geliyor ve bu muhtemelen sizin için yeterli olacaktır.


Ayrıntılı cevap için teşekkürler, verdiğiniz bağlantıyı kontrol edeceğim. Açıklamak için, API'm web sitemin bir alt alanından çıkıyor, bu yüzden teknik olarak aynı uygulama değil.
Nathan Ridley

1
Kaynaklar uygulamaya ait olduğunda, uygulamanın kullanıcı yerine yetkilendirme sunucusunda kendini doğrulaması gereken sıra dışı senaryo ortaya çıkar. Örneğin, bir facebook uygulaması, bir süre boyunca topladığı uygulama bilgileri ve istatistiksel veriler için fb resouce sunucusundan talepte bulunabilir. Bu senaryo, OAuth2
SenG

REST API'sını oAuth olmadan kullanabilir miyim? @Andrew Arnott
Gem

Elbette. Tüm dinlenme API'ları kimlik doğrulaması gerektirmez. Ve oauth tek yetki mekanizması değildir.
Andrew Arnott

11

Her şeyden önce. API'nizin ne olduğunu zihinsel olarak kimlik doğrulama yöntemlerinden ayırmanız gerekir.

API'niz temel olarak kaynaklar ve bu kaynakları işlemek için kullanılan yöntemlerdir. Ayrıca, API'nize erişimi doğrulamak için çeşitli yöntemleriniz olabilir.

OAuth böyle bir kimlik doğrulama mekanizmasıdır. Bir OAuth sağlayıcısı olmak harika, spesifikasyonun anlaşılması biraz zor olsa da, özellikle imzalarla ilgili parçalar. OAuth uygulandıktan sonra, istemci uygulamalarının kimlik doğrulaması genellikle kolaydır, çünkü çoğu dilde mevcut olan çok sayıda "açık kaynak, sadece uygula" kütüphaneleri vardır.

OAuth'un artıları ve eksileri bir süredir tartışılıyor. Ancak kendi fikrinizi oluşturmak için OAuth spesifikasyonundan sorumlu kişilerden biri olan Eran Hammer-Lahav tarafından yazılmış bu kesin kılavuzu okumanızı tavsiye ederim .

Gördüğüm kadarıyla OAuth'a tek gerçek alternatif OAuth 2.0 ve sadece basit temel kimlik doğrulama.

Bunun dışında, Open-ID veya facebook kimliği vb. Kullanarak kimlik doğrulaması hakkında konuşuyorsunuz. Bu, kendinize sormanız gereken başka bir soru. Ancak gerçekten API'lerin ve OAuth'un kapsamı dışında kalıyor. Bana göre bu, hizmetinizde bir kullanıcı yaratma meselesi. Yanılıyor olabilirim.


REST API'sını oAuth olmadan kullanabilir miyim? @Jon Nylander
Gem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.