Giriş ve Kayıt

1.5k görüntülenme Markdown

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.

ViewYalnız misafirNotlar
auth/loginEvetTek belgede yedi durum
auth/registerEvet, bekleyen doğrulama yoksaÜlkeler, özel alanlar, sözleşmeler, kapı haritası
auth/forget-passwordEvetAdres olsun olmasın her zaman başarı bildirir
auth/reset-passwordEvetJeton önce çözülür: ya form, ya süresi dolmuş bildirimi
auth/activateEvetE-posta onayının iniş sayfası
auth/accept-inviteHayırMisafir 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ı

tam imzalar
// Ü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

$input dizisi, anahtar anahtar
$input = [
    // Kimlik
    'first_name'     => 'Ada',
    'last_name'      => 'Lovelace',
    'email'          => '[email protected]',
    '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şkeniVarsayılanNeyi denetler
$registration.account_type_visibleaçıkBireysel/kurumsal seçicisi
$registration.company_name_requiredaçıkKurumsal dalda şirket adı
$registration.tax_number_required, tax_office_requiredkapalıKurumsal vergi alanları
$registration.phone_visible, phone_requiredaçık, açıkCep telefonu
$registration.landline_visible, landline_requiredkapalı, kapalıSabit hat numarası
$registration.national_id_visible, national_id_requiredkapalı, kapalıBireysel dalda kimlik numarası
$registration.password_min_length12İki tarafta da uygulanır

Her View'a Ne Ulaşır

ViewDeğişkenTaşıdığı
auth/register$countriesid, a2_iso, name. İl ve ilçeler AJAX ile kademelenir
auth/register$custom_fieldsOperatörün ek alanları; sabit kümesi yok
auth/register$contractsKayıt için işaretlenmiş sözleşmeler; her satır bir link taşır
auth/register$contract_namesBaşlıkların virgülle birleşmiş hâli; etiket adlarını yazsın diye
auth/register$registrationYukarı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_validToken çözüldü mü; false ise süresi dolmuş uyarısı
auth/reset-password$verify_keyHam token; yeni parolayla geri gönderilir
auth/login$social_providers, $jetpass_enabledGiriş 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

views/auth/login.tpl
{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}
manifest bayrağı ve onu koyma kuralı
// 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.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.