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.
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.
Yanıtlar:
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:
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×tamp=1261496500
ve 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.
Cookie
yerine 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-Auth
gerç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 .
Cookie
) aynı şeyler için öykünme kullanılabilir.
İ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:
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:
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?
Yeterince bu konuda iyi insanlar tarafından burada söyleniyor. Ama işte benim 2 sentim.
2 etkileşim modu vardır:
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:
Yol-2:
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.
Way-3
, melez yaklaşım. İstemci olduğu gibi oturum açar, Way-2
ancak olduğu gibi Way-1
kimlik 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.
İşte gerçekten ve tamamen RESTful bir kimlik doğrulama çözümü:
İstemci kimlik doğrulaması yaptığında:
3.1. aşağıdakileri içeren bir token verin:
3.2. Özel anahtarla jetonu şifreleyin.
3.3. Şifreli belirteci kullanıcıya geri gönderin.
Kullanıcı herhangi bir API'ya eriştiğinde kimlik doğrulama jetonunu da geçmelidir.
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 .
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.
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.
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 .
@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).
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.
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:
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.
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.
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.
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.
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 .