# Kimlik Doğrulama Ayarları

https://dev.wisecp.com/tr/kimlik-dogrulama-ayarlari

Girişte şifrenin ötesinde istenen ikinci adım, konum ve adres doğrulamasını yöneten yedi uç.

## Genel Bakış

Bu yedi uç girişte **kimlik doğrulamasının ötesinde** ne isteneceğini belirler: ikinci bir adım, alışılmadık bir konumdan gelişte ek doğrulama, alışılmadık bir adresten gelişte ek doğrulama.

Üçü de **müşteri ve yönetici için ayrı** ayarlanır. Bir tarafı açmak diğerini etkilemez; ikisini birlikte istiyorsanız iki bloğu birden göndermeniz gerekir.

## Referans

### İki Adımlı Doğrulamayı Getirme

get/api/v1/admin/settings/security/two-factor

`Settings/GetTwoFactor` admin

Hangi ikinci adım yöntemlerinin açık olduğunu ve kimlerden istendiğini döndürür.

Dönen alanlar data — 4

authenticationsstring[]Açık olan yöntemlerin anahtarları.

clientintMüşterilerden ikinci adım istenip istenmediği.

adminintYöneticilerden ikinci adım istenip istenmediği.

show_popupintGirişte kurulum hatırlatmasının gösterilip gösterilmediği.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/settings/security/two-factor' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/security/two-factor', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/security/two-factor');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// Anahtarlar ancak EN AZ BIR yontem acikken is gorur; ikisini birlikte okuyun.
$tfa    = Api::Settings()->GetTwoFactor()['data'];
$live   = $tfa['admin'] === 1 && $tfa['authentications'] !== [];
```

### İki Adımlı Doğrulamayı Yazma

put/api/v1/admin/settings/security/two-factor

`Settings/UpdateTwoFactor` admin kilitlenme riski

Yöntemleri ve kimlerden isteneceğini yazar.

Gövde 4

authenticationsstring[]Açılacak yöntemlerin anahtarları. Liste bütün olarak yazılır; listede olmayan yöntem kapanır.

clientintMüşterilerden ikinci adım ister.

adminintYöneticilerden ikinci adım ister.

show_popupintGirişte kurulum hatırlatması gösterir.

Dönen alanlar data

dataobjectYazma sonrasındaki ayarlar. Okuma ucuyla aynı şekildedir.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/settings/security/two-factor' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"authentications":["Totp"],"admin":1,"show_popup":1}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/settings/security/two-factor', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    authentications: ['Totp'],
    admin: 1,
    show_popup: 1,
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/security/two-factor');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'authentications' => ['Totp'],
        'admin'           => 1,
    ]),
]);

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

```php
// Yontem listesi BUTUN yazilir: eklemek isterken tek yontem gondermek digerlerini kapatir.
$tfa     = Api::Settings()->GetTwoFactor()['data'];
$methods = $tfa['authentications'];

$methods[] = 'Totp';

Api::Settings()->UpdateTwoFactor(['authentications' => array_unique($methods)]);
```

### Yöntemleri Listeleme

get/api/v1/admin/settings/security/two-factor/methods

`Settings/GetTwoFactorMethods` admin

Kurulu ikinci adım yöntemlerini ve hangilerinin açık olduğunu döndürür.

Dönen alanlar data[] — 4

keystringYöntemin anahtarı. Yazma ucunda bu kullanılır.

namestringYöntemin adı.

descriptionstringNe yaptığı.

activeboolŞu an açık mı.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/settings/security/two-factor/methods' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/security/two-factor/methods', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/security/two-factor/methods');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// Yontem anahtarlarini BURADAN alin: uydurdugunuz anahtar sessizce yok sayilir.
$keys = array_column(Api::Settings()->GetTwoFactorMethods()['data'], 'key');
```

### Konum Doğrulamayı Getirme

get/api/v1/admin/settings/security/location-verification

`Settings/GetLocationVerification` admin iki taraf ayrı

Alışılmadık bir konumdan girişte ne yapılacağını döndürür.

Dönen alanlar data — 2

clientobject 3 alanMüşteri tarafındaki ayar.

statusintKonum doğrulamasının açık olup olmadığı.

methodstringKodu taşıyan Authentication modülü: Email ya da Sms, modül adıyla yazılır.

typestringKontrolün hassasiyeti: country ya da city.

adminobject 3 alanYönetici tarafındaki ayar.

statusintKonum doğrulamasının açık olup olmadığı.

methodstringKodu taşıyan Authentication modülü: Email ya da Sms, modül adıyla yazılır.

typestringKontrolün hassasiyeti: country ya da city.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/settings/security/location-verification' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/security/location-verification', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/security/location-verification');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// Musteri ve yonetici ayarlari BAGIMSIZDIR: birini acmak digerini etkilemez.
$loc = Api::Settings()->GetLocationVerification()['data'];
```

### Konum Doğrulamayı Yazma

put/api/v1/admin/settings/security/location-verification

`Settings/UpdateLocationVerification` admin

Konum doğrulamasını taraf bazında yazar; giriş kodunu gönderemeyecek bir yöntem reddedilir.

Gövde 2

clientobjectMüşteri tarafı ayarı: status (0 ya da 1), method (Email ya da Sms) ve type (country ya da city). 2FA yöntem listesine ve modüllere karşı yalnız status ya da method değişikliği denetlenir; type gönderildiği her seferde denetlenir.

adminobjectYönetici tarafı ayarı, aynı üç anahtarla.

Dönen alanlar data

dataobjectYazma sonrasındaki ayarlar. Okuma ucuyla aynı şekildedir: bir müşteri bloğu ve bir yönetici bloğu, ikisi birden.

Hatalar 5

delivery_channel_unavailable422Bir taraf açılıyor ya da açıkken yöntemi değişiyor, ama yöntemin kanalında modül yok: Email için mail, Sms için SMS modülü gerekir. details side, method ve channel taşır. Hiçbir şey yazılmaz.

method_unknown422Bir taraf açılıyor ya da açıkken yöntemi değişiyor, ama yöntem bilinmiyor ya da 2FA yöntem listesinde etkin değil. details side ve method taşır. Hiçbir şey yazılmaz.

method_requires_setup422Yöntem her kullanıcının kendi kurulumunu gerektiriyor (Totp), bu yüzden konum doğrulamasının kodu olamaz. details side ve method taşır. Hiçbir şey yazılmaz.

type_invalid422type ne country ne de city. details side ve type taşır. Hiçbir şey yazılmaz.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/settings/security/location-verification' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"admin":{"status":1,"method":"Email","type":"country"}}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/settings/security/location-verification', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    admin: { status: 1, method: 'Email', type: 'country' },
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/security/location-verification');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'admin' => ['status' => 1, 'method' => 'Email', 'type' => 'country'],
    ]),
]);

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

```php
// Konum cozumu KONUM MODULUNE baglidir: modul yoksa dogrulama beklendigi gibi calismaz.
// Email yontemi yapilandirilmis bir mail modulu de ister, yoksa yazim reddedilir.
$loc = Api::Settings()->GetLocalisation()['data'];

if ($loc['ip_module'] !== '') {
    Api::Settings()->UpdateLocationVerification([
        'client' => ['status' => 1, 'method' => 'Email'],
    ]);
}
```

### Adres Doğrulamayı Getirme

get/api/v1/admin/settings/security/ip-verification

`Settings/GetIpVerification` admin iki taraf ayrı

Alışılmadık bir adresten girişte ne yapılacağını döndürür.

Dönen alanlar data — 2

clientobject 2 alanMüşteri tarafındaki ayar.

statusintAdres doğrulamasının açık olup olmadığı.

whiteliststringDoğrulamadan muaf adresler.

adminobject 2 alanYönetici tarafındaki ayar.

statusintAdres doğrulamasının açık olup olmadığı.

whiteliststringDoğrulamadan muaf adresler.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/settings/security/ip-verification' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/security/ip-verification', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/security/ip-verification');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
$ip = Api::Settings()->GetIpVerification()['data'];
```

### Adres Doğrulamayı Yazma

put/api/v1/admin/settings/security/ip-verification

`Settings/UpdateIpVerification` admin kilitlenme riski

Adres doğrulamasını taraf bazında yazar.

Gövde 2

clientobjectMüşteri tarafı ayarı: durum ve muaf adresler.

adminobjectYönetici tarafı ayarı: durum ve muaf adresler.

Dönen alanlar data

dataobjectYazma sonrasındaki ayarlar. Okuma ucuyla aynı şekildedir: bir müşteri bloğu ve bir yönetici bloğu, ikisi birden.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/settings/security/ip-verification' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"admin":{"status":1,"whitelist":"203.0.113.0/24"}}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/settings/security/ip-verification', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    admin: { status: 1, whitelist: '203.0.113.0/24' },
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/security/ip-verification');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'admin' => ['status' => 1, 'whitelist' => '203.0.113.0/24'],
    ]),
]);

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

```php
// Muaf adres listesi gonderdiginizle DEGISIR: once okuyup uzerine ekleyin.
$ip = Api::Settings()->GetIpVerification()['data'];

Api::Settings()->UpdateIpVerification([
    'admin' => [
        'status'    => 1,
        'whitelist' => $ip['admin']['whitelist'] . "\n" . $myAddress,
    ],
]);
```

## Tuzaklar

> **Anahtar yöntemsiz iş görmez**
> 
> Müşteri ve yönetici anahtarları yalnız **en az bir yöntem açıkken** etki eder. Yöntem listesi boşken yöneticide ikinci adımı açmak hiçbir şey değiştirmez, ama ayar açık göründüğü için korunduğunuzu sanırsınız. İkisini birlikte okuyun.

> **Yöntem listesi bütün yazılır**
> 
> Gönderdiğiniz yöntem listesi eskisinin **yerine geçer**: eklemek isterken tek bir yöntem göndermek diğerlerini kapatır. Kullanıcıların o yöntemlerle kurduğu ikinci adım bir anda geçersizleşir. Önce mevcut listeyi okuyup üzerine ekleyin.

> **Konum doğrulaması bir modüle bağlıdır**
> 
> Bir girişin nereden geldiğini çözmek konum modülünün işidir. Modül kurulu değilse ya da sorgusu başarısız olursa doğrulama beklediğiniz gibi çalışmaz. Bu ayarı açmadan önce yerelleştirme ayarlarındaki konum modülünün seçili olduğunu doğrulayın.

> **Adres doğrulaması sizi de kapsar**
> 
> Yönetici tarafında adres doğrulamasını açmak **sizi de** kapsar. Değişken adresli bir bağlantıdan çalışıyorsanız her girişte ek doğrulama istenir; muaf listeye kendi adresinizi eklemeyi unutursanız kendinizi zor duruma sokabilirsiniz. Muaf liste de gönderdiğiniz değerle değişir, birleştirilmez.

> **Yöntem anahtarları uydurulmaz**
> 
> Açılacak yöntemler kurulu modüllerin anahtarlarıyla yazılır ve bu anahtarlar yöntem listeleme ucundan gelir. Tanınmayan bir anahtar **sessizce yok sayılır**: istek başarılı görünür ama yöntem açılmaz. Yazdıktan sonra okuma ucundan doğrulayın.

## İlgili Makaleler

- [Güvenlik Ayarları](https://dev.wisecp.com/tr/guvenlik-ayarlari)
- [Yerelleştirme ve Adresler](https://dev.wisecp.com/tr/yerellestirme-ve-adresler)
- [Müşteri Kayıt Ayarları](https://dev.wisecp.com/tr/musteri-kayit-ayarlari)
