# Domain Doğrulama

Domain sahipliğini doğrulama
Kaynak: https://selwise.com/docs/channels/domain-verification

Domain doğrulama, Selwise'in güvenlik modelinin temelidir. Genel endpoint'ler (içerik ve olay) bir web kanalı için yalnızca **doğrulanmış** kanaldan ve kanalın alan adından gelen isteklere yanıt verir. Doğrulama tamamlanmadan hiçbir widget render edilmez ve gönderilen olaylar reddedilir.

> **Yalnızca web kanalları**
>
> Bu sayfa web sitesi kanallarını anlatır. Uygulama kanalının doğrulanacak bir alan adı yoktur; kanal oluşturulduğu anda doğrulanmış sayılır ve yetkilendirmeyi API anahtarı yapar — bkz. [Uygulama Kanalları](/docs/channels/app-channels).

## Panelde nerede

Sol menüde **Kanallar → Kanal Özeti** (Channels → Channel Overview) → üstteki **Setup** (Kurulum) bölümü → **Verify the domain** (Alan adını doğrulayın) adımı → **Verify Now** (Şimdi Doğrula) düğmesi. Aynı adım **Setup** ekranında (kurulum merkezi) **Verify the channel** olarak da görünür; oradaki **Verify** düğmesi sizi yine bu ekrana götürür.

Düğme yalnızca doğrulanmamış bir web kanalında görünür; doğrulanan kanalda adım "Done" olur ve düğme kalkar. Doğrulama `admin` rolünün yetkisidir (`site:verify_domain`); `marketing` rolünde istek `403` döner.

Kanalın durumu başlıktaki rozette yazar: **Pending Verification** (Doğrulama Bekliyor) ya da **Verified** (Doğrulandı).

## Tek yöntem var: sayfada script etiketi

Doğrulama bir DNS `TXT` kaydı, bir `meta` etiketi veya yüklenecek bir dosya **istemez**. Tek yöntem şudur: Selwise sunucusu mağazanızın ana sayfasını açar ve ham HTML içinde kendi embed etiketinizi arar.

1. Sitenize Selwise script'ini kanalınızın `data-site-key` değeriyle ekleyin — bkz. [Widget Kurulumu](/docs/integration/widget-installation). Kod, **Channel Overview → Setup** bölümünde hazırdır.
2. **Verify Now**'a basın.
3. Selwise önce `https://alanadiniz`, olmazsa `http://alanadiniz` adresini açar (her deneme için 10 saniye, yönlendirmeler izlenir, `User-Agent: Selwise-Verifier/1.0`).
4. Dönen HTML'de `data-site-key="SITE_KEY"` ifadesi (tek ya da çift tırnak, büyük/küçük harf fark etmez) bulunursa kanal doğrulanır ve genel API önbelleği anında temizlenir; widget'lar ve olaylar hemen çalışmaya başlar.

```html
<script>window.Selwise=window.Selwise||{};window.Selwise.q=window.Selwise.q||[];['track','trackOrder','identify','setTraits','pushDataLayer','grantConsent','revokeConsent','showConsentPreferences','withdrawConsent','endJourney'].forEach(function(m){if(!window.Selwise[m])window.Selwise[m]=function(){window.Selwise.q.push([m,arguments])}});</script>
<script async src="https://widget.selwise.com/client.js" data-site-key="sk_..."></script>
```

Doğrulayıcı yalnızca ikinci satırdaki `data-site-key`'e bakar; ilk satır (komut kuyruğu), script yüklenmeden önce yapılan `Selwise.trackOrder(...)` gibi çağrıların kaybolmaması içindir. Tam kod ve açıklaması [Widget Kurulumu](/docs/integration/widget-installation) sayfasındadır.

API üzerinden aynı işlem:

```bash
curl -X POST https://api.selwise.com/api/v1/channels/CHANNEL_ID/verify-domain \
  -H "Authorization: Bearer ACCESS_TOKEN"
```

Başarılı yanıt, `isVerified: true` olan kanal kaydıdır. `/api/v1/sites/CHANNEL_ID/verify-domain` eski yolu aynı işlemi yapar.

## Doğrulamanın gerektirdikleri

- Etiket, ana sayfanın **sunucudan dönen HTML'inde** bulunmalıdır, yani sayfa tarayıcıda JavaScript çalışmadan önce de etiketi taşımalıdır. Etiketi bir etiket yöneticisi (Google Tag Manager gibi) ya da sayfa yüklendikten sonra çalışan bir script ekliyorsa doğrulayıcı onu **göremez**; embed kodunu şablonunuzun `head` bölümüne doğrudan yapıştırın.
- `data-site-key` değeri kanalınızın anahtarıyla birebir aynı olmalıdır.
- Ana sayfa oturumsuz bir ziyaretçi için başarılı (`2xx`) yanıt vermelidir. Parola sayfası, bakım modu, IP kısıtı ya da bot engelleyici doğrulamayı durdurur.
- Alan adı özel bir port içermemelidir: doğrulama yalnızca standart web portlarını (443 ve 80) açar. `localhost` bu kuralın dışındadır.
- Alan adı, herkese açık bir adrese çözülmelidir. Özel (`10.x`, `192.168.x`…) veya ayrılmış bir adrese çözülen alan adı reddedilir.
- Kayıtlı adres `www.` olmadan saklanır. Selwise önce kök alan adını dener; kökün DNS kaydı yoksa `www.` hâlini açar. Yalnızca `www` üzerinde yayın yapan mağazalar bu sayede doğrulanır.

## Kapsam: hangi alan adlarından gelen istek kabul edilir

Doğrulanmış kanal için genel API, isteğin `Origin` (yoksa `Referer`) başlığındaki alan adını kontrol eder. Kabul edilen:

- kayıtlı alan adının kendisi ve `www.` ile başlayan hâli (kök ↔ `www` her iki yönde de eşleşir), ve
- kayıtlı alan adının **her alt alan adı** (`tr.magaza.com`, `staging.magaza.com`).

`kotu-magaza.com` gibi yalnızca sonu benzeyen bir alan adı reddedilir. Reddedilen istek `403` ve şu biçimde bir mesaj alır: `Origin 'x.com' is not authorized for site 'magaza.com'`.

Bu yüzden test ya da staging alan adınız ana alan adınızın alt alan adıysa ayrıca doğrulama veya takma ad gerekmez. Tamamen farklı bir alan adı için bkz. [Kanal Ayarları](/docs/channels/channel-settings#alan-adı-takma-adları).

> **Yerel geliştirme**
>
> `localhost`, `127.0.0.1` ve `::1`, yalnızca geliştirme ve test API ortamlarında (`NODE_ENV` değeri `development` ya da `test` iken) güvenilir kabul edilir; staging gibi yayındaki bir ortam da canlı sayılır. Canlıda kapatılamaz: açık olsaydı herkes kendi makinesinden sizin kanalınızın adına veri gönderebilirdi. Yerel geliştirme için ayrı bir test kanalı tanımlayın.

## Alan adını değiştirirseniz

**Channel Overview** → **Channel Settings** → **Domain**'i değiştirip kaydettiğinizde doğrulama sıfırlanır: eski doğrulama eski alan adını kanıtlıyordu. Yeni alan adını yeniden doğrulayana kadar kanal `403 Site not verified` döner. Form bunu kaydetmeden önce, alanın yanında uyarır. Kanal anahtarı değişmez; yerleştirme kodunu güncellemeniz gerekmez.

## Doğrulama başarısızsa

Panel, hata nedenini **Verify Now** düğmesinin altındaki kırmızı kutuda aynen yazar. Tümü `400` döner:

| Kod | Ne diyor | Ne yapmalı |
|---|---|---|
| `DOMAIN_VERIFY_TAG_NOT_FOUND` | Sayfa açıldı ama `data-site-key="..."` bulunamadı | Embed kodunu şablonun `head` bölümüne doğrudan yapıştırın; etiket yöneticisi veya geç yüklenen script yetmez. Yönlendirme sonrası açılan adres mesajda yazar (örneğin `www.` ya da bir dil yolu); etiket o sayfada olmalı |
| `DOMAIN_VERIFY_HTTP_STATUS` | Sayfa başarısız yanıt verdi (örneğin `403`, `503`) | Ana sayfa oturumsuz ziyaretçiye açık olmalı; parola sayfasını, bakım modunu veya bot engelleyiciyi kapatın |
| `DOMAIN_VERIFY_NOT_RESOLVED` | Alan adı (ve `www.` hâli) DNS'te çözülmüyor | Yazımı ve DNS kayıtlarını kontrol edin |
| `DOMAIN_VERIFY_CERTIFICATE` | HTTPS sertifikası süresi dolmuş, kendinden imzalı, eksik zincirli ya da başka alan adı için | Sertifikayı düzeltin |
| `DOMAIN_VERIFY_TIMEOUT` | Mağaza 10 saniyede yanıt vermedi | Mağazanın açık olduğunu ve bilinmeyen ziyaretçileri engellemediğini kontrol edin |
| `DOMAIN_VERIFY_UNREACHABLE` | Bağlantı reddedildi, sıfırlandı veya ağ ulaşılamaz | Mağazanın bu adreste yayında olduğunu kontrol edin |
| `DOMAIN_VERIFY_CUSTOM_PORT` | Kayıtlı alan adı port içeriyor | **Channel Settings**'ten alan adını portsuz kaydedin |
| `DOMAIN_VERIFY_PRIVATE_ADDRESS` | Alan adı özel/ayrılmış bir IP'ye çözülüyor | DNS'i herkese açık mağazaya yönlendirin |
| `DOMAIN_VERIFY_APP_CHANNEL` | Uygulama kanalında doğrulama istendi | Uygulama kanalında doğrulama yoktur; API anahtarı kullanın |

Doğrulama sonrası da widget görünmüyorsa: [Widget Görünmüyor](/docs/troubleshooting/widget-not-showing). Doğrulanmamış kanalda `events/batch` isteği `403` döner; bu, doğrulamayı geçene kadar normaldir.
