Dokümantasyon

TOKEN HATA COZUMU

← Geri

Token Hatası Çözümü

Yeni Token Mimarisini Anlamak

  • Sunucu artık kullanıcıların şifreleme anahtarını (master key) hiçbir yerde saklamaz.
  • Token tamamen base64(userId:encryptionKey) formatındadır ve bu değeri yalnızca kullanıcı bilir.
  • Aynı token, Chrome Extension ve Windows uygulamasında kullanıldığı sürece mevcut şifreler çözülebilir.
  • Token kaybolursa eski veriler açılamaz; bu nedenle tokenınızı mutlaka güvenli bir yerde saklayın.

Token Oluşturma / Kaydetme Adımları

  1. Web arayüzünde sağ üstteki Token menüsünü açın.
  2. Elinizde bir token varsa “Mevcut Token” alanına yapıştırıp Kaydet’e tıklayın. Tarayıcı tokenı yerelde saklar.
  3. Yeni bir anahtar başlatmak istiyorsanız “Yeni Şifreleme Anahtarı” alanını boş bırakıp Yeni Token Oluştur butonuna basın. Sunucu yeni bir anahtar üretip tokenı döner; bu değeri mutlaka yedekleyin.
  4. Kopyala butonu ile tokenı panoya alıp Chrome Extension veya Windows uygulamasına yapıştırabilirsiniz.

Middleware Davranışı

TokenAuthenticationMiddleware, gelen Authorization: Bearer {token} header’ını inceleyip encryption key’i claims ve HttpContext.Items içine taşır:

var tokenBytes = Convert.FromBase64String(token);
var tokenString = Encoding.UTF8.GetString(tokenBytes);
var parts = tokenString.Split(':');
if (parts.Length == 2)
{
    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.NameIdentifier, parts[0]),
        new Claim("EncryptionKey", parts[1])
    };
    context.User = new ClaimsPrincipal(new ClaimsIdentity(claims, "Token"));
    context.Items["TokenEncryptionKey"] = parts[1];
}

Session veya veritabanı kullanılmaz; anahtar tamamen token içinden alınır.

Sık Karşılaşılan Senaryolar

  • Token Kayboldu: Aynı key’i bilmiyorsanız eski şifreleri çözemeyeceğiniz için yeni bir anahtar oluşturmanız gerekir. Bu durumda veriyi yeniden girmeniz gerekir.
  • TypeError: Failed to fetch hatası: Tarayıcı token göndermiyorsa veya CORS izinleri eksikse oluşur. Tarayıcıdaki tokenı temizleyip yeniden kaydedin, API adresinizin doğru olduğundan emin olun.
  • Şifre çözülemiyor: Token farklı bir anahtar içeriyor demektir. Chrome Extension ve web arayüzünde aynı token’ı kullandığınızdan emin olun.

Test Kontrol Listesi

  1. Token modalını açıp mevcut tokenınızı kaydedin veya yeni token üretin.
  2. Web arayüzünden örnek bir şifre ekleyin; ardından “Göster” butonuyla şifreyi çözüp doğrulayın.
  3. Aynı token’ı Chrome Extension’a girip “Kullanıcı Adı Şifre Yapıştır” özelliğini test edin.
  4. Windows uygulamasında Ayarlar > Token alanına aynı değeri girerek şifre listesini çekin.
  5. Herhangi bir noktada hata alırsanız tokenı tekrar kontrol edin; gerekirse eski tokenınızı geri yükleyin.

Token Oluşturma Hatası Çözümü

Sorun

Token oluştururken "Token oluştururken hata oluştu" hatası alınıyor.

Olası Nedenler

  1. Session'da Encryption Key Yok: Session'a encryption key kaydedilmemiş olabilir
  2. Session Yüklenmemiş: Session henüz yüklenmemiş olabilir
  3. Session Commit Edilmemiş: Session'a yazılan veriler commit edilmemiş olabilir
  4. User ID Bulunamıyor: Kullanıcı claim'leri doğru set edilmemiş olabilir

Çözüm

1. AuthController Güncellemesi

  • Session'ı yükleme (LoadAsync)
  • Encryption key yoksa oluşturma
  • Session'ı commit etme (CommitAsync)
  • Detaylı hata mesajları

2. Program.cs Güncellemesi

  • OnCreatingTicket event'inde session yükleme
  • Encryption key oluşturulduktan sonra session commit etme
  • Middleware sırasını düzeltme (session authentication'dan önce)

3. JavaScript Güncellemesi

  • Detaylı hata mesajları
  • Console'a hata loglama

Yapılan Değişiklikler

AuthController.cs

[HttpGet("token")]
public IActionResult GetToken()
{
    try
    {
        // Session'ı başlat (eğer başlatılmamışsa)
        HttpContext.Session.LoadAsync().Wait();
        
        var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        if (string.IsNullOrEmpty(userId))
        {
            // Tüm claim'leri logla
            var allClaims = User.Claims.Select(c => $"{c.Type}: {c.Value}").ToList();
            return Unauthorized(new { message = "Kullanici bulunamadi", claims = allClaims });
        }

        var encryptionKey = HttpContext.Session.GetString("EncryptionKey");
        
        // Eğer encryption key yoksa, yeni bir tane oluştur
        if (string.IsNullOrEmpty(encryptionKey))
        {
            encryptionKey = _cryptoService.GenerateKey();
            HttpContext.Session.SetString("EncryptionKey", encryptionKey);
            
            // Session'ı commit et
            HttpContext.Session.CommitAsync().Wait();
        }

        // Token oluştur
        var token = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userId}:{encryptionKey}"));

        return Ok(new
        {
            token = token,
            userId = userId,
            message = "Token basariyla olusturuldu"
        });
    }
    catch (Exception ex)
    {
        return StatusCode(500, new { message = "Token olusturulurken hata olustu", error = ex.Message, stackTrace = ex.StackTrace });
    }
}

Program.cs - OnCreatingTicket Event

// Encryption key'i session'a kaydet
if (context.HttpContext.Session != null)
{
    // Session'ı yükle
    await context.HttpContext.Session.LoadAsync();
    
    var encryptionKey = context.HttpContext.Session.GetString("EncryptionKey");
    if (string.IsNullOrEmpty(encryptionKey))
    {
        encryptionKey = cryptoService.GenerateKey();
        context.HttpContext.Session.SetString("EncryptionKey", encryptionKey);
        
        // Session'ı commit et
        await context.HttpContext.Session.CommitAsync();
    }
}

Program.cs - Middleware Sırası

// Session'ı authentication'dan önce başlat
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();

// Token authentication middleware'i authorization'dan sonra
app.UseMiddleware<UI.Web.Middleware.TokenAuthenticationMiddleware>();

Test

  1. Uygulamayı yeniden başlatın
  2. Web uygulamasına giriş yapın
  3. "Token Al" butonuna tıklayın
  4. Token başarıyla oluşturulmalı

Sorun Giderme

Hala hata alıyorsanız:

  1. Tarayıcı konsolunu kontrol edin (F12)

    • Hata mesajını görüntüleyin
    • Detaylı hata bilgilerini kontrol edin
  2. Session'ı kontrol edin

    • Session cookie'sinin set edildiğini kontrol edin
    • Session'ın yüklendiğini kontrol edin
  3. User Claim'lerini kontrol edin

    • User ID'nin doğru set edildiğini kontrol edin
    • Tüm claim'leri loglayın
  4. Uygulamayı yeniden başlatın

    • Değişikliklerin uygulanması için uygulamayı yeniden başlatın

Önemli Notlar

  • Session'ın yüklenmesi ve commit edilmesi önemlidir
  • Encryption key yoksa otomatik olarak oluşturulur
  • Hata mesajları detaylıdır ve console'a loglanır
  • Middleware sırası önemlidir (session authentication'dan önce)