JWT yenileme belirteci akışı


129

Bir mobil uygulama oluşturuyorum ve kimlik doğrulama için JWT kullanıyorum.

Bunu yapmanın en iyi yolu, erişim belirtecini istediğim sıklıkta sona erdirebilmem için JWT erişim belirtecini bir yenileme belirteciyle eşleştirmek gibi görünüyor.

  1. Yenileme belirteci neye benzer? Rastgele bir dizge mi? Bu dizi şifreli mi? Başka bir JWT mi?
  2. Yenileme belirteci, erişim için kullanıcı modelindeki veritabanında saklanacak, doğru mu? Bu durumda şifrelenmesi gerekiyor gibi görünüyor
  3. Bir kullanıcı oturum açtıktan sonra yenileme belirtecini geri gönderir miyim ve ardından istemcinin bir erişim belirtecini almak için ayrı bir yola erişmesini sağlar mıydım?

3
Yenileme belirteçleri kullanıyorsanız, kullanıcıların bunları kullanıcı arayüzünde geçersiz kılma olanağı sağlamanız gerektiğini unutmayın. Ayrıca, örneğin bir ay süreyle kullanılmazlarsa, bunların otomatik olarak sona ermesi önerilir.
Vilmantas Baranauskas

1
@jtmarmon: İstemci tarafında yenileme belirtecini nasıl saklarsınız? Güvenli Android cihazı mı?
j10

Yanıtlar:


39

JWT'ler ve yenileme jetonları ile ilgili olduğu için bunun OAuth 2.0 ile ilgili olduğunu varsayarsak ...:

  1. tıpkı bir erişim belirteci gibi, prensipte bir yenileme belirteci, tanımladığınız tüm seçenekleri içeren herhangi bir şey olabilir; Yetkilendirme Sunucusu vatansız olmak istediğinde veya onu sunan istemciye bir tür "sahiplik kanıtı" semantiğini zorlamak istediğinde bir JWT kullanılabilir; Bir yenileme belirtecinin, bir Kaynak Sunucusuna değil, yalnızca onu ilk başta veren Yetkilendirme Sunucusuna sunulması açısından erişim belirtecinden farklı olduğunu unutmayın; bu nedenle, erişim olarak JWT'ler için kendi kendine yeten doğrulama optimizasyonu yenileme jetonları için tutulmaz

  2. bu, veritabanının güvenliğine / erişimine bağlıdır; Veritabanına diğer taraflar / sunucular / uygulamalar / kullanıcılar tarafından erişilebiliyorsa, evet (ancak kilometreniz, şifreleme anahtarını nerede ve nasıl sakladığınıza göre değişebilir ...)

  3. Yetkilendirme Sunucusu, istemcinin bunları elde etmek için kullandığı hibe bağlı olarak aynı anda hem erişim jetonlarını hem de yenileme jetonlarını verebilir; şartname, standartlaştırılmış hibelerin her birine ilişkin ayrıntıları ve seçenekleri içerir


31
2. Veritabanınızda yenileme belirtecinin bir karmasını depolamalı ve ardından kullanıcının yenileme belirtecinin karmasını depolanan karmayla karşılaştırmalısınız. Burada "düz metin şifrelerini veritabanınızda saklamayın" kuralı izler. Kullanıcı için oluşturduğunuz rastgele bir şifre gibi bir belirteç düşünün.
Rohmer

2
Ayrıca, daha fazla güvenlik sağlamak istiyorsanız, yenileme simgesi rotasyonu da gerçekleştirin. Bunun önemi, ITEF RFC 6749'da zaten belirtilmiştir . Doğru şekilde uygulanırsa, bu aynı zamanda belirteç hırsızlığı senaryosunun, yani yenileme belirtecinin bir saldırgan tarafından çalındığının belirlenmesine de yardımcı olabilir. Daha iyi bir açıklama arıyorsanız, bu bağlantıya gidin
Bhumil Sarvaiya

84

JWT erişim jetonunuzu iptal etmek için yapmanız gerekenler aşağıda verilmiştir:

  1. Oturum açtığınızda, istemciye yanıt olarak 2 belirteç (Erişim belirteci, Yenileme belirteci) gönderin.
  2. Erişim belirtecinin sona erme süresi daha az olacak ve Yenileme daha uzun süre geçecek.
  3. İstemci (Ön uç), yenileme belirtecini yerel deposunda ve erişim belirtecini tanımlama bilgilerinde saklayacaktır.
  4. İstemci, API'leri çağırmak için bir erişim belirteci kullanacaktır. Ancak süresi dolduğunda, yerel depolamadan yenileme jetonunu seçin ve yeni jetonu almak için kimlik doğrulama sunucusu API'sini çağırın.
  5. Yetkilendirme sunucunuz, yenileme belirtecini kabul edecek, geçerliliğini kontrol edecek ve yeni bir erişim belirteci döndürecek bir API'ye sahip olacaktır.
  6. Yenileme belirtecinin süresi dolduğunda, Kullanıcı oturumu kapatılacaktır.

Daha fazla ayrıntıya ihtiyacınız olursa lütfen bize bildirin, kodu (Java + Spring boot) da paylaşabilirim.

Sorularınız için:

S1: Bu, daha az hak talebinde bulunulan ve uzun vade süresine sahip başka bir JWT.

S2: Bir veritabanında olmayacak. Arka uç hiçbir yerde saklanmayacaktır. Jetonun şifresini özel / genel anahtarla çözecekler ve ayrıca sona erme süresiyle de doğrulayacaklar.

S3: Evet, Doğru


28
Bence JWT, içinde saklanmalı localStorageve refreshTokenbir httpOnly. refreshToeknEkstra dikkatli ele alınması gereken bu yüzden yeni bir JWT'yi almak için kullanılabilir.
Tnc Andrei

2
Teşekkürler httpOnly'de depolamakla ne demek istiyorsun? Neden her ikisini de localStorage'da depolamıyorsunuz?
Jay

8
Yenileme belirtecini kullanmanın faydalarını kaçırıyorum, erişim belirtecinin geçerliliğini uzatmak için aynı şey olmaz mı?
user2010955

3
@Jay Microsoft Developer Network'e göre HttpOnly, Set-Cookie HTTP yanıt başlığında bulunan ek bir bayraktır. Bir tanımlama bilgisi oluştururken HttpOnly işaretinin kullanılması, istemci tarafı komut dosyasının korumalı tanımlama bilgisine erişme riskini azaltmaya yardımcı olur (tarayıcı destekliyorsa).
shadow0359

23
# 2 çok yanlış. Bir yenileme belirteci sunucu tarafında saklanmalıdır. Yenileme belirteci için JWT'nin "kendi kendine yeten" özelliğinden yararlanmamalısınız. Bunu yapmak, özel anahtarınızı değiştirmek dışında yenileme belirteçlerini iptal etmenize gerek kalmaz.
Jai Sharma

26

Yenileme belirteci ile JWT'nin Node.js ile bu uygulamaya göre :

1) Bu durumda bir uid kullanırlar ve bu bir JWT değildir. Jetonu yenilediklerinde, yenileme jetonunu ve kullanıcıyı gönderir. Bunu bir JWT olarak uygularsanız, kullanıcıyı göndermenize gerek yoktur çünkü JWT'nin içinde olacaktır.

2) Bunu ayrı bir belgede (tablo) uygularlar. Benim için mantıklı çünkü bir kullanıcı farklı istemci uygulamalarında oturum açabilir ve uygulama tarafından bir yenileme belirtecine sahip olabilir. Kullanıcı, bir uygulamanın yüklü olduğu bir cihazı kaybederse, bu cihazın yenileme simgesi, oturum açmış diğer cihazları etkilemeden geçersiz kılınabilir.

3) Bu uygulamada oturum açma yöntemine hem erişim belirteci hem de yenileme belirteci ile yanıt verir. Bana doğru geliyor.


"1) Bu durumda bir uid kullanıyorlar ..." diyerek UUID mi demek istediniz?
ozanmuyes

Peki ya bu daha basit uygulama - JWT sorunu - yenilemek istediğinizde eski JWT'yi gönderin - ( iatpencereden kontrol edebilirsiniz ) - öncekine göre yeni bir tane yeniden
yayınlayın

@adonese sadece içinde JWTolmasını istediğinizi göndererek refresh_tokenmi? Öyleyse, OAuth RFC 6749 açıkça refresh_tokenkaynak sunucusuna gönderilmemesini söylüyor (ve JWTkaynak sunucularına gönderiliyor): tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa
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.