# Müşteri Adına Oturum Açma

https://dev.wisecp.com/tr/musteri-adina-oturum-acma

Kendi sisteminizden bir müşteriye giriş yapılmış oturum devredin; parolasını hiç görmeden.

## Genel Bakış

İki uç, müşterinin sizin sisteminizden kendi paneline geçtiği anı karşılar.

- **POST /clients/validate**: Bir e-posta ve parolanın canlı bir müşteri hesabına ait olup olmadığını kontrol eder. Kimlik bilgilerini sizin arayüzünüz toplar, bu uç arkasındaki müşteriyi söyler.
- **POST /clients/sso**: Tek kullanımlık bir giriş bileti ve onu harcayan adresi üretir. Müşteriyi oraya gönderirsiniz, giriş yapmış olarak varır.

Ziyaretçinin kim olduğunu zaten biliyorsanız ikincisini kullanın: kendi portalınız, bir kontrol paneli, bir destek aracı. Birincisi yalnız parolayı siz soruyorsanız gerekir.

## Ön Koşullar

- **Scope**: `Clients/ValidateClient` ve `Clients/CreateClientSsoToken`. Yalnız kullandığınızı verin.
- **Hesap durumu**: Müşteri aktif bir üye hesabı olmalı. Pasif ya da engelli hesaplar bilet üretilirken reddedilir.
- **HTTPS**: Bilet adresin içinde taşınır. Yönlendirmeyi HTTPS üzerinden yapın ki yolda okunamasın.

## Yapı

Bilet bir veri paketi değil, rastgele bir gizli değerdir. Girişin ihtiyaç duyduğu her şey — son geçerlilik ve inilecek sayfa — hesapta saklanır. Böylece çağıranın eline geçen değer başka bir hedefe ya da daha uzun bir süreye çevrilemez.

- **Auth::createSsoToken()**: Bileti üretir, hesapta şifreli saklar ve adresi döndürür.
- **Auth::verifySsoToken()**: Bileti çözer ve oturum kurulmadan önce harcar.
- **Auth::ssoLogin()**: Olağan giriş kapısını işletir, sonra oturumu açar.

## Adım Adım

### Müşteriyi İçeri Almak

1. Sisteminiz bu ziyaretçinin hangi müşteri olduğuna karar verir. O müşterinin kimliğiyle `POST /clients/sso` çağırın. Yanıtta `token`, `url` ve `expires_at` döner.
2. Ziyaretçiyi hemen `url` adresine yönlendirin. Sonrası için bağlantı olarak göstermeyin — bilet 60 saniye geçerlidir.
3. Ziyaretçi giriş yapmış olarak varır; panosuna ya da `destination` ile belirttiğiniz sayfaya. Bilet harcanmıştır, aynı adres ikinci kez çalışmaz.

### İnilecek Sayfayı Seçmek

1. `destination` vermezseniz müşteri panosuna iner.
2. Daha derine indirmek için route anahtarını parametreleriyle gönderin: `"destination": "services", "destination_values": [128]`.
3. Mutlak adres de çalışır, yeter ki bu kuruluma ait olsun. Başka bir yeri gösteren adres yok sayılır ve müşteri panosuna iner.

## Referans

### Bilet İsteği

- **client_id**: Zorunlu. Bilet üretilecek müşteri. `user_id` eski adı olarak da kabul edilir.
- **destination**: İsteğe bağlı. Bir route anahtarı ya da bu kuruluma ait mutlak adres.
- **destination_values**: İsteğe bağlı. `destination` bir route anahtarıysa route parametreleri.

### Biletin Davranışı

- **Tek kullanımlık**: Adres açıldığı anda harcanır. Tekrar kullanılan bağlantı, açıklamalı bir mesajla giriş formuna iner.
- **Altmış saniye**: Üretin ve aynı hamlede izleyin.
- **Müşteri başına bir tane**: Yeni bilet, o müşterinin önceki biletini sessizce geçersiz kılar.
- **Giriş kapısı**: Hesap durumu, ülke engeli ve modül vetoları bilet harcanırken denetlenir; parolayla girişteki gibi.
- **Kayıtlı parola**: Hesapta olmalı. İçe aktarılan bazı hesapların parolası yok: bilet harcanır ve giriş formu sebebini gösterir.

Alan tabloları, hata kodları ve yanıt şekilleri `clients` uç referansındadır.

## Örnek

Bilet üret ve yönlendir cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.example.com/api/v1/admin/clients/sso' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"client_id":64,"destination":"services","destination_values":[128]}'
```

```javascript
const res = await fetch('https://panel.example.com/api/v1/admin/clients/sso', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    client_id: 64,
    destination: 'services',
    destination_values: [128],
  }),
});

const body = await res.json();

// Yonlendirmeyi anahtari tutan sunucudan yapin, ziyaretcinin tarayicisindan degil:
// bilet bir kimlik bilgisidir, guvenilmeyen koddan gecmemelidir.
res.ok && console.log(body.data.url);
```

```php
<?php

$ch = curl_init('https://panel.example.com/api/v1/admin/clients/sso');

curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode(['client_id' => 64]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);

// Ziyaretciyi hemen gonderin; bilet 60 saniye sonra gecersiz olur.
header('Location: ' . $body['data']['url']);
exit;
```

```php
$response = Api::Clients()->CreateClientSsoToken([
    'client_id'   => 64,
    'destination' => 'services',
    'destination_values' => [128],
]);

// Anahtar yok, HTTP turu yok — ayni kaynak, surec icinde cagrilir.
Utility::redirect($response['data']['url']);
```

## Tuzaklar

> **Bilet bir kimlik bilgisidir.** Adresi açan kişi o müşteri olur. Kayda geçirmeyin, e-postayla göndermeyin, üçüncü kişinin okuyabileceği bir sayfaya koymayın.

> **Önceden bilet üretmeyin.** Bilet 60 saniye yaşar ve müşteri aynı anda bir tane taşır; toplu üretim elinizde tek çalışan bilet bırakır.

> **Doğrulama kimseyi içeri almaz.** Yalnız parolanın eşleşip eşleşmediğini söyler. Oturum istiyorsanız ardından bilet üretin.

## İlgili Makaleler

- [Müşteri Uçları](https://dev.wisecp.com/tr/musteri-uclari)
- [Müşteri Güvenlik Uçları](https://dev.wisecp.com/tr/musteri-guvenligi)
