İki PWA Arasında İmzalı Token: Backend Olmadan HMAC-SHA256
Kullanıcı kimliğini bir PWA'dan diğerine aktarmanız gerekiyor. Her iki uygulama da ayrı Firebase projelerinde çalışıyor. Hiçbir veritabanını paylaşmıyorlar. Hiçbir kimlik doğrulama yöntemini paylaşmıyorlar.
Bunu backend kodu yazmadan çözebilirsiniz. Sadece tarayıcı Web Crypto API'sine ve imzalı bir URL'ye ihtiyacınız var.
Sorun: PanelControl adlı dahili bir aracın Orders adlı başka bir siteyi açması gerekiyor. Bir kullanıcı bir düğmeye tıkladığında, Orders sitesi kullanıcının kim olduğunu bilmelidir. Kullanıcılar ikinci kez giriş yapmak zorunda kalmamalıdır.
Bunu yapmanın üç yolu:
- Paylaşılan Firebase: Ortak bir veritabanı gerektirir. Burada mümkün değil.
- postMessage: Aynı domain veya bir popup gerektirir. Yönetmesi daha zordur.
- HMAC imzalı URL: Token içeren bir bağlantı kullanın. Bu yöntem mükemmel çalışır.
Nasıl çalışır: HMAC, gizli bir anahtar (secret key) kullanarak bir imza oluşturur. Alıcı, imzayı kontrol etmek için aynı anahtarı kullanır. Eğer eşleşirlerse, göndericiye güvenilir.
İş akışı:
- Gönderici tarafı:
- Kullanıcı adı ve zaman damgası (timestamp) içeren bir payload oluşturun.
- Payload'u HMAC-SHA256 kullanarak imzalayın.
- İmzayı ve payload'u bir URL'ye ekleyin.
- Alıcı tarafı:
- Token'ı URL'den okuyun.
- İmzayı payload'dan ayırın.
- Paylaşılan gizli anahtarı kullanarak imzayı yeniden hesaplayın.
- Token'ın süresinin dolup dolmadığını kontrol edin (örneğin, 5 dakika sonra).
- Geçerliyse, uygulama içinde kullanıcı kimliğini ayarlayın.
Uygulama detayları: Web Crypto API tüm modern tarayıcılarda yerleşiktir (native). ArrayBuffer ile çalışır ve ekstra bir kütüphane gerektirmez.
İşleri temiz tutmak için, alıcı betiği belgenin head kısmında çalışır. Token'ı doğrular, zamanı kontrol eder ve history.replaceState kullanarak URL'yi anında temizler. Bu, token'ı tarayıcı çubuğundan kaldırarak gizli kalmasını sağlar.
Güvenlik üzerine bir not: Gizli anahtar istemci (client) kodunda bulunur. DevTools kullanan herkes bunu görebilir. Sadece isim gibi hassas olmayan veriler aktardığınız dahili iş araçları için bu durum uygundur.
Hassas veriler içeren halka açık bir uygulama geliştiriyorsanız, bunun yerine sunucu taraflı (server-side) bir token kullanın. Dahili araçlar için bu istemci tabanlı yöntem hızlı ve etkilidir.
Ekstra altyapı yok. Ekstra veritabanı yok. Sadece yerleşik tarayıcı araçları.
Kaynak: https://dev.to/androve2k/signed-token-between-two-pwas-hmac-sha256-with-no-backend-3jod
