Spring Boot, Spring Security, OAUTH2 ve JWT ile auth jetonları olarak temel bir kimlik doğrulama sistemi uyguladık. Tamam çalışıyor ancak JWT'yi bir veritabanında depolamanın mantıklı olup olmadığını ve birisinin onu kullanarak kimliği doğrulanmış bir istekte bulunulduğunda bir belirteç olup olmadığını kontrol edip etmediğimi düşünüyordum. Özellikle aşağıdaki senaryoyu düşünüyordum: kullanıcı bir mobil cihazda doğrulanır ve onu kaybeder, böylece bu cihazı yetkilendirmek isterler. Daha sonra, kullanıcı kimlikleri için verilen simgeleri temizleyen ve kendisine atanan tüm simgeleri yetkilendiren bir işlem yapabileceklerdi. Başka bir yol var mı? Bu yanlış ya da aşırı karmaşık şeyler düşünüyorum? Bu, bir mobil APP'den çağrılacak bir REST API'sini güvenli hale getirmek içindir.JWT'yi bir veritabanında depolamak mantıklı mı?
cevap
JWT'yi db'de saklayabilirsiniz, ancak bir JWT'nin bazı avantajlarını kaybedersiniz. JWT, jetonun meşru olduğunu doğrulamak için sadece şifreleme kullanabildiğiniz için her zaman bir db'de belirteci kontrol etmenize gerek kalmadan avantaj sağlar. Eğer db'de belirteci aramak zorunda kalırsanız, onunla bilgi taşımayan bir opak jetonu kullanabilir ve sunucu ile veri tabanının size bilgi vermesini sağlayabilirsiniz. Diğer taraftan, eğer db'de bir jetonu saklayacaksanız, JWT'nin belirteç tipiniz için kötü bir seçenek olduğunu düşünmüyorum. Dediğiniz gibi, belirtinizi db'de saklarsanız iptal etme için avantajlar vardır. Her şey, elde etmek istediğiniz şeye bağlıdır (daha hızlı yetkilendirme, vs. talep üzerine iptal etme yeteneği).
İsterseniz Db'de jetonları kaydetmeden JWT'yi OAuth2 ile kullanabilirsiniz. JWT'lerin ayarlayabileceğiniz yapılandırılabilir bir son kullanma süresi vardır - bundan sonra geçersizdirler. Erişim Jetonları (JWT olsun ya da olmasın) genellikle güvenlik için kısa ömürlü olmalıdır. Endişe, birisinin telefonunun çalınması ve erişim elde etmesine izin verilmesi durumunda, çözümün bu belirteçlerin hızlı bir şekilde sona ermesi (30 dak.) Olduğunu düşünüyorum. Eğer oauth2 kullanıyorsanız, uygulamayı kullanmaya devam etmemek için birisinin durdurulması, gerçek sahibin, yetkilendirme sunucusundaki mobil uygulama istemcisini yetkilendirmesine izin vermeyecek, böylece daha fazla erişim jetonu verilmeyecektir.
Son kullanma tarihini ayarlayabilirsiniz (cep telefonu için 1 hafta). Kullanıcı için bazı özel alan refreshId
'u ekleyin (bunun için uuid'i kullanabilirsiniz). Sonraki set Claim Parametre ("iat") ile verilir. refreshId
'u db'ye kaydedin ve talep parametresi olarak ayarlayın. Ardından, jetonu doğruladığınız her zaman, jetonun "yaşını" kontrol etmelisiniz. Bir saatten büyükse, DB'den veri yüklemeli ve refreshId
değerini kontrol etmeli ve geçerli "iat" değerine sahip yeni jeton oluştur ve onu mobil cihaza gönder. Jetonları devre dışı bırakmanız gerektiğinde, db'de refreshId
için yeni bir değer yaratın. Bir saat sonra tüm jetonlar yanlış olur, bu yüzden kullanıcının tekrar her cihazda giriş yapması gerekir. Gerekirse daha özel bir çözüm yapabilirsiniz.
- 1. Veritabanında sql veritabanında veri depolamak nasıl saklanır
- 2. Ayrı bir sayfa arayarak yönlendirmek mantıklı mı?
- 3. SQL Server veritabanında görüntü depolamak için varbinary kullanabilir miyim?
- 4. jQuery önbelleği (bu) için mantıklı mı?
- 5. Backbone.js'yi ASPNET MVC ile bütünleştirmek mantıklı mı?
- 6. OLTP ve OLAP Veritabanlarıyla CQRS Mantıklı mı?
- 7. API istekleri için redux destan mantıklı mı?
- 8. 'Sistem verileri' bir veritabanında mı olmalı?
- 9. Sonlandırılmadan önce bir iş parçacığında CloseHandle() öğesini çağırmak mantıklı mı?
- 10. Bir sözlükte lambdas depolamak
- 11. Mevcut bir POJO nesnesini bir Firebase veritabanında depolamak için en iyi yöntem
- 12. Java'da statik verileri depolamak için bir sınıf mı kullanıyorsunuz?
- 13. Bu çok basit bir ilişki mantıklı mıdır?
- 14. PHP oturum verilerini bir veritabanında depolamak için en iyi yöntemler nelerdir?
- 15. Java'da son bir String tanımlamak mantıklı mıdır?
- 16. Veritabanını büyük bir veritabanında değiştirme
- 17. Postgre'lerde SELECT ... WHERE ... IN (...) sorgusuna 1000 kimliğin yerleştirilmesi mantıklı mı?
- 18. HTML yorumlarını JavaScript bloklarında kullanmak hala mantıklı mı?
- 19. Sütun numaralarım ve önyükleme genişlikleri için yapmam bile mantıklı mı?
- 20. html'yi depolamak için bir veritabanı
- 21. C++: Yapıları bir yığında depolamak
- 22. veritabanında
- 23. Veritabanında
- 24. Önce veritabanında bağlantı dizesini değiştirmenin bir yolu var mı?
- 25. C++ sırasız bir çiftte bir değer depolamak
- 26. Bir Çekirdek Veri Modeli'nde bir NSImage depolamak
- 27. Enum, benim MySQL veritabanında
- 28. Oyun Merkezi: addRecipientsWithPlayerIDs ... Nasıl mantıklı?
- 29. Devam et sürekli tümleştirme depolarını depolamak için kullanılmalı mı?
- 30. Liste veritabanında
Yani OAUTH2 (proje gereksinimi, başka bir API ile arabirim kurmak için gerekli) varsayılan belirteçler ile daha iyi sunucu yapışmasını, bunları veritabanında saklamak ve JWT'yi kazıyorum diye düşünüyorsunuz? Bu örnek için veriyi token içinde saklamama gerek yok (düzenli olarak erişilen ve düzenli olarak erişilen bazı ortak erişimlere erişmek için yapıyordum ama onsuz gerçekten başarabiliyordum). – laurentius
, sorunuzu yanıtlamak için ikinci bir paragraf ekledi – sdoxsee
Bir DB'de depolanmadığında bir jwt'yi kimlik doğrulamayı nasıl çözersiniz? Örneğin bir telefon çalınırsa. Ve 30 dakika geçmedi hırsız 30 dakika geçtikten sonra kullanıcı verilerine sınırsız erişime sahip. – Byrd