C# Refresh token nasıl tutulmalı?

delikarga

Kilopat
Katılım
30 Temmuz 2019
Mesajlar
1.962
Çözümler
27
Merhabalar. Geliştirdiğim bir projede jwt token expire oldu mu tekrar giriş yapılmasına gerek kalmadan token refresh yapmak için refresh token üreteceğim ancak internette çok fazla bilgi kirliliği var ve işin içinden çıkamadım. Bazıları refresh token'ı rastgele bir sayı oluşturup base 64 string olarak expire süresiyle birlikte user tablosunda tutuyor. Bazıları ise refresh token'ın başka bir jwt token olarak gönderilmesi gerektiğini söylüyor. Sizce hangisi doğrudur?

@RaSGooL @Eray T
 
Merhabalar. Geliştirdiğim bir projede jwt token expire oldu mu tekrar giriş yapılmasına gerek kalmadan token refresh yapmak için refresh token üreteceğim ancak internette çok fazla bilgi kirliliği var ve işin içinden çıkamadım. Bazıları refresh token'ı rastgele bir sayı oluşturup base 64 string olarak expire süresiyle birlikte user tablosunda tutuyor. Bazıları ise refresh token'ın başka bir jwt token olarak gönderilmesi gerektiğini söylüyor. Sizce hangisi doğrudur?

@RaSGooL @Eray T
Ben 2. senaryoyu kullanıyorum. Kullanıcı giriş yaptığında token ve refreshToken gönderiyorum.
Normal isteklerde refreshToken gönderilmez. Sadece jwt gönderilir. Eğer istekde 401 gelirse ve elimde refreshToken varsa /refreshToken endpointe tekrar istek atıyorum. Refresh token doğru ise bilgilere uygun yeni jwt oluşturuluyor ve gönderiliyor.

Her iki mantıkta benzer yapıda. Birinde extra db den kontrol yapıyorsun.
 
Ben 2. senaryoyu kullanıyorum. Kullanıcı giriş yaptığında token ve refreshToken gönderiyorum.
Normal isteklerde refreshToken gönderilmez. Sadece jwt gönderilir. Eğer istekde 401 gelirse ve elimde refreshToken varsa /refreshToken endpointe tekrar istek atıyorum. Refresh token doğru ise bilgilere uygun yeni jwt oluşturuluyor ve gönderiliyor.

Her iki mantıkta benzer yapıda. Birinde extra db den kontrol yapıyorsun.
Orayı anladım zaten, her istekte sadece jwt gönderiyor ama 401 gelirse refresh api adersine hem jwt hem de refresh tokenı göndericek. Serverda kontrol edicek refresh token doğruysa yeni jwt ve refresh token göndericek. Ama şu refresh tokenı dbye kaydetsem ne kadar güvenli oluyor bilemedim. JWT olarak göndersem mantıksız geliyor bana çünkü payload kısmına ne yazcam yani yine kullanıcı claimlerini mi yazıcam.

@RaSGooL hocam direkt içine aynı claimleri koyup sadece süresi daha uzun olan bir claim oluşturup refresh token olarak yolladım mantıklı mı? Elde edilen tokenlara bakınca header ve signature kısımları aynı sadece payload kısmının farklı görünüyor (base64 stringde)
 
Son düzenleme:
Orayı anladım zaten, her istekte sadece jwt gönderiyor ama 401 gelirse refresh api adersine hem jwt hem de refresh tokenı göndericek. Serverda kontrol edicek refresh token doğruysa yeni jwt ve refresh token göndericek. Ama şu refresh tokenı dbye kaydetsem ne kadar güvenli oluyor bilemedim. JWT olarak göndersem mantıksız geliyor bana çünkü payload kısmına ne yazcam yani yine kullanıcı claimlerini mi yazıcam.

@RaSGooL hocam direkt içine aynı claimleri koyup sadece süresi daha uzun olan bir claim oluşturup refresh token olarak yolladım mantıklı mı? Elde edilen tokenlara bakınca header ve signature kısımları aynı sadece payload kısmının farklı görünüyor (base64 stringde)
Keyleri aynı ise refreshToken normal token yerine geçer. Güvenliği kalmaz ki o zaman. Claim aynı kalabilir ama key kesinlikle farklı olsun bence. Hatta jwt ve refresh token beraber oluşuyorsa her ikisine ortak key claim atanabilir. Hatta bu key istekten gelen user-agenttan bile alınabilir. Daha sonra ikisi içerisinden claim keyleri kontrol edilebilir. Bu sayede refreshToken sadece bir kez kullanılır. Bunu yapmamıştım, şimdi aklıma geldi. Mantıksız olabilir bilmiyorum.

Ama şu refresh tokenı dbye kaydetsem ne kadar güvenli oluyor bilemedim. JWT olarak göndersem mantıksız geliyor bana çünkü payload kısmına ne yazcam yani yine kullanıcı claimlerini mi yazıcam.
Haklısın. Bana da buralar bir tık garip geliyor. Db de de tutabilirsin ama işte farklı cihaz muhabbetleri ne olacak? Bunun için sırf Session gibi tablo mu oluşturmak lazım? Yani 2 farklı tarayıcıdan login olunca refreshToken nerede tutulacak? Mantıken refreshToken o cihaz için olması lazım. Tam bende bilmiyorum açıkçası.
 
Keyleri aynı ise refreshToken normal token yerine geçer. Güvenliği kalmaz ki o zaman. Claim aynı kalabilir ama key kesinlikle farklı olsun bence. Hatta jwt ve refresh token beraber oluşuyorsa her ikisine ortak key claim atanabilir. Hatta bu key istekten gelen user-agenttan bile alınabilir. Daha sonra ikisi içerisinden claim keyleri kontrol edilebilir. Bu sayede refreshToken sadece bir kez kullanılır. Bunu yapmamıştım, şimdi aklıma geldi. Mantıksız olabilir bilmiyorum.


Haklısın. Bana da buralar bir tık garip geliyor. Db de de tutabilirsin ama işte farklı cihaz muhabbetleri ne olacak? Bunun için sırf Session gibi tablo mu oluşturmak lazım? Yani 2 farklı tarayıcıdan login olunca refreshToken nerede tutulacak? Mantıken refreshToken o cihaz için olması lazım. Tam bende bilmiyorum açıkçası.
Doğru söylüyosun yerini tutma ihtimali de var. Refresh tokenın secret keyini farklı ayarladım şimdi. Bu sayede eğer refresh token gönderirse imzasından dolayı geçersiz yanıtı alıcak.
 
Son düzenleme:

Geri
Yukarı