# Hesap Güvenliği Kancaları

https://dev.wisecp.com/tr/hesap-guvenligi-kancalari

Doğrulama, parola sıfırlama, çıkış ve erişimin on bir kancası.

## Genel Bakış

Hesabın kimliğini koruyan her adım burada: e-posta ve telefon doğrulama, güvenlik sorusu, parola sıfırlama, giriş kodu ve çıkış.

İki kapı öne çıkar. Parola kapısı size **ham parolayı** verir; yalnız denetleyin. Erişim kapısı ise diğerlerinin tersi çalışır: dolu dönmek yerleşik denetimleri **atlar**.

## Referans

### E-posta değişimini izleme

actionuser.email_changed

`AccountUsers` doğrulanmış adres

Hesabın e-posta adresi değiştikten sonra çalışır. Yeni adres **doğrulanmıştır**.

Parametreler 3

$uidintHesabın sahibi.

$oldEmailstringÖnceki adres.

$newEmailstringYeni, doğrulanmış adres.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:user.email_changed', 10, function ($uid, $oldEmail, $newEmail) {
    // Eski adrese de haber verin: hesap ele gecirildiyse tek uyari yolu odur.
    Acme::alertOldAddress($oldEmail, $newEmail);
});
```

### E-posta doğrulamasını izleme

actionuser.email_verified

`AccountUsers` doğrulama anı

Müşteri e-posta adresini doğruladıktan sonra çalışır.

Parametreler 1

$user_idintAdresi doğrulanan müşteri.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:user.email_verified', 10, function ($user_id) {
    Acme::unlockOnboarding($user_id);
});
```

### Telefon doğrulamasını izleme

actionuser.phone_verified

`AccountUsers` uluslararası biçim

Müşteri telefon numarasını doğruladıktan sonra çalışır.

Parametreler 2

$uidintNumarası doğrulanan müşteri.

$phonestringDoğrulanan numara, **uluslararası biçimde** saklandığı hâliyle. Ülke kodu başındadır; yerel biçim beklemeyin.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:user.phone_verified', 10, function ($uid, $phone) {
    // Numara uluslararasi bicimdedir.
    Acme::enableSmsAlerts($uid, $phone);
});
```

### Güvenlik sorusunun değişmesini izleme

actionuser.security_question_changed

`AccountUsers` daima giriş kimliği

Hesabın güvenlik sorusu kurulduğunda ya da kaldırıldığında çalışır.

Parametreler 2

$user_idintSorusu değişen üye. Bu **her zaman oturumu açan kişidir**: alt kullanıcı başkasının sorusunu değiştiremez.

$has_questionboolDoğruysa soru artık kuruludur; yanlışsa **soru ve cevabı birlikte** kaldırılmıştır.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:user.security_question_changed', 10, function ($user_id, $has_question) {
    // Kaldirma da bu kancadan gecer.
    if (!$has_question) Acme::warnWeakerRecovery($user_id);
});
```

### Parola sıfırlama talebini izleme

actionuser.password_reset_requested

`Auth` iki hesap tipi

Bir parola sıfırlama talebi açıldığında çalışır. Hem müşteri hem yönetici hesapları buradan geçer.

Parametreler 3

$userIdintTalebin açıldığı hesap.

$typestringHesap tipi: `member` ya da `admin`. Yönetici sıfırlamaları çok daha kritiktir; ayrımı gözetin.

$emailstringTalebin yapıldığı adres; hesapla eşleştiği doğrulanmıştır.

Dönüş 1

voidDönüş yoksayılır. Dinleyicinizin dönüşü sıfırlama yanıtını **değiştiremez**.

Dinleyici PHP

```php
Hook::add('action:user.password_reset_requested', 10, function ($userId, $type, $email) {
    // Yonetici sifirlamasi cok daha kritik.
    if ($type === 'admin') Acme::alertSecurityTeam($userId, $email);
});
```

### Çıkışı izleme

actionuser.logged_out

`Auth` oturum verisi önceden

Bir oturum kapandığında çalışır.

Parametreler 2

$dataarrayÇıkan kişinin oturum verisi, **çıkıştan önce yakalanmış** hâliyle. Oturum zaten yoksa **boş gelir**: kimliğe erişmeden önce bakın.

$typestringÇıkış tipi: `admin` ya da `member`.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:user.logged_out', 10, function ($data, $type) {
    // Oturum yoksa dizi BOS gelir.
    if (!($data['id'] ?? 0)) return;

    Acme::closeSession((int) $data['id'], $type);
});
```

### Giriş kodunun gönderilmesini izleme

actionuser.login_code_issued

`Auth` kod geçilmez

Tek kullanımlık giriş kodu gönderildiğinde çalışır.

Parametreler 3

$userIdintKodun gönderildiği hesap: bir müşteri ya da yönetim paneline giriş yapan bir personel.

$channelstringTeslim kanalı.

$expiryintKodun geçerlilik bitişi. Kodun **kendisi geçilmez**, bilerek: dinleyiciye verilmesi onu ikinci bir yere yayardı.

Dönüş 1

voidDönüş yoksayılır; yanıtı değiştiremez.

Dinleyici PHP

```php
Hook::add('action:user.login_code_issued', 10, function ($userId, $channel, $expiry) {
    // Kodun kendisi bilerek gecilmez.
    Acme::noteLoginAttempt($userId, $channel);
});
```

### Cihaza güvenilmesini izleme

actionuser.device_trusted

`Auth` güven jetonu geçilmez

Hesap, iki adımlı doğrulama ekranında "bu cihaza güven" kutusunu işaretleyip tarayıcı hatırlandığında çalışır.

Parametreler 4

$userIdintCihazın artık ait olduğu hesap.

$typestringHesap tipi: `member` veya `admin`.

$windowintGüvenin kaç gün süreceği.

$uastringTarayıcının ham User-Agent dizesi. Güven jetonu **geçilmez**: dinleyiciye vermek onu ikinci bir yere yaymak olurdu.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:user.device_trusted', 10, function ($userId, $type, $window, $ua) {
    Acme::securityLog('device_trusted', $userId, ['type' => $type, 'days' => $window]);
});
```

### Cihaz güveninin kaldırılmasını izleme

actionuser.device_trust_revoked

`Auth` kayıtlar çoktan silinmiştir

Hesabın güvenilir cihazları kaldırıldığında çalışır: parola sıfırlama, iki adımlı doğrulamanın açılıp kapanması, kurtarma koduyla giriş, "her yerden çıkış" veya hesabın kendi listesinden kaldırma.

Parametreler 3

$userIdintGüveni kaldırılan hesap.

$typestringHesap tipi: `member` veya `admin`. Tip verilmeden yapılan toplu temizlikte **boş gelir** — bütün tipler gitmiştir.

$countintKaç cihazın kaldırıldığı; tekil kaldırma her zaman `1` geçirir.

Dönüş 1

voidDönüş yoksayılır; kanca çalıştığında kayıtlar zaten silinmiştir.

Dinleyici PHP

```php
Hook::add('action:user.device_trust_revoked', 10, function ($userId, $type, $count) {
    Acme::securityLog('trust_revoked', $userId, ['count' => $count]);
});
```

### Parola sıfırlamayı durdurma

gateuser.password_reset

`AdminUsers` ham parola

Bir yönetici parolası sıfırlanmadan önce çalışır. Kendi parola politikanızı burada dayatırsınız.

Parametreler 3

$user_idintParolası sıfırlanan hesap.

$passwordstringYeni parolanın **ham hâli**. 🔴 Yalnız politika denetimi için: günlüğe yazmayın, kaydetmeyin, dışarı göndermeyin.

$bystringSıfırlamanın kaynağı.

Dönüş 1

mixed**Dolu bir dönüş engeller**: metin ya da ileti taşıyan bir dizi kabul edilir. Boş dönüş devam ettirir.

Dinleyici PHP

```php
Hook::add('gate:user.password_reset', 10, function ($user_id, $password, $by) {
    // Ham parola: yalniz denetleyin, hicbir yere YAZMAYIN.
    if (strlen($password) < 16) return 'Yonetici parolasi en az 16 karakter olmali.';

    return null;
});
```

### Müşteriyi kendi ekranınıza yönlendirme

gateuser.full_access

`website` yönlendirme döndürür

Müşteri panele girdiğinde, yerleşik erişim denetimlerinden **önce** çalışır: eksik alan, kişisel veri onayı ve fatura bilgisi kontrollerinin öncesindedir.

Parametreler 1

$idintGiriş yapan müşteri.

Dönüş 1

string|null🔴 Diğer kapıların tersi çalışır: **dolu bir adres döndürmek** müşteriyi oraya yönlendirir ve **yerleşik denetimlerin tamamını atlar**. Yani buradan koşulsuz bir adres döndürmek, eksik alan ve onay kontrollerini kalıcı olarak devre dışı bırakır. Koşulunuzu dar tutun ve kalan durumda boş dönün.

Dinleyici PHP

```php
Hook::add('gate:user.full_access', 10, function ($id) {
    // Dolu donus YERLESIK DENETIMLERI ATLAR: kosulu dar tutun.
    if (Acme::mustAcceptTerms($id)) return Utility::AppAdress() . '/acme/terms';

    return null;
});
```

## Tuzaklar

> **Erişim kapısı diğerlerinin tersi çalışır**
> 
> Öteki kapılarda dolu dönüş **engeller**; erişim kapısında dolu dönüş **yönlendirir ve yerleşik denetimlerin tamamını atlar**. Koşulsuz bir adres döndürmek, eksik alan ve rıza kontrollerini kalıcı olarak devre dışı bırakır.

> **Parola kapısına ham parola gelir**
> 
> Parola sıfırlama kapısı yeni parolayı **düz metin** verir; politika denetimi için gereklidir. Onu günlüğe yazmak, saklamak ya da dışarı göndermek, tam da korumaya çalıştığınız şeyi sızdırır.

## İlgili Makaleler

- [Müşteri Hesabı Kancaları](https://dev.wisecp.com/tr/musteri-hesabi-kancalari)
- [Fatura Yaşam Döngüsü Kancaları](https://dev.wisecp.com/tr/fatura-yasam-dongusu-kancalari)
- [Kancalar Nasıl Çalışır](https://dev.wisecp.com/tr/kancalar-nasil-calisir)
