> For the complete documentation index, see [llms.txt](https://qpapel.papelship.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://qpapel.papelship.com/documentation/tr-documentation/fonksiyonlar/anahtar-dogrulama.md).

# Anahtar Doğrulama

Bir lisans anahtarını sunucu ile doğrular ve kimliği doğrulanmış bir oturum başlatır.

{% hint style="info" %}
Doğrulama işlemine başlamadan önce `qpapel::Connect(ctx)` çağrılarak güvenli bir bağlantı kurulmuş olmalıdır.
{% endhint %}

## İmza (Signature)

```cpp
char* Authenticate(QPCTX c, const char* licenseKey);
```

## Parametreler

| Parametre    | Tür           | Açıklama                                                     | Zorunlu |
| ------------ | ------------- | ------------------------------------------------------------ | ------- |
| `c`          | `QPCTX`       | İstemci bağlam (context) işaretçisi                          | Evet    |
| `licenseKey` | `const char*` | Doğrulanacak lisans anahtarı (Format: `XXXX-XXXX-XXXX-XXXX`) | Evet    |

## Dönüş Değeri

**Tür:** `char*`

| Değer                | Açıklama                                                                                         |
| -------------------- | ------------------------------------------------------------------------------------------------ |
| `Null olmayan char*` | Doğrulama başarılı. Oturum JWT token'ını döndürür.                                               |
| `nullptr`            | Doğrulama başarısız. Hata detayları için `qpapel::GetLastStatus(ctx)` fonksiyonunu kontrol edin. |

{% hint style="warning" %}
Döndürülen oturum token'ı dizgesi (string) SDK tarafından dinamik olarak tahsis edilmiştir. Uygulamanızda bellek sızıntılarını önlemek için, işiniz bittiğinde `qpapel::FreeString(sessionToken)` çağrısıyla bu belleği **mutlaka** serbest bırakmanız gerekir.
{% endhint %}

## Temel Kullanım Örneği

```cpp
#include <iostream>
#include "qPapelLib.h"

int main() {
    if (!qpapel::Init()) return 1;
    
    QPCTX ctx = qpapel::CreateContext();
    qpapel::SetConfig(ctx, "pk_your_api_key", "", 0, "1.0.0");
    
    if (qpapel::Connect(ctx)) {
        std::string licenseKey;
        std::cout << "Lisans anahtarını girin: ";
        std::cin >> licenseKey;
        
        std::cout << "[Auth] Anahtar doğrulanıyor..." << std::endl;
        char* token = qpapel::Authenticate(ctx, licenseKey.c_str());
        
        if (token != nullptr) {
            std::cout << "[BAŞARILI] Geçerli lisans anahtarı!" << std::endl;
            std::cout << "Oturum Token'ı: " << token << std::endl;
            
            // Tahsis edilen belleği serbest bırakın!
            qpapel::FreeString(token);
        } else {
            char* err = qpapel::GetLastStatus(ctx);
            std::cerr << "[HATA] Hata: " << (err ? err : "Geçersiz Anahtar") << std::endl;
            if (err) qpapel::FreeString(err);
        }
    }
    
    qpapel::DestroyContext(ctx);
    return 0;
}
```

## Web Paneli Anahtar Doğrulama Adımları

`Authenticate` çağrıldığında, sunucu aşağıdaki kontrolleri gerçekleştirir:

1. **Anahtar Varlığı**: Anahtarın veritabanında var olduğunu doğrular.
2. **Anahtar Durumu**: Anahtarın aktif olduğunu (askıya alınmamış veya süresi dolmamış) onaylar.
3. **HWID Eşleşmesi**: Çoklu cihaz lisans kötüye kullanımını önlemek için yerel donanım imzasını kayıtlı HWID ile karşılaştırır.
4. **Cihaz Limiti**: Maksimum cihaz sayısının aşılmadığından emin olur.
5. **Ürün Erişimi**: Bu anahtarın istenen ürünü yükleme iznine sahip olduğunu doğrular.

## Yaygın Hata Kodları

Ayrıntılı doğrulama başarısızlık nedenlerini almak için `qpapel::GetLastStatus(ctx)` fonksiyonunu kullanın:

| Hata Mesajı              | Neden                                                 | Çözüm                                            |
| ------------------------ | ----------------------------------------------------- | ------------------------------------------------ |
| `"Invalid key"`          | Lisans anahtarı mevcut değil                          | Anahtar yazılışını ve formatını doğrulayın       |
| `"License expired"`      | Abonelik süresi dolmuş                                | Panelden anahtarı yenileyin                      |
| `"HWID mismatch"`        | Anahtar farklı bir cihaza bağlı                       | Panel portalı üzerinden HWID'yi sıfırlayın       |
| `"License suspended"`    | Anahtar bir yönetici tarafından devre dışı bırakılmış | Destek/yönetim ile iletişime geçin               |
| `"Max devices exceeded"` | Aktif cihaz sayısı limitine ulaşılmış                 | Lisans planını yükseltin veya HWID'yi sıfırlayın |
