Link Search Menu Expand Document

Autentikaatio

Pike sisältää autentikaatiomoduulin, jolla on yksi julkinen luokka - Pike\Auth\Authenticator. Autentikaattori käyttää oletuksena tietokantaa pitkäaikaisen, ja php-natiivia sessiota lyhytaikaisen tiedon tallennukseen.

Pike\Auth\Authenticator olettaa, että sille annettu data on semanttisesti validia. Esim. 'ei-email' tai tyhjä merkkijono on sen mielestä ihan yhtä validi kuin 'validi@email.com' tai 'Kryptograafisest1 vahva salasana (€&#'. Muista siis validoida sille annetut arvot esim. \Pike\Validation-luokkaa käyttäen.

use \Pike\Auth\Authenticator;
final class MyCtrl {
    public function __construct(Authenticator $auth) {
        $this->auth = $auth;
    }
    // tai..
    public function myMethod(Authenticator $auth): void {
        // tee jotain $auth:llä
    }
}

Sisällysluettelo

  1. Arkkitehtuuri
  2. Käyttäjän kirjaaminen sisään
  3. Käyttäjän kirjautumistietojen haku
  4. Käyttäjän kirjaaminen ulos
  5. Käyttäjän luominen (1. vaihe)
  6. Käyttäjän luominen (2. vaihe)
  7. Käyttäjän salasanan palautus (1. vaihe)
  8. Käyttäjän salasanan palautus (2. vaihe)

Arkkitehtuuri

Pike\Auth\Authenticatorin oletuksena käyttämät tallennusmekanismit (UserRepository, NativeSession, CookieStorage) voi korvata konstruktoriin passattavilla factory-funktiolla (ks. Authenticator->__construct()). Myös Pike\Auth\AccountManagerin käyttämä PhpMailerMailer voidaan korvata (ks. Authenticator->getAccountManager()). Kustomoitavat osat kuvassa vihreällä (alimmat boksit).

Käyttäjän kirjaaminen sisään

try {
    $mySessionDataMakerFn = function (\Pike\Entities\User $user) {
        return (object) ['id' => $user->id, 'role' => (int) $user->role];
    };
    $auth->login('username', 'password', $mySessionDataMakerFn);
    // ok, käyttäjä on nyt kirjattu sessioon
} catch (PikeException $e) {
    if ($e->getCode() === Authenticator::CREDENTIAL_WAS_INVALID)
        ; // Käyttäjätunnus tai salasana väärin
    elseif ($e->getCode() === Authenticator::ACCOUNT_STATUS_WAS_UNEXPECTED)
        ; // Tili ei aktivoitu
    else
        ; // Odottamaton poikkeus
}

Käyttäjän kirjautumistietojen haku

$myDataFromSession = $auth->getIdentity();
if ($myDataFromSession)
    echo $myDataFromSession->id; // 'bf789e1e-c99...
else
    ; // Kirjautumistietoja ei löytynyt sessiosta eikä RememberMe-tiedoista

Käyttäjän kirjaaminen ulos

$auth->logout();
// Ok, kirjautumistiedot poistettiin sessiosta, kekseistä ja tietokannasta

Käyttäjän luominen (1. vaihe)

try {
    $username = 'username';
    $email = 'e@mail.com';
    $password = 'pass';
    $role = \Pike\Auth\ACL::ROLE_CONTRIBUTOR;
    $myMakeEmailSettings = function ($user, $activationKey, $settings) {
        //
        echo $settings->fromAddress; // ''
        echo $settings->fromName;    // ''
        echo $settings->toAddress;   // <sama kuin input $email>
        echo $settings->toName;      // <sama kuin input $username>
        echo $settings->subject;     // ''
        echo $settings->body;        // ''
        //
        $settings->fromAddress = 'no-reply@my-site.com';
        $settings->subject = 'Tilisi palveluun my-site.com';
        $settings->body = sprintf(
            'Aktivoi tili osoitteessa: %s. Linkki on voimassa %d tuntia.',
            "my-site.com/my-activate-account-route/{$activationKey}",
            intval(Authenticator::ACTIVATION_KEY_EXPIRATION_SECS / 60 / 60),
        );
    };
    $insertId = $auth->getAccountManager()->requestNewAccount(
        $username,
        $email,
        $password,
        $myMakeEmailSettings,
        $role);
    // Ok, uusi tili insertoitiin tietokantaan parametrien tiedoilla,
    // accountStatuksella \Pike\Auth\Authenticator::ACCOUNT_STATUS_UNACTIVATED,
    // ja lähetettiin myMakeEmailSettings-closuressa määritelty sähköposti
} catch (PikeException $e) {
    if ($e->getCode() === Authenticator::USER_ALREADY_EXISTED)
        ; // $username, tai $email oli jo käytössä
    elseif ($e->getCode() === Authenticator::FAILED_TO_FORMAT_MAIL)
        ; // myMakeEmailSettings jätti jotain täyttämättä
    elseif ($e->getCode() === Authenticator::FAILED_TO_SEND_MAIL)
        ; // sähköpostin lähetys epäonnistui
    else
        ; // Odottamaton poikkeus
}

Käyttäjän luominen (2. vaihe)

try {
    $activationKey = 'pitkä-random-merkkijono';
    $auth->getAccountManager()->activateAccount($activationKey);
} catch (PikeException $e) {
    if ($e->getCode() === Authenticator::CREDENTIAL_WAS_INVALID)
        ; // Aktivointiavainta ei löytynyt
    elseif ($e->getCode() === Authenticator::KEY_HAD_EXPIRED)
        ; // Aktivointiavain oli vanhentunut. Note: käyttäjä poistettiin automaattisesti
    else
        ; // Odottamaton poikkeus
}

Käyttäjän salasanan palautus (1. vaihe)

try {
    $userNameOrEmail = 'username';
    $myMakeEmailSettings = function ($user, $resetKey, $settings) {
        //
        echo $settings->fromAddress; // ''
        echo $settings->fromName;    // ''
        echo $settings->toAddress;   // <käyttäjän $userNameOrEmail email>
        echo $settings->toName;      // <käyttäjän $userNameOrEmail username>
        echo $settings->subject;     // ''
        echo $settings->body;        // ''
        //
        $settings->fromAddress = 'no-reply@my-site.com';
        $settings->subject = 'Salasanan palautus';
        $settings->body = sprintf(
            'Vaihda salasana osoitteessa: %s. Linkki on voimassa %d tuntia.',
            "my-site.com/my-finalize-password-route/{$resetKey}",
            intval(Authenticator::RESET_KEY_EXPIRATION_SECS / 60 / 60)
        );
    };
    $auth->getAccountManager()->requestPasswordReset($userNameOrEmail, $myMakeEmailSettings);
    // Ok, salasanan resetointipyyntötiedot tallennettiin $userNameOrEmail-
    // käyttäjän tietoihin tietokantaan, ja lähetettiin myMakeEmailSettings-
    // closuressa määritelty sähköposti
} catch (PikeException $e) {
    if ($e->getCode() === Authenticator::CREDENTIAL_WAS_INVALID)
        ; // Käyttäjää $userNameOrEmail ei löytynyt
    elseif ($e->getCode() === Authenticator::ACCOUNT_STATUS_WAS_UNEXPECTED)
        ; // Tili ei aktivoitu
    elseif ($e->getCode() === Authenticator::FAILED_TO_FORMAT_MAIL)
        ; // myMakeEmailSettings jätti jotain täyttämättä
    elseif ($e->getCode() === Authenticator::FAILED_TO_SEND_MAIL)
        ; // sähköpostin lähetys epäonnistui
    else
        ; // Odottamaton poikkeus
}

Käyttäjän salasanan palautus (2. vaihe)

try {
    $auth->getAccountManager()->finalizePasswordReset(
        'pitkä-random-merkkijono',
        'newPassword');
    // Ok, uusi salasana päivitettiin tietokantaan ja resetointipyyntötiedot
    // tyhjennettiin tietokannasta
} catch (PikeException $e) {
    if ($e->getCode() === Authenticator::CREDENTIAL_WAS_INVALID)
        ; // Resetointiavainta ei ollut olemassa
    elseif ($e->getCode() === Authenticator::KEY_HAD_EXPIRED)
        ; // Resetointiavain oli vanhentunut
    else
        ; // Odottamaton poikkeus
}

Copyright © 2019-2021 ut4