RESTful Kimlik Doğrulaması


745

RESTful Kimlik Doğrulaması ne anlama geliyor ve nasıl çalışıyor? Google'da iyi bir genel bakış bulamıyorum. Tek anlayışım, oturum anahtarını (remeberal) URL'ye iletmenizdir, ancak bu korkunç bir şekilde yanlış olabilir.


3
Google Restful Authentication'ı kullandığımda bir düzine RoR eklentisi buluyorum. Bunların aradığın DEĞİL olduğunu varsayıyorum. RoR değilse, hangi dil? Hangi web sunucusu?
S.Lott

2
HTTPS kullanıyorsanız korkunç bir şekilde yanlış olmaz. URL ile birlikte HTTP isteğinin tamamı şifrelenir.
Bharat Khatri

4
@BharatKhatri: Evet olur. Hassas bilgileri hiçbir zaman kullanıcının görebildiği URL'ye aktarmam. Bu bilgilerin pratik amaçlarla sızması çok daha olasıdır. HTTPS kazara sızıntıya yardımcı olamaz.
Jo So

2
@jcoffland: Gerçek RESTful kimlik doğrulaması ile ne demek istiyorsun? Ben sadece kabul edilen cevaptan üçüncü yolu uyguladığım için ilgi duyuyorum, ancak bundan memnun değilim (URL'deki ek parametreyi sevmiyorum).
BlueLettuce16

4
bazı insanlar bunu çözmek için jwt.io/introduction kullanıyor .. Durumumu çözmek için şu an bu konuda araştırma yapıyorum: stackoverflow.com/questions/36974163/… >> Umarım bu iyi çalışır.
toha

Yanıtlar:


586

RESTful Client-Server mimarisinde kimlik doğrulamanın nasıl ele alınacağı bir tartışma konusudur.

Genellikle, HTTP dünyası üzerinden SOA'da şu yollarla elde edilebilir:

  • HTTPS üzerinden HTTP temel yetkilendirme;
  • Çerezler ve oturum yönetimi;
  • HTTP üstbilgilerinde belirteç (ör. OAuth 2.0 + JWT);
  • Ek imza parametreleriyle Sorgu Kimlik Doğrulaması.

Yazılım mimarinize en iyi şekilde uyması için bu teknikleri uyarlamanız veya daha iyi karıştırmanız gerekir.

Her kimlik doğrulama düzeninin, güvenlik ilkenizin ve yazılım mimarinizin amacına bağlı olarak kendi PRO'ları ve CON'ları vardır.

HTTPS üzerinden HTTP temel yetkilendirme

Standart HTTPS protokolünü temel alan bu ilk çözüm, çoğu web hizmeti tarafından kullanılır.

GET /spec.html HTTP/1.1
Host: www.example.org
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Uygulanması kolaydır, varsayılan olarak tüm tarayıcılarda bulunur, ancak Tarayıcıda görüntülenen korkunç kimlik doğrulama penceresi gibi devam eden (burada LogOut benzeri bir özellik yoktur) gibi bazı dezavantajları vardır, bazı sunucu tarafı ek CPU tüketimi, ve kullanıcı adı ve parolanın (HTTPS üzerinden) Sunucuya iletilmesi (parolanın klavye girişi sırasında yalnızca istemci tarafında kalması ve Sunucuda güvenli karma olarak saklanması daha güvenli olmalıdır) .

Özet Kimlik Doğrulaması kullanabiliriz , ancak MiM veya Tekrar saldırılarına karşı savunmasız olduğu ve HTTP'ye özel olduğu için HTTPS de gerektirir .

Çerezlerle Oturum

Dürüst olmak gerekirse, Sunucu'da yönetilen bir oturum gerçekten Vatansız değildir.

Bir olasılık, çerez içeriğindeki tüm verileri korumak olabilir. Ve tasarım gereği, çerez Sunucu tarafında işlenir (İstemci, aslında, bu çerez verilerini yorumlamaya bile çalışmaz: sadece ardışık her istekte sunucuya geri verir). Ancak bu çerez verileri uygulama durumu verileridir, bu nedenle istemci, durumu yalnızca Vatansız bir dünyada değil sunucuda yönetmelidir.

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123

Çerez tekniğinin kendisi HTTP'ye bağlıdır, bu nedenle protokolden bağımsız olması gereken RESTful değildir, IMHO. MiM veya Replay saldırılarına karşı savunmasızdır .

Token (OAuth2) aracılığıyla verildi

Alternatif olarak, HTTP kimliklerinin içine bir istek koymak, böylece isteğin kimliği doğrulanır. Bu nedir OAuth 2.0 örneğin yapar. RFC 6749'a bakın :

 GET /resource/1 HTTP/1.1
 Host: example.com
 Authorization: Bearer mF_9.B5f-4.1JqM

Kısacası, bu bir çereze çok benzer ve aynı sorunlardan muzdariptir: vatansız değil, HTTP iletim ayrıntılarına güvenen ve MiM ve Replay dahil olmak üzere birçok güvenlik zayıflığına maruz kalan sadece HTTPS üzerinde kullanılmalıdır. Tipik olarak, bir JWT token olarak kullanılır.

Sorgu Kimlik Doğrulaması

Sorgu Kimlik Doğrulaması, her RESTful isteğini URI üzerindeki bazı ek parametrelerle imzalamaktan oluşur. Bkz bu referans makalesine .

Bu makalede şöyle tanımlanmıştır:

Tüm REST sorguları, imza belirteci olarak özel kimlik bilgileri kullanılarak küçük harfli, alfabetik sırayla sıralanmış sorgu parametreleri imzalanarak doğrulanmalıdır. İmzalama, sorgu dizesini kodlayan URL'den önce yapılmalıdır.

Bu teknik belki de Stateless mimarisiyle daha uyumludur ve hafif bir oturum yönetimi ile de uygulanabilir (DB kalıcılığı yerine bellek içi oturumlar kullanılarak).

Örneğin, yukarıdaki bağlantıdan genel bir URI örneği:

GET /object?apiKey=Qwerty2010

şu şekilde iletilmelidir:

GET /object?timestamp=1261496500&apiKey=Qwerty2010&signature=abcdef0123456789

İmzalanan dize /object?apikey=Qwerty2010&timestamp=1261496500ve imza, API anahtarının özel bileşenini kullanarak bu dizenin SHA256 karmasıdır.

Sunucu tarafı veri önbelleği her zaman kullanılabilir. Örneğin, bizim çerçevemizde, yanıtları URI düzeyinde değil, SQL düzeyinde önbelleğe alıyoruz. Bu yüzden bu ekstra parametreyi eklemek önbellek mekanizmasını bozmaz.

JSON ve REST tabanlı istemci-sunucu ORM / SOA / MVC çerçevemizde RESTful kimlik doğrulaması hakkında bazı ayrıntılar için bu makaleye bakın . Yalnızca HTTP / 1.1 üzerinden değil, aynı zamanda kanallar veya GDI iletileri (yerel olarak) olarak da adlandırdığımız için, HTTP özgünlüğüne (başlık veya çerezler gibi) gerçekten RESTful bir kimlik doğrulama modeli uygulamaya çalıştık.

Daha sonra Not : URI'ye imza eklemek kötü bir uygulama olarak görülebilir (örneğin, http sunucu günlüklerinde görüneceğinden), örneğin yeniden oynatmaları önlemek için uygun bir TTL tarafından azaltılması gerekir. Ancak http günlükleriniz tehlikeye girerse, kesinlikle daha büyük güvenlik sorunlarınız olacaktır.

Uygulamada, OAuth 2.0 için yaklaşan MAC Jetonları Kimlik Doğrulaması "Jeton Tarafından Verildi" mevcut şemasında büyük bir gelişme olabilir. Ancak bu hala devam eden bir çalışmadır ve HTTP iletimine bağlıdır.

Sonuç

Uygulamada çoğunlukla HTTP üzerinden uygulansa da REST'in sadece HTTP tabanlı olmadığı sonucuna varmak gerekir. REST diğer iletişim katmanlarını kullanabilir. Dolayısıyla RESTful kimlik doğrulaması, Google'ın verdiği yanıt ne olursa olsun sadece HTTP kimlik doğrulaması ile eşanlamlı bir eş anlamlı değildir. HTTP mekanizmasını hiç kullanmamalı, ancak iletişim katmanından soyutlanmalıdır. Ve HTTP iletişimi kullanıyorsanız, Let's Encrypt girişimi sayesinde , herhangi bir kimlik doğrulama düzenine ek olarak gerekli olan HTTPS'yi kullanmamanın bir nedeni yoktur.


5
Bunun Cookieyerine daha iyi bir yedek olarak kullanırsanız HTTP Basic Auth, kimlik doğrulamasının sona ermesi ve çıkış yapma yeteneğiyle gerçekten durumsuz kimlik doğrulaması yapabilirsiniz. Örnek bir uygulama, Emulated-HTTP-Basic-Authgerçek HTTP Temel Kimlik Doğrulaması'na benzer değerde çağrılan çerez kullanabilir ve buna ek olarak setin geçerlilik süresi de kullanılabilir. Çıkış, daha sonra bu çerez kaldırılarak uygulanabilir. HTTP Temel Kimlik Doğrulamasını destekleyebilen herhangi bir istemcinin de bu şekilde yapılan çerez kimlik doğrulamasını destekleyebileceğini tahmin ediyorum .
Mikko Rantalainen

4
@MikkoRantalainen Ama yazdığım gibi bu çerez hala sunucu tarafından yönetilecek. Bir çeşit vatansızdır, ama "saf" vatansız değildir. Her durumda, istemci giriş / çıkışına adanmış JavaScript koduna ihtiyacınız vardır, bu da HTTP Digest Auth ile mükemmel bir şekilde mümkündür - iyi bir fikir, ancak burada tekerleği yeniden icat etmek için büyük bir yararı yoktur.
Arnaud Bouchez

4
Sunucunun, üstbilgiyi yapılandırmak için kullanıcı arabirimini ve mantığını uyguladığını ancak başlığın kendisinin durumsuz olduğunu iddia ediyorum. API için tasarlanmış bir istemci, üstbilgiyi yapılandırmak için sunucu yardımı kullanarak atlayabilir ve HTTP Temel Kimlik Doğrulama'ya benzer gerekli bilgileri iletebilir. Demek istediğim, ortak UA'ların (tarayıcılar), Temel Kimlik Doğrulamanın kullanılamayacak kadar zayıf bir uygulaması var. Sunucu tarafından sağlanan başka bir üstbilgideki ( Cookie) aynı şeyler için öykünme kullanılabilir.
Mikko Rantalainen


7
HTTP yetkilendirmesi için çirkin şifre istemi yalnızca sunucu 401 Yetkisiz yanıtı geri göndererek isterse görünür. Eğer beğenmezseniz, bunun yerine 403 Yasak gönderin. Hata sayfası, giriş yapmak için bir yöntem veya buna bir bağlantı içerebilir. Ancak, çerezler VE http kimlik doğrulamasına karşı en büyük argüman (durumun sunucu tarafı mı yoksa istemci tarafı mı olduğuna bakılmaksızın), siteler arası istek sahteciliğine karşı savunmasız olmalarıdır. Bu nedenle, en iyi yaklaşım özel bir Yetkilendirme şeması, özel yetkilendirme başlığı veya özel GET veya POST parametresidir.
Dobes Vandermeer

418

İnsanların coşkuyla "HTTP Kimlik Doğrulaması" diye bağırıp bağlanmadığını hiç şüphesiz REST (tarayıcıdan makineye web hizmeti yerine) (bir makineden makineye web hizmeti yerine) denemeyi denedim (suç yok - sadece komplikasyonlarla karşılaştıklarını sanmıyorum) .

Bir tarayıcıda görüntülenecek HTML sayfaları üreten RESTful hizmetlerinde HTTP Kimlik Doğrulaması'nı kullanırken bulduğum sorunlar şunlardır:

  • kullanıcı genellikle çok kullanıcı dostu olmayan, tarayıcı tarafından yapılmış çirkin bir giriş kutusu alır. şifre alma, yardım kutuları vb. ekleyemezsiniz.
  • oturumu kapatmak veya farklı bir adla oturum açmak bir sorundur - tarayıcılar siz pencereyi kapatana kadar siteye kimlik doğrulama bilgileri göndermeye devam eder
  • zaman aşımı zor

Bunları nokta nokta ele alan çok anlayışlı bir makale burada , ancak bu çok sayıda tarayıcıya özgü javascript hackery'si, geçici çözümler için geçici çözümler ve diğerleri ile sonuçlanır. Bu nedenle, ileri uyumlu değildir, bu nedenle yeni tarayıcılar yayınlandıkça sürekli bakım gerektirir. Bu temiz ve net tasarımı düşünmüyorum, ayrıca REST rozetimi arkadaşlarıma coşkuyla gösterebilmem için fazladan iş ve baş ağrısı olduğunu hissediyorum.

Çerezlerin çözüm olduğuna inanıyorum. Ama bekleyin, çerezler kötüdür, değil mi? Hayır, değiller, çerezlerin sıklıkla kullanılma şekli kötülüktür. Çerezin kendisi, tıpkı göz atarken tarayıcının izleyeceği HTTP kimlik doğrulama bilgileri gibi, yalnızca istemci tarafı bilgilerdir. Ve bu istemci tarafı bilgileri, yine HTTP Kimlik Doğrulaması bilgilerinin olduğu gibi her istekte sunucuya gönderilir. Kavramsal olarak, tek fark, bu istemci tarafı durum parçasının içeriğinin , yanıtın bir parçası olarak sunucu tarafından belirlenebilmesidir .

Oturumları yalnızca aşağıdaki kurallarla RESTful bir kaynak haline getirerek:

  • Bir oturum, bir anahtarı kullanıcı kimliğiyle eşleştirir (ve muhtemelen zaman aşımları için son eylem zaman damgası)
  • Bir oturum varsa, bu anahtarın geçerli olduğu anlamına gelir.
  • Giriş, / oturumlara POST yapmak anlamına gelir, yeni bir anahtar çerez olarak ayarlanır
  • Çıkış, DELETEing / sessions / {key} anlamına gelir (aşırı yüklenmiş POST ile hatırlayın, bir tarayıcıyız ve HTML 5 henüz uzun bir yol.)
  • Kimlik doğrulama, anahtarı her istekte bir çerez olarak göndererek ve oturumun var olup olmadığını kontrol ederek yapılır

Artık HTTP Kimlik Doğrulaması'nın tek farkı, kimlik doğrulama anahtarının sunucu tarafından oluşturulmuş ve girilen kimlik bilgilerinden hesaplayan istemci yerine onu geri gönderen istemciye gönderilmesidir.

converter42, https (ki biz yapmalıyız) kullanırken, tanımlama bilgisinin güvenli olmayan bir bağlantı üzerinden asla gönderilmemesi için çerezin güvenli bayrak ayarının yapılmış olması gerektiğini ekler. Harika bir nokta, kendim görmemiştim.

Bunun iyi çalışan yeterli bir çözüm olduğunu hissediyorum, ancak bu şemadaki potansiyel delikleri tanımlamak için bir güvenlik uzmanından yeterli olmadığımı itiraf etmeliyim - tek bildiğim, RESTful olmayan yüzlerce web uygulamasının aslında aynı şekilde kullandığını oturum açma protokolü (PHP'de $ _SESSION, Java EE'de HttpSession vb.). Çerez başlığı içerikleri, çeviri kaynaklarına, vb. Erişmek için bir kabul dili kullanılabileceği gibi, sunucu tarafındaki bir kaynağı ele almak için kullanılır. Aynı olduğunu hissediyorum, ama belki diğerleri değil mi? Siz ne düşünüyorsunuz beyler?


68
Bu pragmatik bir cevap ve önerilen çözüm işe yarıyor. Ancak, aynı cümlede "RESTful" ve "session" terimlerini kullanmak yanlıştır (arada "not" olmadığı sürece). Başka bir deyişle: oturum kullanan herhangi bir web hizmeti RESTful DEĞİLDİR (tanım gereği). Beni yanlış anlamayın - bu çözümü (YMMV) kullanmaya devam edebilirsiniz, ancak "RESTful" terimi bunun için kullanılamaz. Çok okunabilir olan ve konuyu derinlemesine açıklayan REST'in O'Reilly kitabını öneriyorum.
johndodo

23
@skrebbel: saf REST çözümü, her kaynak istediğinde kimlik doğrulama verilerini gönderir, bu da kusursuzdan daha azdır (HTTP Yetkilendirme bunu yapar). Önerilen çözüm işe yarar ve çoğu kullanım durumu için daha iyidir, ancak RESTful değildir. Savaşa gerek yok, ben de bu çözümü kullanıyorum. Sadece RESTful olduğunu iddia etmiyorum. :)
johndodo

94
Hadi ama, bir örnek ver. Başka ne var, iyi çalışıyor? Gerçekten bilmek isterdim. HTTP Auth kesinlikle değil, tarayıcıyı kapatmadan çıkış yapamazsınız ve tarayıcıya özgü geleceğe uyumlu olmayan çok sayıda JS olmadan iyi giriş UX'i sunamazsınız. "Tamamen RESTful" ve "neredeyse RESTful" ve ilgili dini tartışmaların pek çoğunu umursamıyorum, ancak birkaç yol olduğunu söylüyorsanız, bunları hecelemelisiniz.
skrebbel

15
Gerçek dünyadaki kullanıcı aracıları ile gerçek anlamda RESTful kimlik doğrulaması (diğer adıyla "tarayıcılar"), HTTP Kimlik Doğrulaması'nın değerini içeren bir çerezden oluşur. Bu şekilde sunucu, oturum açma adı ve parola girmek için kullanıcı arayüzünü sağlayabilir ve sunucu oturumu kapatmaya zorlayabilir (çerezi silerek). Ayrıca, kimlik doğrulama başarısız olduğunda oturum açmayı gerektirecek şekilde 401 yanıt vermek yerine, sunucunun oturum açma ekranına geçici yönlendirme kullanması ve başarılı oturum açtıktan sonra önceki konuma geçici yönlendirme kullanması gerekir. Ayrıca, sunucunun oturum açmış kullanıcılar için hemen hemen her sayfaya çıkış eylemi (POST formu) yerleştirmesi gerekir.
Mikko Rantalainen

15
"Dinlendirici" ve "oturum" kullanmanın, oturumun yalnızca istemci tarafında var olduğu açık olduğu sürece aynı cümlede yanlış bir şey görmüyorum. Bu kavram hakkında neden bu kadar önemli bir anlaşma yapıldığından emin değilim.
Joe Phillips

140

Yeterince bu konuda iyi insanlar tarafından burada söyleniyor. Ama işte benim 2 sentim.

2 etkileşim modu vardır:

  1. insandan makineye (HTM)
  2. makineden makineye (MTM)

Makine, REST API'leri olarak ifade edilen ortak paydadır ve aktörler / müşteriler ya insanlar ya da makinelerdir.

Şimdi, gerçekten RESTful bir mimaride, vatansızlık kavramı, tüm ilgili uygulama durumlarının (yani istemci tarafındaki durumlar) her bir taleple birlikte sağlanması gerektiğini ima eder. Alakalı olarak, REST API'sinin isteği işlemek ve uygun bir yanıt sunmak için gereken her şeyi ifade eder.

Bunu, insandan makineye uygulamalar bağlamında, Skrebbel'in yukarıda belirttiği gibi "tarayıcı tabanlı" olarak değerlendirdiğimizde, tarayıcıda çalışan (web) uygulamasının durumunu ve her bir istekle ilgili bilgileri göndermesi gerektiği anlamına gelir arka uç REST API'lerini yapar.

Şunu düşünün: REST API'lerinin veri / bilgi platformuna açık bir varlığınız var. Belki de tüm veri küplerini işleyen bir self servis BI platformuna sahipsiniz. Ancak (insan) müşterilerinizin buna (1) web uygulaması, (2) mobil uygulaması ve (3) bazı üçüncü taraf uygulamaları aracılığıyla erişmesini istiyorsunuz. Sonunda, MTM zinciri bile HTM'ye çıkıyor - sağ. Yani insan kullanıcılar bilgi zincirinin zirvesinde kalıyor.

İlk 2 durumda, bilgi bir insan kullanıcı tarafından tüketilen, insan-makine etkileşimi için bir vakanız vardır. Son durumda, REST API'lerini tüketen bir makine programınız vardır.

Kimlik doğrulama kavramı tüm yönetim kurulu için geçerlidir. REST API'lerinize tek tip, güvenli bir şekilde erişilecek şekilde bunu nasıl tasarlayacaksınız? Bunu gördüğümde 2 yol var:

Yol-1:

  1. Başlamak için giriş yok. Her istek giriş yapar
  2. Müşteri tanımlayıcı parametrelerini + her bir talepte isteğe özel parametreleri gönderir
  3. REST API onları alır, geri döner, kullanıcı deposuna ping işlemi yapar (her ne olursa olsun) ve onaylamayı onaylar
  4. Yetkilendirme kurulmuşsa, talebe hizmet verir; aksi takdirde, uygun HTTP durum koduyla reddedilir
  5. Kataloğunuzdaki tüm REST API'lerindeki her istek için yukarıdakileri tekrarlayın

Yol-2:

  1. İstemci bir kimlik doğrulama isteği ile başlar
  2. Bir giriş REST API'sı bu tür tüm istekleri işleyecektir
  3. Yetkilendirme parametrelerini (API anahtarı, uid / pwd veya seçtiğiniz her şeyi) alır ve yetkilendirmeyi kullanıcı deposuna (LDAP, AD veya MySQL DB vb.) Karşı doğrular.
  4. Doğrulanırsa, bir yetkilendirme jetonu oluşturur ve istemciye / arayan kişiye geri verir
  5. Arayan kişi daha sonra bu kimlik doğrulama jetonunu + istek üzerine özel parametreler gönderir ve diğer iş REST API'larına çıkış yapana kadar veya kiralama süresi sona erene kadar gönderir.

Açıkça, Way-2'de REST API'lerinin jetonu geçerli olarak tanımak ve güvenmek için bir yola ihtiyacı olacaktır. Oturum Açma API'sı kimlik doğrulama doğrulaması gerçekleştirdi ve bu nedenle "vale anahtarı" nın kataloğunuzdaki diğer REST API'leri tarafından güvenilmesi gerekiyor.

Bu, elbette, kimlik doğrulama anahtarının / belirtecinin depolanması ve REST API'leri arasında paylaşılması gerektiği anlamına gelir. Bu paylaşılan, güvenilir simge deposu ne olursa olsun yerel / birleşik olabilir ve diğer kuruluşlardan gelen REST API'lerinin birbirlerine güvenmesine olanak tanır.

Ama konuţuyorum.

Mesele şu ki, tüm REST API'lerinin bir güven döngüsü oluşturabilmesi için bir "durum" (istemcinin kimliği doğrulanmış durumu hakkında) korunmalı ve paylaşılmalıdır. Bunu yapmazsak, yani Way-1, gelen tüm talepler için bir kimlik doğrulama işleminin yapılması gerektiğini kabul etmeliyiz.

Kimlik doğrulaması yapmak yoğun kaynak gerektiren bir işlemdir. Uid / pwd eşleşmesini kontrol etmek için her gelen istek için kullanıcı mağazanıza karşı SQL sorguları yürüttüğünüzü düşünün. Veya karma eşleşmelerini şifrelemek ve gerçekleştirmek için (AWS stili). Ve mimari olarak, her REST API'sinin ortak bir arka uç giriş hizmeti kullanarak bunu gerçekleştirmesi gerekecek. Çünkü, eğer yapmazsanız, o zaman her yerde kimlik doğrulama kodunu çökersiniz. Büyük bir dağınıklık.

Daha fazla katman, daha fazla gecikme.

Şimdi, Way-1'i alın ve HTM'ye başvurun. (İnsan) kullanıcı uid / pwd / hash göndermek veya her istekte ne olursa olsun gerçekten umurunda mı? Hayır, her saniye kimlik doğrulama / giriş sayfasını atarak onu rahatsız etmediğiniz sürece. Eğer müşteri varsa iyi şanslar. Yani, yapacağınız şey giriş bilgilerini istemci tarafında, tarayıcıda, hemen başında saklamak ve yapılan her istekle göndermek. (İnsan) kullanıcı için önceden giriş yapmış ve bir "oturum" kullanılabilir. Ancak gerçekte, her istek üzerine doğrulanır.

Way-2 ile aynı. (İnsan) kullanıcınız asla fark etmeyecektir. Yani hiçbir zarar gelmedi.

MTM'ye 1. Yolu uygularsak ne olur? Bu durumda, bir makine olduğundan, her taleple kimlik doğrulama bilgilerini göndermesini isteyerek bu adamın cehennemini çıkarabiliriz. Kimse umursamaz! MTM üzerinde Way-2 yapmak herhangi bir özel reaksiyon uyandırmaz; bu lanet bir makine. Daha az bakım yapabilirdi!

Yani gerçekten soru sizin ihtiyacınıza uygun. Vatansızlığın bir bedeli vardır. Fiyatı öde ve devam et. Eğer bir saf olmak istiyorsanız, bunun için de bedelini ödeyin ve devam edin.

Sonunda felsefeler önemli değil. Asıl önemli olan bilgi keşfi, sunum ve tüketim deneyimidir. Kullanıcılar API'larınızı seviyorsa işinizi yaptınız.


3
Efendim, bunu o kadar güzel açıkladınız ki eldeki temel sorun / soru hakkında net bir fikrim var. Buda gibisin! Ben nakil katmanında HTTPS kullanarak bu eklemek olabilir, hatta (Way-1 seçilmişse) hiç kimse benim tanımlayıcının anahtar kaçırdı böylece, ortadaki adam saldırısına önleyebilir
ViShNoO Rath

Her zaman kimlik doğrulamasını yapan bir makine değil mi? İnsan parolalar hakkında bir saçmalık değil, güvenliği doğru bir şekilde rasyonelleştiren kullanıcılar için talihsiz bir sıkıntıdır. Benim için makinenin işini nasıl yapmasını istedikleri bir geliştiricinin problemidir.
Todd Baur

9
Cevabınızı okudum; çözümünüzde, kullanıcı tıklamalarıyla tarayıcıdan kaynaklanan her bir web isteği için "auth token" i kullanıcının tıkladığı API'ye geri göndermeniz gerekir. Sonra ne? API, jeton üzerinde denetim gerçekleştirir. Neye karşı? Bu tokenin geçerli olup olmadığını koruyan bir çeşit "token mağazası" na karşı. O zaman "token store" un "devlet" in bakıcısı olduğunu kabul etmiyor musunuz? Gerçekten, bunu nasıl görürseniz göreceksiniz, bir yerlerde birileri kullanıcı etkinliklerine aktarılan "jetonlar" hakkında bir şeyler bilmek zorundadır. Devlet bilgisi burada yaşıyor.
Kingz

5
Ve "durumsuz" hizmetle, gerçekte kastedilen, belirli bir sunucu bileşeninin (CRUD API'leri) herhangi bir durum taşımadığıdır. Bir kullanıcıyı bir diğerinden tanımazlar ve tek bir işlemde kullanıcı isteğini tamamlarlar. Vatansızlık budur. Ancak bir yerdeki birisinin bu kullanıcının geçerli olup olmadığına dair karar vermesi ve oturması gerekir. Bunu yapmanın başka bir yolu yok; anahtarlar veya şifreler ya da her neyse. Kullanıcı tarafından iletilen her şeyin kimliği doğrulanmalı ve yetkilendirilmelidir.
Kingz

1
Kayıp Way-3, melez yaklaşım. İstemci olduğu gibi oturum açar, Way-2ancak olduğu gibi Way-1kimlik bilgileri herhangi bir sunucu tarafı durumuna karşı denetlenmez. Ne olursa olsun, bir yetkilendirme jetonu oluşturulur ve istemciye olduğu gibi geri gönderilir Way-2. Bu belirteç daha sonra herhangi bir istemciye özel durum ararken asimetrik kripto kullanarak orijinal olup olmadığı kontrol edilir.
jcoffland

50

İşte gerçekten ve tamamen RESTful bir kimlik doğrulama çözümü:

  1. Kimlik doğrulama sunucusunda genel / özel bir anahtar çifti oluşturun.
  2. Genel anahtarı tüm sunuculara dağıtın.
  3. İstemci kimlik doğrulaması yaptığında:

    3.1. aşağıdakileri içeren bir token verin:

    • Son kullanma tarihi
    • kullanıcı adı (isteğe bağlı)
    • kullanıcıların IP adresi (isteğe bağlı)
    • bir parola karması (isteğe bağlı)

    3.2. Özel anahtarla jetonu şifreleyin.

    3.3. Şifreli belirteci kullanıcıya geri gönderin.

  4. Kullanıcı herhangi bir API'ya eriştiğinde kimlik doğrulama jetonunu da geçmelidir.

  5. Sunucular, kimlik doğrulama sunucusunun ortak anahtarını kullanarak şifresini çözerek belirtecin geçerli olduğunu doğrulayabilir.

Bu durum vatansız / RESTful kimlik doğrulamasıdır.

Bir şifre karması eklenirse, kullanıcının kimlik doğrulama belirteciyle birlikte şifrelenmemiş şifreyi de göndereceğini unutmayın. Sunucu, karma değerlerini karşılaştırarak kimlik doğrulama jetonu oluşturmak için kullanılan parolanın parolayla eşleştiğini doğrulayabilir. HTTPS gibi bir şey kullanan güvenli bir bağlantı gerekli olacaktır. İstemci tarafındaki Javascript, kullanıcının şifresini almayı ve istemci tarafını bellekte veya çerezde depolamayı işleyebilir ve muhtemelen sunucunun ortak anahtarıyla şifrelenebilir .


5
Birisi bu kimlik belirtecini ele geçirir ve istemci gibi davranarak API'leri çağırırsa ne olur?
Abidi

2
@ Abidi, evet bu bir problem. Bir parola gerekebilir. Parola karma değeri kimlik doğrulama jetonuna eklenebilir. Birisi belirteci çalabilseydi, çevrimdışı kaba kuvvet saldırılarına karşı savunmasız olurdu. Eğer güçlü bir parola seçilirse sorun olmazdı. Https jetonu hırsızlığı kullandıysanız, saldırganın önce istemcinin makinesine erişmesini gerektireceğini unutmayın.
jcoffland

1
Çünkü özel anahtarı yalnızca kimlik doğrulama sunucusu biliyor. Diğer sunucular, yalnızca ortak anahtarı ve kullanıcının simgesini bilerek kullanıcının kimliğini doğrulayabilir.
jcoffland

1
Asimetrik şifreleme ve şifre çözme, simetrik şifrelemeden daha yavaş bir büyüklük sırasıdır (daha fazla bilgi işlem yoğunluğu) .Her bir çağrıda jetonun şifresini çözmek için ortak anahtarı kullanarak sunucunun kullanılması çok büyük bir performans darboğazı olacaktır.
Craig

3
@jcoffland cevabınızı burada gerçekten tekrarladınız (tekrar tekrar :-) Ama her çağrıda asimetrik şifreleme kullanmanın performans sorunları (hesaplama yoğunluğu) hakkında yorum yapamam. Ölçeklendirme yeteneğine sahip bir çözüm göremiyorum. HTTPS ve SPDY protokolüne bakın. Bağlantıları açık tutmak (durum HTTP HTTP canlı tutma) ve aynı bağlantı üzerinden toplu olarak birden fazla kaynak sunmak (daha fazla durum) için uzunluklara gider ve elbette SSL'nin kendisi simetrik bir şifre anahtarı değiştirmek için sadece asimetrik şifreleme kullanır ( ayrıca devlet).
Craig

37

Size karşı dürüst olmak gerekirse, burada harika cevaplar gördüm ama beni biraz rahatsız eden bir şey, birinin bütün Vatansız kavramını dogmatik hale geldiği bir aşırı noktaya götürmesi. Bana sadece saf OO'yu kucaklamak isteyen eski Smalltalk hayranlarını hatırlatıyor ve bir şey bir nesne değilse, o zaman yanlış yapıyorsunuz. Bana bir ara ver.

RESTful yaklaşımının hayatınızı kolaylaştıracağı ve seansların genel giderlerini ve maliyetlerini azaltacağı, bunu yapmak akıllıca bir şey olduğu için takip etmeye çalışın, ancak bir disiplini (herhangi bir disiplini / kılavuzu) en uç noktaya kadar takip ettiğiniz dakika artık tasarlandığı faydayı sağlamaz, o zaman yanlış yaparsınız. Bugün en iyi dillerin bazıları hem işlevsel programlama hem de nesne yönelimli.

Sorununuzu çözmenin en kolay yolu, kimlik doğrulama anahtarını bir çerezde saklamak ve HTTP başlığına göndermekse, bunu yapın, kötüye kullanmayın. Ağır ve büyük olduklarında oturumların kötü olduğunu unutmayın, eğer tüm oturumunuz bir anahtar içeren kısa bir dize ise, o zaman önemli olan nedir?

Yorumlardaki düzeltmeleri kabul etmeye açıkım ama sadece hayatımızı sefil hale getirmenin anlamını sadece sunucumuzda büyük bir karma sözlüğü tutmaktan kaçınmıyorum.


2
İnsanlar oturumları kullanmanıza izin vermiyor. Bunu yapmakta özgürsünüz. Ama eğer yaparsanız, REST değildir.
André Caldas

6
@ AndréCaldas, bir dilde işlevlere veya ilkel türlere sahip olmanın aynı olmadığı REST değildir. Oturum yapmanın tavsiye edilebilir olduğunu söylemiyorum. Ben sadece birilerine bir fayda sağlamayacak ölçüde bir dizi uygulamayı takip etme fikrimi veriyorum. (Btw, dikkatlerinize karşı çıkmadığımı fark ettim, ancak REST olmadığını söyleyemem, saf REST olmadığını söyleyebilirim ).
arg20

Peki RESTful değilse buna ne denir? Elbette bir istek oturum kimliği içeriyorsa, bu bir kullanıcı kimliği içeren bir istek kadar vatansızdır? Kullanıcı kimliğinin vatansız ve oturum kimliği niçin durum bilgisi altında?
mfhholmes

1
Çerezler, siteler arası istek sahteciliğine karşı savunmasızdır, bu nedenle güvenlik ihlallerini kolaylaştırır. Özel bir başlık veya özel bir Yetkilendirme şeması gibi tarayıcı tarafından otomatik olarak gönderilmeyen bir şeyi kullanmak daha iyidir.
Dobes Vandermeer

1
Aslında, vatansız olmaya çalışmak dogmatizm değil, SOA'nın kendisinin ortak bir anlayışı hakkındadır. Hizmetler her zaman birbirinden ayrı ve vatansız olmaktan faydalanmalıdır: pratikte ölçeklendirme, kullanılabilirlik ve sürdürülebilirliği kolaylaştırır. Tabii ki, mümkün olduğu kadar çok olmalı ve sonunda bu vatansız hizmetleri durumsal bir pragmatik yaklaşımda yönetmek için bazı "orkestrasyon hizmetlerine" ihtiyacınız olacaktır.
Arnaud Bouchez

32

Birincisi ve en önemlisi, bir sığınakta web hizmetidir DURUMSUZ (ya da diğer bir deyişle, Oturumsuz). Bu nedenle, bir RESTful hizmeti oturum veya çerezler kavramına sahip değildir ve içermemelidir. RESTful hizmetinde kimlik doğrulama veya yetkilendirme yapmanın yolu, RFC 2616 HTTP spesifikasyonlarında tanımlanan HTTP Yetkilendirme başlığını kullanmaktır. Her istek HTTP Yetkilendirme başlığını içermeli ve istek bir HTTP (SSL) bağlantısı üzerinden gönderilmelidir. Bu, HTTP RESTful web hizmetlerinde kimlik doğrulaması yapmanın ve isteklerin yetkilendirildiğini doğrulamanın doğru yoludur. Cisco Systems'taki Cisco PRIME Performans Yöneticisi uygulaması için RESTful bir web hizmeti uyguladım. Ve bu web hizmetinin bir parçası olarak, kimlik doğrulama / yetkilendirme de uyguladım.


5
HTTP kimlik doğrulaması yine de sunucunun kullanıcı kimliklerini ve şifrelerini takip etmesini gerektirir. Bu tamamen vatansız değil.
jcoffland

21
Her bir talebin, önceki taleplerin herhangi bir şartı olmadan kendi başına geçerli olması anlamsızdır. Bunun sunucuda nasıl uygulandığı başka bir konudur, kimlik doğrulama pahalıysa, bazı önbellekleme yapabilir ve önbellek özledim üzerinde yeniden kimlik doğrulaması yapabilirsiniz. Çok az sayıda sunucu, çıktının yalnızca girdinin bir işlevi olduğu yerlerde tamamen durumsuzdur. Genellikle bir durumun sorgusu veya bir güncellemesidir.
Erik Martino

3
Doğru değil. Bu durumda, tüm talepleriniz önceki bir işlemden, yani kullanıcı kaydından durum gerektirir. İnsanların neden sunucuda depolanan bir kullanıcı adı ve parolanın sunucu tarafı durumu olmadığını söylemeye çalıştığını anlamıyorum. Cevabımı gör.
jcoffland

1
@jcoffland Ayrıca, çözümünüz ağırlıklı olarak API sunucusunun imzalı belirtecin şifresini çözme yeteneğine dayanmaktadır. Bu yaklaşımın sadece çok spesifik değil, aynı zamanda RESTful kimlik doğrulaması sorununu çözmek için akıl sahibi olan RIFF R.
Michael Ekoka

2
@jcoffland, bilgi işlem yoğunluğunun (ve dolayısıyla kaynak yoğun ve son derece yavaş) asimetrik şifrelemenin ne kadar derin olduğunu anlıyor musunuz? Her istekte asimetrik şifreleme kullanacak bir şemadan bahsediyorsunuz. HTTPS'nin en yavaş yönü olan hiçbir şey bar, ardından gelen tüm iletişimi simetrik olarak şifrelemek için kullanılan ortak bir sırrı asimetrik olarak şifrelemek için genel / özel anahtarların oluşturulmasını içeren ilk el sıkışmadır.
Craig

22

Bu genellikle "oturum anahtarları" ile ilgili değildir, çünkü genellikle REST'in tüm kısıtlamaları dahilinde gerçekleştirilen oturumsuz kimlik doğrulamaya atıfta bulunur. Her istek kendi kendini tanımlamaktadır ve herhangi bir sunucu tarafı uygulama durumu olmadan isteği tek başına yetkilendirmek için yeterli bilgi taşımaktadır.

Buna yaklaşmanın en kolay yolu, HTTP'nin RFC 2617'deki yerleşik kimlik doğrulama mekanizmalarıyla başlamaktır .


HTTP kimlik doğrulaması için sunucunun kullanıcı adını ve parolasını depolaması gerekir. Bu sunucu tarafı durumudur ve bu nedenle kesinlikle REST değildir. Cevabımı gör.
jcoffland

3
@jcoffland: Her iki hesapta da bu doğru değil. İlk HTTP Yetkilendirmesi, sunucunun parolayı depolamasını gerektirmez. Karma (8+ mermi ile tavsiye bcrypt) şifresi yerine saklanır. İkinci olarak, yetkilendirme başlığı her istekle birlikte gönderildiği için sunucunun durumu yoktur. Ve saklanan parola karmalarını durum olarak görürseniz , saklanan ortak anahtarlardan daha fazla durum değildir.
Boris B.

1
@Boris B., evet Şifrenin bir karma olarak saklandığını anlıyorum. Karma şifre hala istemciye özel durumdur. Çözümümde açıklandığı gibi bir ortak anahtarı depolamanın farkı, kimlik doğrulama sunucusunun ortak anahtarı olan tek bir ortak anahtar olmasıdır. Bu, kullanıcı başına bir parola karması saklamaktan çok farklıdır. Sunucu her kullanıcı için bir parola depolarsa, nasıl giyinirseniz giyin, kullanıcı durumu başına depolar ve% 100 REST değildir.
jcoffland

7
Kullanıcıların karma parolasını sunucuda saklamanın sunucu tarafı durumu olarak değerlendirilmesi gerektiğini düşünmüyorum. Kullanıcılar ad, adres veya karma parola gibi bilgileri içeren kaynaklardır.
Codepunkt

15

@Skrebel ( http://www.berenddeboer.net/rest/authentication.html ) tarafından bahsedilen 'çok anlayışlı' makalede kıvrık ama gerçekten kırılmış bir kimlik doğrulama yöntemi tartışılmaktadır.

Herhangi bir giriş bilgisi olmadan http://www.berenddeboer.net/rest/site/authenticated.html sayfasını ziyaret etmeyi deneyebilirsiniz .

(Üzgünüm cevap hakkında yorum yapamam.)

REST ve kimlik doğrulama sadece karıştırmayın söyleyebilirim. REST, vatansız anlamına gelir, ancak 'kimliği doğrulanmış' bir durumdur. İkisini de aynı katmanda tutamazsınız. RESTful bir savunucuysanız ve devletlere kaşlarını çattıysanız, HTTPS ile gitmelisiniz (yani güvenlik sorununu başka bir katmana bırakın).


Stripe.com REST ve Authentication karışmıyor yorumunuzu başka türlü söyler ..
Erik

Vatansız yalnızca istemciyi değil, sunucuyu ifade eder. Müşteri, oturumun tüm durumunu hatırlayabilir ve her istekle ilgili olanları gönderebilir.
Dobes Vandermeer

Sonunda birisi bir anlam ifade ediyor, ancak vatansız kimlik doğrulaması ortak anahtar kripto kullanarak mümkün. Cevabımı gör.
jcoffland

1
Sunucunun "kimliği doğrulanmış" durumu yok. Hipermedya aracılığıyla bilgi alır ve talep edileni geri getirmek için onunla çalışmak zorundadır. Ne az, ne fazla. Kaynak korunuyorsa ve kimlik doğrulama ve yetkilendirme gerektiriyorsa, sağlanan hiper ortamın bu bilgileri içermesi gerekir. Bir kaynağı döndürmeden önce bir kullanıcının kimliğini doğrulamanın, sunucunun izleme durumunu aldığı anlamına geldiği fikrini bilmiyorum. Bir kullanıcı adı ve parola girilmesi, daha fazla filtreleme parametresi sağlamak olarak düşünülebilir.
Michael Ekoka

"REST ve kimlik doğrulamasının karışmadığını söyleyebilirim." Biraz sağduyu gibi geliyor. Kimlik doğrulama ile uyumsuz bir sistemin ("kimliği doğrulanmış" olanın elbette bir durum olması) hariç, yararlılığı sınırlıdır. Hepimizin pratiklik ile saf dogmatizmin kesişme noktasında tartıştığını ve açıkçası pratikliğin kazanması gerektiğini hissediyorum. Kimlik doğrulaması açısından devletten kaçınmaya çalışan eğilmelere girmeden REST'in birçok yönü var, değil mi?
Craig

12

Dinlendirici kimlik doğrulamasının, istekte bir parametre olarak bir kimlik doğrulama belirtecinin iletilmesini içerdiğini düşünüyorum. Örnekler apikeylerin api tarafından kullanılmasıdır. Çerezlerin veya http kimlik doğrulamasının kullanılmasının uygun olduğuna inanmıyorum.


CSRF güvenlik açığı nedeniyle çerezlerden ve HTTP Yetkisinden kaçınılmalıdır.
Dobes Vandermeer

@DobesVandermeer Yardımcı olabilirseniz sorumu görebilir misiniz? stackoverflow.com/questions/60111743/…
Hemant Metalia

12

16 Şubat 2019 Güncellemesi

Aşağıda daha önce bahsedilen yaklaşım esasen "Kaynak Sahibi Parolası Kimlik Bilgileri" OAuth2.0 hibe türüdür . Bu, çalışmaya başlamanın kolay bir yoludur. Ancak, bu yaklaşımla kuruluştaki her başvuru kendi kimlik doğrulama ve yetkilendirme mekanizmalarıyla sonuçlanacaktır. Önerilen yaklaşım "Yetkilendirme Kodu" hibe türüdür. Ayrıca, aşağıdaki önceki cevabımda, kimlik kartı depolamak için localStorage tarayıcısını tavsiye ettim. Ancak, çerezin bu amaç için doğru seçenek olduğuna inanmaya başladım. Nedenlerim, yetki kodu hibe türü uygulama yaklaşımı, güvenlik hususları vb bu StackOverflow cevap ayrıntılı .


REST hizmeti kimlik doğrulaması için aşağıdaki yaklaşımın kullanılabileceğini düşünüyorum:

  1. Kimlik doğrulaması için kullanıcı adı ve parolayı kabul etmek üzere bir oturum açma RESTful API'si oluşturun. Aktarım sırasında güvenlik için önbelleğe almayı ve SSL'yi önlemek için HTTP POST yöntemini kullanma Başarılı kimlik doğrulamasında, API iki JWT döndürür - bir erişim belirteci (daha kısa geçerlilik, 30 dakika) ve bir yenileme belirteci (daha uzun geçerlilik, 24 saat)
  2. İstemci (web tabanlı bir kullanıcı arayüzü) JWT'leri yerel depolama alanında depolar ve sonraki her API çağrısında erişim yetkisini "Yetkilendirme: Taşıyıcı #access token" başlığında geçirir
  3. API, imza ve son kullanma tarihini doğrulayarak jetonun geçerliliğini kontrol eder. Belirteç geçerliyse, kullanıcının (JWT'deki "alt" hak talebini kullanıcı adı olarak yorumlar) önbellek aramasıyla API'ya erişimi olup olmadığını kontrol edin. Kullanıcı API'ya erişme yetkisine sahipse, iş mantığını yürütün
  4. Belirtecin süresi dolmuşsa, API 400 HTTP yanıt kodunu döndürür
  5. 400/401 alan istemci, yeni bir erişim belirteci almak için "Yetkilendirme: Taşıyıcı #refresh belirteci" başlığında yenileme belirtecine sahip başka bir REST API'sini çağırır.
  6. Aramayı yenileme jetonu ile alırken, imzayı ve son kullanma tarihini kontrol ederek yenileme jetonunun geçerli olup olmadığını kontrol edin. Yenileme belirteci geçerliyse, kullanıcının erişim hakkı önbelleğini DB'den yenileyin ve yeni erişim belirteci ve yenileme belirteci döndürün. Yenileme belirteci geçersizse, 400 yanıt kodunu döndürün
  7. Yeni bir erişim belirteci ve yenileme belirteci döndürülürse, 2. adıma gidin. HTTP yanıt kodu 400 döndürülürse, istemci yenileme belirtecinin süresinin dolduğunu varsayar ve kullanıcıdan kullanıcı adı ve parola ister
  8. Oturumu kapatmak için yerel depolamayı temizleyin

Bu yaklaşımla, önbelleği kullanıcıya her 30 dakikada bir kullanıcıya özel erişim hakkı ayrıntıları ile yüklemek için pahalı bir işlem yapıyoruz. Dolayısıyla, bir erişim iptal edilirse veya yeni erişim verilirse, yansıtılması veya oturumu kapatıp ardından bir oturum açması 30 dakika sürer.


yani bunu açısal ile yapılan statik bir web sitesi ile bir api için kullanır mısın? Peki ya mobil uygulamalar?
Yazan Rawashdeh

8

Bunu yapmanın yolu: Giriş için OAuth 2.0'ı kullanma .

OAuth'u desteklediği sürece Google'dan başka kimlik doğrulama yöntemleri de kullanabilirsiniz.


1
OAuth2 HTTPS olmadan veya vatansız olmadan güvenli değildir.
Arnaud Bouchez

4
HTTPS olmadan hiçbir şey güvenli değildir.
Craig

1
@Craig Ve HTTPS, sertifikalar zinciri kırılırsa, bu daha büyük yararlar için güvenli olmayabilir - en.wikipedia.org/wiki/Bullrun_(decryption_program) ;)
Arnaud Bouchez

1
@ArnaudBouchez Lütfen daha iyi ürün için kırık bir sertifika zincirine sahip olmanın ne olduğunu açıklayınız? Bununla nereye gittiğini anlamıyorum. ;)
Craig

@Craig Lütfen bağlantıyı takip edin ve tadını çıkarın! Bu "daha iyi" yaklaşım benim yorumumda açıkça alaycıydı: Bullrun benzeri sistemler, sevgili ve güvenilir hükümetlerimiz tarafından "kendi iyiliğimiz" içindir.
Arnaud Bouchez

3

Bir anahtarın kaydedilmesinin uygun bağlamayı içerdiği bir Ortak anahtar altyapısının kullanılması, ortak anahtarın, reddedilmemesini sağlayacak şekilde atandığı kişiye bağlı olmasını sağlar

Bkz. Http://en.wikipedia.org/wiki/Public_key_infrastructure . Uygun PKI standartlarına uyarsanız, çalınan anahtarı yanlış kullanan kişi veya temsilci tanımlanabilir ve kilitlenebilir. Aracının bir sertifika kullanması gerekiyorsa, bağlanma oldukça sıkı olur. Zeki ve hızlı hareket eden bir hırsız kaçabilir, ancak daha fazla kırıntı bırakırlar.


2

Bu soruyu anlayışımdan cevaplamak için ...

Sisteminizdeki kullanıcıları gerçekten izlemenize veya yönetmenize gerek kalmaması için REST kullanan bir kimlik doğrulama sistemi. Bu POST, GET, PUT, DELETE HTTP yöntemleri kullanılarak yapılır. Bu 4 yöntemi kullanırız ve bunları veritabanı etkileşimi açısından CREATE, READ, UPDATE, DELETE olarak düşünürüz (ancak web'de POST ve GET kullanıyoruz çünkü şu anda çapa etiketleri destekliyor). POST ve GET'i CREATE / READ / UPDATE / DELETE (CRUD) olarak ele aldığımızda, web uygulamamızda hangi CRUD eylemini gerçekleştirdiğimizi belirleyebilecek rotalar tasarlayabiliriz.

Örneğin, bir Ruby on Rails uygulamasında, web uygulamamızı, oturum açmış bir kullanıcı http://store.com/account/logout adresini ziyaret ederse , bu sayfanın GET'inin oturum kapatmaya çalışan kullanıcı olarak görüntülenebileceği şekilde oluşturabiliriz. . Ray denetleyicimizde, kullanıcının oturumunu kapatıp ana sayfaya geri gönderen bir eylem oluşturacağız.

Giriş sayfasındaki bir GET formu oluşturur. giriş sayfasındaki bir POST bir giriş denemesi olarak görüntülenecek ve POST verilerini alıp giriş yapmak için kullanacaktır.

Bana göre, veritabanı anlamıyla eşlenen HTTP yöntemlerini kullanma ve daha sonra herhangi bir oturum kimliğinin veya izleme oturumunun etrafından geçmeniz gerekmediği bir kimlik doğrulama sistemi oluşturmanın bir uygulamasıdır.

Hala öğreniyorum - yanlış olduğunu söylediğim bir şey bulursanız lütfen beni düzeltin ve daha fazla öğrenirseniz buraya geri gönderin. Teşekkürler.


2

Herhangi bir web uygulamasını güvenceye almak için geçerli ipuçları

Uygulamanızı güven altına almak istiyorsanız, kesinlikle HTTP yerine HTTPS kullanarak başlamalısınız , bu, kullanıcılar arasında ileri geri gönderilen verilerin koklanmasını önleyecek ve verilerin korunmasına yardımcı olacak güvenli bir kanal oluşturmanızı sağlar. gizli değişim.

RESTful API'leri güvenceye almak için JWT'leri (JSON Web Belirteçleri) kullanabilirsiniz , bunun sunucu tarafı oturumlarına kıyasla birçok faydası vardır, faydaları temel olarak şunlardır:

1- API sunucularınızın her kullanıcı için oturumları sürdürmesi gerekmeyeceğinden daha fazla ölçeklenebilir (bu, birçok oturumunuz olduğunda büyük bir yük olabilir)

2- JWT'ler bağımsızdır ve örneğin kullanıcı rolünü ve neye erişebildiğini ve tarih ve son kullanma tarihinde ne yayınlayabileceğini iddia eder (bundan sonra JWT geçerli olmayacaktır)

3- Yük dengeleyicilerin üstesinden gelmek daha kolaydır ve oturum verilerini paylaşmak veya sunucuyu oturumu aynı sunucuya yönlendirecek şekilde yapılandırmak zorunda kalmayacağınız için birden fazla API sunucunuz varsa, bir JWT'den gelen bir istek herhangi bir sunucuya çarptığında doğrulanabilir & yetkili

4- DB'niz üzerinde daha az baskı ve her istek için oturum kimliği ve verilerini sürekli olarak depolamak ve almak zorunda kalmayacaksınız

5- JWT'yi imzalamak için güçlü bir anahtar kullanırsanız, JWT'lere müdahale edilemez, böylece JWT'deki, kullanıcı oturumunu ve yetkilendirilmiş olup olmadığını kontrol etmek zorunda kalmadan istekle birlikte gönderilen taleplere güvenebilirsiniz. , JWT'yi kontrol edebilirsiniz ve sonra bu kullanıcının kim ve ne yapabileceğini öğrenmeye hazırsınız.

Birçok kütüphane çoğu programlama dilinde JWT oluşturmak ve doğrulamak için kolay yollar sağlar, örneğin: node.js'de en popüler olanlardan biri jsonwebtoken

REST API'leri genellikle sunucuyu vatansız tutmayı amaçladığından, JWT'ler , sunucu tarafından kullanıcı oturumunu takip etmek zorunda kalmadan kullanıcı oturumunu takip etmek zorunda kalmadan her bir istek kendine yeten Yetkilendirme belirteci (JWT) ile gönderildiği için JWT'ler bu kavramla daha uyumludur . sunucu durum, böylece kullanıcı ve rolünü hatırlar, ancak oturumlar da yaygın olarak kullanılan ve kendi artıları var, isterseniz arayabilirsiniz.

Dikkat edilmesi gereken önemli bir nokta, JWT'yi HTTPS kullanarak güvenli bir şekilde istemciye teslim etmeniz ve güvenli bir yerde (örneğin yerel depolamada) kaydetmeniz gerektiğidir.

JWT'ler hakkında daha fazla bilgiyi bu bağlantıdan edinebilirsiniz .

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.