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.
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
- Arkkitehtuuri
- Käyttäjän kirjaaminen sisään
- Käyttäjän kirjautumistietojen haku
- Käyttäjän kirjaaminen ulos
- Käyttäjän luominen (1. vaihe)
- Käyttäjän luominen (2. vaihe)
- Käyttäjän salasanan palautus (1. vaihe)
- 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
}