NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Auth for Laravel

Aktivita a riziko

Obmedzovanie pokusov

Desať limitov, overených ešte pred prácou s prihlasovacími údajmi. Identifikátory sa ukladajú ako HMAC, takže žiadny e-mail sa nedostane do kľúča cache. Prekročenie vráti too_many_attempts (429, Retry-After), zaznamená pokus a spustí LoginThrottled:

'throttle' => [                          // max attempts / decay seconds
    'login' => ['max' => 5, 'decay' => 60],                 // identifier + IP
    'login_ip' => ['max' => 50, 'decay' => 600],            // IP, any identifier
    'login_account' => ['max' => 20, 'decay' => 3_600],     // identifier, any IP
    'email_request' => ['max' => 3, 'decay' => 600],        // link/OTP/reset/resend per identifier+IP
    'email_request_ip' => ['max' => 20, 'decay' => 600],
    'email_request_account' => ['max' => 10, 'decay' => 3_600],
    'refresh' => ['max' => 30, 'decay' => 60],              // per IP
    'registration' => ['max' => 5, 'decay' => 3_600],       // per IP
    'verification' => ['max' => 5, 'decay' => 600],         // verify attempts per identifier+IP
    'reauthentication' => ['max' => 5, 'decay' => 300],     // per session
],

'lockout' => [
    'enabled' => false,
    'threshold' => 10,
    'duration' => 900,
    'reset_unlocks' => true,
],

Uzamknutie (voliteľné)

Predvolene vypnuté: obmedzovanie pokusov odoláva DoS útokom, kým tvrdý zámok umožní útočníkovi zamknúť obeť. Po zapnutí sa pri dosiahnutí threshold nastaví locked_until na duration sekúnd, spustí sa AccountLocked a vlastník dostane e-mail. Uzamknutý identifikátor dostane too_many_attempts (nikdy account_locked — to by potvrdilo heslo), zámok nikdy neruší existujúce relácie a reset_unlocks ho zruší pri obnove hesla.

Prihlasovacia aktivita

Jeden záznam na pokus: guard, typ, výsledok, metóda, dôvod, účet, identifikátor (v otvorenej podobe, ako hash alebo vôbec), IP, user agent, odtlačok zariadenia, id relácie a príznak nového zariadenia. Obnova tokenu sa zaznamená len pri neúspechu. GET activity vráti vlastné záznamy účtu bez identifikátora a odtlačku:

use RoundlyConsulting\Auth\Enums\ActivityOutcome;
use RoundlyConsulting\Auth\Events\LoginActivityRecorded;
use RoundlyConsulting\Auth\Facades\Authentication;
use RoundlyConsulting\Auth\Support\Models;

Authentication::guard('users')->activity($user, 20);   // paginated, newest first

LoginActivity::query()->where('outcome', ActivityOutcome::Throttled->value)->count();

// Enrich rows with a location from your own lookup
Event::listen(function (LoginActivityRecorded $event): void {
    $activity = Models::loginActivities()->find($event->activityId);
    [$country, $city] = GeoIp::lookup($activity->ip_address);   // your own lookup
    $activity->enrich($country, $city);
});

Nové zariadenia

Odtlačok je HMAC guardu a hlavičky X-Device-Id, alebo user agenta, ak hlavička chýba. Zariadenie je známe len po dokončenom prihlásení s týmto odtlačkom v rámci doby uchovávania — nepočíta sa odkaz na obnovu či prihlásenie vyžiadaný z daného zariadenia ani opätovné overenie (možno ukradnutým) prístupovým tokenom. Úplne prvé prihlásenie sa za nové nepovažuje (skip_first_login). Nové zariadenie spustí NewDeviceDetected a po dokončení prihlásenia pošle vlastníkovi e-mail.

Riziko

Pripojte vlastný assessor. Po prvom faktore dostane guard, účet, metódu, kontext relácie a príznak nového zariadenia a vráti úroveň (low, elevated, high) so signálmi:

use RoundlyConsulting\Auth\Contracts\AssessesLoginRisk;
use RoundlyConsulting\Auth\DataTransferObjects\LoginRiskContext;
use RoundlyConsulting\Auth\DataTransferObjects\RiskAssessment;
use RoundlyConsulting\Auth\Enums\RiskLevel;

final class NewDeviceRisk implements AssessesLoginRisk
{
    public function assess(LoginRiskContext $context): RiskAssessment
    {
        return $context->newDevice
            ? new RiskAssessment(RiskLevel::Elevated, ['new_device'])
            : new RiskAssessment();
    }
}
'activity' => [
    'enabled' => true,
    'store_identifier' => 'plain',       // plain|hash|none
    'retention_days' => 90,
    'new_device' => [
        'enabled' => true,
        'header' => 'X-Device-Id',
        'skip_first_login' => true,
    ],
],

'risk' => [
    'assessor' => NewDeviceRisk::class,  // class-string<AssessesLoginRisk>|null
    'reactions' => ['elevated' => 'notify', 'high' => 'require_second_factor'],  // allow|notify|require_second_factor|deny
    'deny_response' => 'uniform',        // uniform|explicit
],

Reakcie podľa úrovne: allow; notify (udalosť a e-mail po dokončení); require_second_factor (overovací krok sa pridá pri každom spôsobe prihlásenia — aj pri e-mailových s vypnutým after_email_login — a ak účet nemá faktor na dodatočné overenie, prihlásenie sa zamietne); deny (SuspiciousLoginDetected, e-mail vlastníkovi, jednotné invalid_credentials — alebo login_denied pri deny_response = explicit).

Čistenie

authentication:prune natrvalo zmaže výzvy a jednorazové tokeny deň po expirácii a ukončené pozvánky aj aktivitu po uplynutí doby uchovávania guardu. Všetky štyri modely sú zároveň Prunable, takže funguje aj model:prune:

// routes/console.php
Schedule::command('authentication:prune')->daily();

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.