# Giriş ve Kayıt

https://dev.wisecp.com/tr/giris-ve-kayit

Altı view, tek bölünmüş layout, tek adım makinesi. Kimlik ekranı bir kez kurulur, sonra tarayıcıda yeniden dizilir.

## Genel Bakış

Giriş sayfası yedi durumu barındıran tek bir belgedir. Hiçbir şey yeniden yüklenmez; her metin, her alan ve her onay sunucunun ürettiği işaretlemede bulunmalıdır.

Kayıt tam tersi bir sorundur. Alanların neredeyse hepsi isteğe bağlıdır, yani form sabit bir yerleşim değil koşullar kümesidir.

## Yapı

Altısı da sign controller'ındaki tek bir özel yardımcıdan geçer. Aynı kapıyı, canonical bağlantıyı ve başlık konvansiyonunu paylaşırlar.

| View | Yalnız misafir | Notlar |
| --- | --- | --- |
| `auth/login` | Evet | Tek belgede yedi durum |
| `auth/register` | Evet, bekleyen doğrulama yoksa | Ülkeler, özel alanlar, sözleşmeler, kapı haritası |
| `auth/forget-password` | Evet | Adres olsun olmasın her zaman başarı bildirir |
| `auth/reset-password` | Evet | Jeton önce çözülür: ya form, ya süresi dolmuş bildirimi |
| `auth/activate` | Evet | E-posta onayının iniş sayfası |
| `auth/accept-invite` | Hayır | Misafir ve üye; hangi durum geçerli, state söyler |

- **stage_title, stage_text, stage_foot**: Sol kolon. Çapraz bağlantı ayakta durur, ilgili anahtarla sarılır.
- **split_class, inner_class**: Daha geniş bir form için biçim değiştiriciler; kayıt view'ı ikisini de kullanır.
- **layouts/auth.tpl**: head, scripts, body_class, content, body_end taşır, artı yukarıdaki beşi.

## Adım Adım

### Giriş Adım Makinesini Kurun

1. Her durumu aynı belgeye yazın: biri görünür, gerisi gizli. Her biri bir adım özniteliği taşır: `login`, `password`, `totp`, `sms`, `email`, `code-login`, `restricted`.
2. Makineyi giriş anahtarına kapılayın, diğer dalda bir bildirim gösterin.
3. Parolasız harekete geçirici mesajı sosyal butonlardan önce, her biri kendi anahtarı ve ayracıyla koyun.
4. Dört kod durumunda tek bir paylaşılan bileşen kullanın. Bileşen duruma değil input sınıfına bağlanır; ikincisi yapıştırma ve otomatik doğrulama almaz.

### Kayıt Alanlarını Kapılayın

1. Görünürlüğü yapılandırma anahtarından değil kapı haritasından okuyun.
2. Zorunlu alanları yerleşik özniteliğin yanında bir data özniteliğiyle işaretleyin ki doğrulayıcı gizli olanı atlasın.
3. Özel alanları ve sözleşmeleri verilen dizilerden yazın; sabit kümeleri yoktur.
4. Yetkili sunucudur — tarayıcıdaki her denetim gönderimde tekrarlanır.

### Formunuzun Asgari Olup Olmadığına Karar Verin

1. Manifest işaretini **yalnız** kayıt view'ınız telefon, sabit hat ve kimlik numarasını hiç yazmıyorsa true yapın.
2. Görünürlük anahtarlarının arkasında yazıyorsanız false bırakın; üç temanın ikisi bunu yapar.
3. İşaret istekten değil manifestten okunur; bir gönderim onu iddia edemez.

### Her Kimlik Bağlantısını Anahtarıyla Sarın

1. Kaydol bağlantısını kayıt, giriş bağlantısını giriş anahtarıyla sarın; hesap menüsü ve sepet birleşik anahtarı kullanır.
2. Gizlemeye güvenmeyin — sunucu kapalı kaydı ve girişi kendi reddeder.

## Referans

### Auth Çekirdek İmzaları

```php
// Üye oluşturmanın tek giriş noktası. Girdi anahtarları aşağıda.
public static function register(array $input): array;

// Parolayla giriş. $type 'member' ya da 'admin'; üye ana anahtarı burada denetlenir.
public static function attemptLogin(string $type, string $email, string $password, bool $remember = false): array;

// Parolalı ya da parolasız, oturumun kurulduğu TEK yer. Her parolasız akış
// (kod girişi, sosyal, kayıt sonrası, e-posta doğrulaması) burada biter.
public static function completeLogin(string $type, int $userId, object $user, bool $remember = false, array $sso = []): string;

// Parolasız: tek kullanımlık kod üret, sonra onu oturumla takas et.
// issueLoginCode adres var olsun olmasın başarı bildirir.
public static function jetpassEnabled(): bool;
public static function issueLoginCode(string $email): array;
public static function jetpassLogin(string $email, string $code, bool $remember = false): array;

// Parola sıfırlama. issueReset de hesap sızdırmaz.
public static function issueReset(string $type, string $email): array;
public static function verifyResetToken(string $rawKey, string $type): object|false;
public static function resetPassword(string $type, int $userId, string $password): void;

// Verilen mod ve kitle için sunulacak sağlayıcılar.
public static function activeProviders(string $mode, string $context): array;
```

### register() Neyi Kabul Eder

```php
$input = [
    // Kimlik
    'first_name'     => 'Ada',
    'last_name'      => 'Lovelace',
    'email'          => 'ada@example.com',
    'password'       => 'metin filtresiyle değil, geçirgen filtreyle okunur',

    // Hesap türü ve açtığı kurumsal alanlar
    'account_type'   => 'individual',   // ya da 'corporate'
    'company_name'   => '',
    'tax_number'     => '',
    'tax_office'     => '',

    // Her biri kendi görünürlük anahtarının arkasındaki isteğe bağlı iletişim alanları
    'phone'          => '',
    'landline_phone' => '',
    'national_id'    => '',

    // Fatura adresi
    'address1'       => '',
    'state'          => '',             // listeden seçildiyse id, değilse serbest metin
    'city'           => '',             // state ile aynı kural
    'postal_code'    => '',
    'country'        => 0,              // buraya gelmeden önce id'ye çözülür

    // Onaylar
    'marketing_email'    => 0,
    'marketing_sms'      => 0,
    'contract'           => 1,          // şartlar kutucuğu
    'contracts_required' => true,       // gerçekten yapılandırılmış bir sözleşme var mı

    // Operatör tanımlı ek alanlar, operation toplar
    'custom_fields'      => [],

    // İstekten değil TEMA MANİFESTİNDEN bildirilir. True; telefon, sabit hat ve
    // kimlik numarasının zorunluluk denetimlerini atlar, başka hiçbir şeyi değil.
    'minimal_fields'     => false,
];
```

### Alan Kapı Haritası

| Şablon değişkeni | Varsayılan | Neyi denetler |
| --- | --- | --- |
| `$registration.account_type_visible` | açık | Bireysel/kurumsal seçicisi |
| `$registration.company_name_required` | açık | Kurumsal dalda şirket adı |
| `$registration.tax_number_required`, `tax_office_required` | kapalı | Kurumsal vergi alanları |
| `$registration.phone_visible`, `phone_required` | açık, açık | Cep telefonu |
| `$registration.landline_visible`, `landline_required` | kapalı, kapalı | Sabit hat numarası |
| `$registration.national_id_visible`, `national_id_required` | kapalı, kapalı | Bireysel dalda kimlik numarası |
| `$registration.password_min_length` | 12 | İki tarafta da uygulanır |

### Her View'a Ne Ulaşır

| View | Değişken | Taşıdığı |
| --- | --- | --- |
| `auth/register` | `$countries` | `id`, `a2_iso`, `name`. İl ve ilçeler AJAX ile kademelenir |
| `auth/register` | `$custom_fields` | Operatörün ek alanları; sabit kümesi yok |
| `auth/register` | `$contracts` | Kayıt için işaretlenmiş sözleşmeler; her satır bir `link` taşır |
| `auth/register` | `$contract_names` | Başlıkların virgülle birleşmiş hâli; etiket adlarını yazsın diye |
| `auth/register` | `$registration` | Yukarıdaki kapı haritası |
| `auth/register` | `$verify_email`, `$verify_name` | `$verify_pending` true olduğunda dolar; adım üyeye adıyla hitap eder |
| `auth/reset-password` | `$reset_valid` | Token çözüldü mü; false ise süresi dolmuş uyarısı |
| `auth/reset-password` | `$verify_key` | Ham token; yeni parolayla geri gönderilir |
| `auth/login` | `$social_providers`, `$jetpass_enabled` | Giriş sayfası kurar; kayıt sayfası kendi listesini kurar |

### Sayfa ve Özellik Anahtarları

- **$registration_enabled**: Bağımsız kaydol bağlantısı gösterilir mi: ana anahtardan önce-satın-al modu düşülmüş hâli. Sepette kayıt mümkünken bu kapalı olabilir.
- **$login_enabled**: Üye girişi ana anahtarı; yönetici girişi ayrıdır.
- **$account_actions_enabled**: Hesabın hiç mümkün olup olmadığı: kayıt *ana* anahtarından kurulur, bağlantı anahtarından değil.
- **$jetpass_enabled**: Parolasız kod akışı, varsayılan kapalı. Mesajını bununla kapılayın.
- **$social_providers**: Bu sayfadaki sağlayıcılar; boş liste ne ayraç ne buton demektir.
- **$verify_pending**: Giriş yapmış üyenin adresi doğrulanmamışsa kurulur; kayıt view'ı doğrulama adımını gösterir.

## Örnek

```smarty
{extends file='layouts/auth.tpl'}

{block name=stage_title}{lang key='auth_stage_login_title'}{/block}
{block name=stage_text}{lang key='auth_stage_login_text'}{/block}

{* Çapraz bağlantı kapılıdır: kapalı bir sistemde kaydol önermek çıkmazdır. *}
{block name=stage_foot}
  {if $registration_enabled}
    {lang key='auth_stage_login_foot'} <a href="{link route='sign-up'}">{lang key='auth_stage_login_foot_link'}</a>
  {/if}
{/block}

{block name=content}
{if $login_enabled}

  {* 1. durum: e-posta. Görünür; diğer her durum AYNI belgede gizli gelir. *}
  <div data-auth-step="login">
    <form data-auth-form="login">
      {csrf form='sign-in'}
      <input type="email" name="email" class="form-control" required>
      {captcha area='sign-in' tray='login-captcha'}
      <button type="submit" class="btn">{lang key='website/sign/continue'}</button>
    </form>

    {* Parolasız SOSYALDEN ÖNCE, her biri kendi anahtarı ve ayracıyla. *}
    {if $jetpass_enabled}
      <div class="auth-divider">{lang key='website/sign/or'}</div>
      <button type="button" class="btn" data-auth-action="auth-code-login">{lang key='website/sign/jetpass-cta'}</button>
    {/if}
    {if $social_providers}
      <div class="auth-divider">{lang key='website/sign/or'}</div>
      {foreach $social_providers as $p}
        <a class="btn" href="{$p.url}"><i class="bi {$p.icon}"></i>{$p.label}</a>
      {/foreach}
    {/if}
  </div>

  <div class="d-none" data-auth-step="password">{* ... *}</div>

  {* Dört kod durumu TEK bileşeni yeniden kullanır: script duruma değil
     .otp-input'a bağlanır, yani ikinci bir uygulama davranışın hiçbirini almaz. *}
  <div class="d-none" data-auth-step="code-login">
    <div class="otp-group" data-otp>
      <input class="otp-input" inputmode="numeric" maxlength="1">
    </div>
  </div>

  <div class="d-none" data-auth-step="restricted">{* ... *}</div>

{else}
  <p>{lang key='website/sign/login-disabled'}</p>
{/if}
{/block}
```

```php
// templates/website/{Tema}/theme.php

return [
    'meta' => [
        'name'    => 'Acme',
        'version' => '1.0.0',
        'author'  => 'Acme',

        // Yalnız kayıt view'ı telefon, sabit hat ve kimlik numarasının HİÇBİRİNİ
        // render etmiyorsa TRUE. Auth::register o zaman tam bu üç alan için
        // operatörün zorunluluk denetimlerini atlar; diğer her doğrulama koşar.
        //
        // Onları $registration.*_visible arkasında render ediyorsanız FALSE;
        // ürünle gelen üç temanın ikisi bunu yapar.
        //
        // Alanları basmaya devam ederken true koymak tek yanlış cevaptır:
        // ziyaretçi boş bir input görmüş olsa da zorunluluk atlanır.
        'signup_minimal' => false,
    ],
    'engine' => 'smarty',
    'status' => 'ready',
];
```

## Tuzaklar

> **Bir hesabın var olduğunu asla açık etmeyin**
> 
> Parola sıfırlama ve parolasız kod, bilinmeyen bir adres için bilerek başarı bildirir. Script'iniz her durumda bir sonraki ekrana geçmelidir.

> **Parola geçirgen filtreyle okunur**
> 
> Her metin filtresi parolayı güçlü kılan karakterleri siler. Saklanan değer, hiçbir hata olmadan yazılandan farklı olur.

> **Asgari bayrağı işaretlemeniz hakkında bir iddiadır**
> 
> Manifestinizden okunur ve ona güvenilir, yani formunuzun gerçekte ne yazdığını anlatmalıdır. İsteğe bağlı alanları yazarken bildirmek boş bir gönderimi raporsuz geçirir.

> **Her kimlik formunda jeton ve captcha alanı bulunur**
> 
> Tek bir eylem adı aynı anda jeton form anahtarı, captcha alanı ve hız sınırı kovasıdır. Yeni bir ad uydurmak üç korumadan da çıkmaktır. Parolasız istek ile doğrulaması giriş eylemini bilerek paylaşır.

> **Kapalı bir giriş yine de yeni kaydı içeri alır**
> 
> Kayıt sonrası oturum açma, anahtarın denetlendiği parola yolundan değil doğrudan oturum kuran metottan geçer.

## İlgili Makaleler

- [Sayfa Ekranları](https://dev.wisecp.com/tr/sayfa-yuzeyleri)
- [Müşteri Paneli](https://dev.wisecp.com/tr/musteri-paneli)
- [Tema Formlarını Güvenceye Alma](https://dev.wisecp.com/tr/tema-formlarini-guvenli-hale-getirme)
- [Sosyal Giriş Sağlayıcısı Yazma](https://dev.wisecp.com/tr/sosyal-giris-saglayicisi-yazma)
- [Captcha Modülü Yazma](https://dev.wisecp.com/tr/captcha-modulu-yazma)
