Arka uç kimlikleri bir REST API'sında herkese açık mı olmamalı mı?


14

Bu adamın söylediklerine dayanarak: http://toddfredrich.com/ids-in-rest-api.html

API kaynaklarını tanımlamak için UUID kullanma konusunda haklı olduğunu varsayalım. Sonra bu şekilde uygulamaya çalışırken sorunlarla karşılaşıyorum, bu:

class FooEntity {

    final String id = null;  //auto-generated by my backend (mongodb), not shared
    final UUID uid = UUID.randomUUID();  //the resource id
}

(İstemci ve sunucu arasında, veri tabanı varlıkları değil, DTO'lar gönderilir ve alınır.)

Şimdi sorun artık idkullanmıyorum gibi yararlı değil. Istemci istekleri yapar, uidbu yüzden neden 2 kimlik işlemek için rahatsız ediyorum? Sonra başlangıcın aynı konusuna geri dönüyoruz. UUID'yi birincil anahtar ( _id) olarak ayarlarsam , arka uç kimliğini herkese açık olarak gösteririm.

Bunun yanında verimlilik konusu var. ObjectId tarafından endeksleme UUID çok daha verimli okudum.

Yanıtlar:


7

Arka uç kimliğini halka açıklıyorum

Varlıklarınızı bir istekle geri gönderildiklerinde tanımlamak için başka hangi yöntemleriniz var? Bu, SSN veya benzer tanımlayıcılardan mükemmel bir şekilde meşru ve daha güvenlidir. Todd bundan bahsediyor - kimlik teknolojisini ve varlığı tarafsız kılıyor ve haklı.

Verimlilik konusu

ObjectId gerçekten çok daha verimli ise her iki tanımlayıcıyı da saklayabilirsiniz. Teorik olarak, UUID'leri tanımlayıcılar için veritabanı otomatik artırıcılarına göre kullanmak her zaman daha iyidir .


Kimliği gösterme hakkınız var. Verimlilik hakkında, hala her iki kimliği de nasıl kullanabileceğimi göremiyorum. İstemci uuid ile bir istekte bulunursa, uuid alanında arama yapan bir sorgu yapacağım ve sonucu alacağım. Varlığı alana kadar objectid'i bilemiyorum. Yani sanırım ikisini de kullanmanın bir anlamı yok.
anat0lius

1
Eski destek için mantıklı olabilir. Eski otonumerik kimliğe hala eski veriler ve / ve sistemler tarafından atıfta bulunduğunu varsayalım. Aksi takdirde, UUID
Laiv

1
Sorunuza cevap olarak " diğer araçlar size bir istek yoluyla iade durumlardaki varlıkları tanımlamak için Neler var? ", Oturum başına vekil kimlikleri. " En iyi koruma, bir dizin, dolaylı referans haritası veya doğrulaması kolay diğer dolaylı bir yöntem kullanarak kullanıcılara doğrudan nesne referanslarını göstermekten kaçınmaktır "
Peter Taylor

5

Hayır, veritabanına gelince, dahili yapı hakkında hiçbir şey dış API'ye maruz kalmaz. Kimliklerin zekası yoktur. Gerçek dünyada bile benzersiz değiller. ID: 47 her yerdedir. Erişime sahip olduğunuz ve muhtemelen verileri işleyebileceğiniz varlıklar vardır, ancak bu veritabanı her şeyi bir tablo veya onda depolarsa, artımlı kimliği PK olarak kullanır ve bir FK ile ilişkilidir, asla bilemezsiniz.

Yapabiliyorsanız GetUserAccountByID (12345) birinden GetUserAccountByID (12346) 'yı denemesini istiyor. Diğer güvenlik önlemleri nedeniyle işe yaramayacak olmasına rağmen, Hesap: 12346 hakkında bilgi isteyerek şirketi hacklemeye çalışmayın ve DBA'yı aramadığınız ve bir hafta boyunca 2 hafta beklemek istemediğiniz sürece yanıtı;)

Bu nedenle, uygun gördüğünüz veya bir telefon numarası veya e-posta adresi gibi başka bir doğal anahtar gördüğünüzde GUID'leri oluşturun. Bazı birleştirme veri girişimlerinde bazı gizli kopyalama ve yapıştırma girişimlerinden kaçınmak için tablodaki alana benzersiz bir kısıtlama koyun.

Bu gereksiz değildir. İki alan farklı amaçlara hizmet eder.


0

Verimlilik kimliği ve UUID hakkında, her biri milyonlarca kayda sahip birden çok tablo içeren birden çok birleşim yoksa, bu çok fazla fark yaratmaz. Doğrudan sunucu tarafında kontrol / uygulama yapmazsanız, UUID kullanmak uygulamanızı hurdaya çıkartmayı çok daha zor hale getirir .:

  • GET [...] / 1
  • GET [...] / 2

Kimlik kullanırken çok kolay, bunun yerine UUID kullanıyorsanız, bir sıyırıcı için daha az seçenek.

Kimlik, uygulamanızın veritabanı örneğinde dahili olarak görülebilir. Bu cümlede üç önemli kelime vardır:

  • Uygulama: Modeliniz olduğu için, tablolarınızın yalnızca bu uygulama tarafından kullanılması muhtemeldir
  • Veritabanı: Birden fazla uygulama aynı veritabanına karşı kullandıysa,
  • Eşgörünüm (veritabanının): dağıtılmış bir sisteminiz varsa, kimlik birbiriyle çakışır ve veritabanınızın örneğini kullanmayan diğer herhangi bir sistem / uygulama için anlamsız olur. Bu özel durum için UUID çözümdür.

Kişisel bir tercih olarak: Basit bir kimliğe ve benzersiz bir iş kimliğine (posta, giriş, ...) sahip olmayı tercih ederim. Veri alışverişi yapmam gerekiyorsa, iş kimliğini kullanacağım, çünkü hedef sistem UUID ile başa çıkmayabilir, ancak çok büyük olasılıkla (asla asla deme ...) benzersiz bir iş anahtarıyla başa çıkacaktır.

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.