UurKorkmaz @codanux
Kaçırdığınız noktalar var.
Bu pakette (sözde) token yenileme var ama refresh_token özelliği yok. Eğer token'ın süresini bir refresh_token aracılığıyla uzatmak istiyorsanız bu sistemi sizin yazmanız gerekiyor ve token veritabanında tutulmalı. Mevcut pakette elinizdeki token'ı gönderip yeniletiyorsunuz ve yenilenebilmesi için süresinin bitmemiş olması gerekiyor, süresi bitmiş ise yeniden login olmanız gerekecek. Bu da kullanıcının tekrar kullanıcı adı ve şifresi girmesi için bir login ekranı görmesi demek. Token yenilenince size yeni token veriyor. Bu refresh_token mantığına ters çünkü refresh_token'ın amacı mevcut token'ı değiştirmeden sadece süresini uzatmak. Burada şu olayı gözden kaçırıyorsunuz: Token refresh vs bunlar iki farklı uygulama birbiriyle haberleşirken kullanılan şeyler. Örneğin Petrol Ofisine istek atıyorsunuz, size o ayki benzin alımlarını getiriyor. Burada refresh_token kullanılır (zaten büyük ihtimalle OAuth kullanılmıştır, token dışında veritabanında tutulan bilgiler vardır.) ama siz bir uygulama yazdıysanız, atıyorum backend Laravel, frontend Vue ise, kendi içinizde sizin ölen token'lara ihtiyacınız yok ki, uzun süre kullanabileceğiniz bir token'a ihtiyacınız var. Kendi içinizde refresh_token ve kısa ömürlü token kullanmanız evde tek iken banyoya girerken kapıyı çalmanız gibi bir şey. Ben kendi uygulamamda sisteme girdim, token aldım, işlem yapıyorum, uygulama açık iken token neden ölsün ki? Zaten backend tarafında bir yerde tutmuyorum onu, frontend tutuyordur, alır bir yerde saklar kullanır. Sakladığı yer zaten client içinde, uygulamanın kullanıldığı cihazda, localStorage, cookie vs. Aynı kullanıcı ile biri başka tarayıcıdan girerse ona başka token verecek ve token onun tarayıcısında tutulacak, diğer giriş yapan ile ilgisi yok. Kısa ömür verilecekse onu frontend verir. Backend'in verdiği ömür uzun olmalı, işlemim yarıda kesilmemeli ya da süresi bitmeden yenileceksiniz ki bu da aynı şey zaten.
Sadece bir kaç yerde token ile exceptionları yakalamanız gerekeceği için global olarak yakalamanıza gerek olduğunu düşünmüyorum ama öyle yapacağım diyorsanız exceptionları yakalarken direkt yakalamanızı öneririm. UnauthorizedHttpException üzerinden gitmenin bir anlamı yok:
if($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException::class) {
// return response...
}
Zaten içeride token ile ilgili bir işlem yaparken bu exceptionları alabilirsiniz, onun dışında bunları daha görmeden AuthenticationException alırsınız çünkü token gerektiren rotalar api middleware dahilinde, önce o ateşleniyor doğal olarak.
Son olarak size Sanctum'dan bahsetmiştim. Laravel'in kendi içerisindeki resmi paket dururken neden bu pakette ısrar ettiniz anlamadım. Sonuçta paket kullanıyorsunuz, kullanmışken ideal olanı kullanın. Ayrıca Sanctum token'ları veritabanında tuttuğu için ek özellikler de verebiliyorsunuz:
https://laravel.com/docs/7.x/sanctum