(sedang dalam proses: dokumen untuk 2.0)
Perpustakaan untuk menangani identifikasi pengguna.
Tujuan dari perpustakaan ini adalah untuk menemukan akun pengguna (tepatnya - id uniknya) untuk bukti identitas tertentu dan untuk mengelola berbagai jenis identitas. Ini terdiri dari 4 layanan berbeda: Identifikasi, Registrasi, Pencarian dan Pemulihan.
Anda dapat menambahkan perpustakaan ke proyek Anda menggunakan komposer dengan perintah berikut:
composer require teresko/ palladium
Untuk menggunakan paket ini, diperlukan PHP versi 7.0+ dan PDO.
Anda juga perlu membuat tabel, tempat menyimpan identitas . Contoh skema tersedia di sini. Saat ini hanya berisi definisi tabel untuk MySQL/MariaDB, tetapi perpustakaan dapat digunakan dengan RDBMS apa pun, yang memiliki driver PDO.
palladium berisi 4 layanan: Registration
, Identification
, Search
dan Recovery
. Masing-masing layanan ini memiliki dua dependensi wajib:
palladium ContractCanPersistIdenity
)PsrLogLoggerInterface
)Ini memberi Anda pilihan untuk mengganti repositori default, jika Anda ingin mengubah atau mengganti bagian lapisan abstraksi persistensi. Sedangkan untuk logger - pendekatan yang disarankan adalah menggunakan Monolog, namun dapat digunakan dengan sistem logging apa pun yang kompatibel.
Repositori default juga dilengkapi dengan fungsionalitas untuk menambahkan tipe identitas khusus dan pemetaan data, yang digunakan untuk tipe identitas Anda atau bawaan. Untuk detail penggunaan, lihat bagian %TODO%.
Di konstruktor layanan Identification
ada parameter opsional ketiga dan keempat:
Di konstruktor layanan Registration
ada parameter ketiga opsional:
Seperti disebutkan di atas, keempat layanan mengharapkan repositori sebagai ketergantungan konstruktor. Jika Anda tidak mengganti repositori yang dibundel dengan versi khusus Anda, maka Anda perlu menginisialisasi palladium RepositoryIdentity
dan meneruskannya ke layanan.
Repositori yang dibundel itu sendiri memiliki satu ketergantungan: contoh, yang mengimplementasikan palladium ContractCanCreateMapper
. Kontrak (antarmuka) ini diimplementasikan oleh palladium ComponentMapperFactory
. Dan pabrik ini memiliki dua dependensi: instance PDO
dan nama tabel, tempat identitas akan disimpan.
<?php
$ factory = new palladium Component MapperFactory ( new PDO (... $ config ), $ tableName );
$ repository = new palladium Repository Identity ( $ factory );
Dalam setiap contoh kode lainnya, di mana Anda melihat variabel $repository
digunakan, Anda dapat berasumsi bahwa variabel tersebut telah diinisialisasi menggunakan contoh kode ini.
Untuk pengguna Komponen DependencyInjection Symfony (versi: 3.4+), ada contoh file konfigurasi: %TODO%
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity );
Jika operasi berhasil diselesaikan, variabel $identity
akan berisi instance StandardIdentity
yang belum diverifikasi. Untuk menyelesaikan verifikasi, Anda harus menggunakan token yang terdapat dalam identitas. Dalam contoh yang diberikan, token ini dapat dinilai menggunakan $instance->getToken()
.
Metode createStandardIdentity()
dapat memunculkan pengecualian IdentityConflict
, jika email telah digunakan untuk identitas lain.
Metode createStandardIdentity()
memiliki parameter ketiga opsional, yang menentukan umur token verifikasi email dalam hitungan detik. Jika diterapkan, contoh sebelumnya terlihat seperti berikut:
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' , 3600 );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity );
Ini akan membuat token verifikasi dapat digunakan selama 1 jam setelah identitas pengguna ini didaftarkan. Setelah waktu tertentu berlalu, Anda tidak akan dapat menemukan identitas ini menggunakan findStandardIdentityByToken()
di layanan Search
.
PENTING : metode
createStandardIdentity()
tidak memvalidasi email pengguna atau jenis pengenal lainnya. Itu hanya memeriksa keunikannya. Validasi email, nomor telepon, nama panggilan, dan pengenal lainnya berada di luar cakupan perpustakaan ini.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByToken ( $ token , palladium Entity Identity:: ACTION_VERIFY );
$ registration -> verifyStandardIdentity ( $ identity );
Nilai $token
digunakan untuk menemukan EmailIdentity
yang cocok, yang kemudian diverifikasi. Jika identitas tidak ditemukan, findStandardIdentityByToken()
akan memunculkan pengecualian IdentityNotFound
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ cookie = $ identification -> loginWithPassword ( $ identity , $ password );
Jika tidak ditemukan identitas yang cocok dengan pengidentifikasi tertentu (misalnya, alamat email), metode findStandardIdentityByIdentifier()
akan memunculkan pengecualian IdentityNotFound
.
Jika kata sandi tidak cocok, metode loginWithPassword()
akan memunculkan pengecualian PasswordMismatch
.
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId );
Ini akan membuat instance NonceIdentity
baru. Untuk menggunakannya untuk login, Anda memerlukan nilai dalam NonceIdentity::getIdentifier()
dan NonceIdentity::getKey()
, yang mana pengidentifikasi akan digunakan untuk menemukan identitas nonce dan kunci akan digunakan untuk memverifikasi.
Metode createNonceIdentity()
adalah parameter opsional kedua, yang menentukan umur identitas sekali pakai ini dalam hitungan detik. Jika diterapkan, contoh sebelumnya terlihat seperti berikut:
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId , 600 );
Ini akan membuat identitas sekali pakai dapat digunakan selama 10 menit setelah pembuatannya. Setelah waktu yang diizinkan berlalu, meneruskan identitas ini dalam metode Identification
useNonceIdentity()
akan mengakibatkan pengecualian IdentityExpired
dilempar.
<?php
$ identity = $ this -> search -> findNonceIdentityByIdentifier ( $ identifier );
$ cookie = $ this -> identification -> useNonceIdentity ( $ identity , $ key );
Jika tidak ditemukan identitas yang cocok dengan pengidentifikasi tertentu (alamat email, nama panggilan, dll.), metode findNonceIdentityByIdentifier()
akan memunculkan pengecualian IdentityNotFound
.
Jika kata sandi tidak cocok, metode useNonceIdentity()
akan memunculkan pengecualian KeyMismatch
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ cookie = $ identification -> loginWithCookie ( $ identity , $ key );
Jika cookie tidak ditemukan menggunakan findCookieIdentity()
pengecualian IdentityNotFound
standar akan dilempar. Kemungkinan penyebabnya adalah cookie tidak aktif lagi (misalnya pengguna logout) atau cookie tidak ada sama sekali.
Jika cookie terlalu lama, loginWithCookie()
akan menghasilkan pengecualian IdentityExpired
.
Namun metode loginWithCookie()
juga dapat menghasilkan pengecualian CompromisedCookie
. Melihat pengecualian untuk hal ini dapat menunjukkan bahwa cookie telah dicuri atau pengguna tidak pernah menerima nilai cookie baru.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ identification -> blockIdentity ( $ identity );
Ini adalah cara yang disarankan untuk menangani cookie mencurigakan, yang mungkin dicuri atau tidak. Ini tidak dimaksudkan untuk mengeluarkan pengguna .
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ identification -> logout ( $ identity , $ key );
Operasi ini menandai cookie sebagai "dibuang". Daftar pengecualian yang dapat dihasilkan cocok dengan yang dijelaskan di bagian login menggunakan cookie.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ token = $ recovery -> markForReset ( $ identity );
Jika tidak ditemukan identitas yang cocok dengan alamat email tertentu, metode findStandardIdentityByIdentifier()
akan memunculkan pengecualian IdentityNotFound
.
Saat markForReset()
dipanggil, ia harus dilengkapi dengan instance StandardIdentity
yang telah diverifikasi (jika tidak, ia berpotensi membocorkan informasi pribadi pengguna dari aplikasi Anda). Jika bukan itu masalahnya, metode ini akan memunculkan pengecualian IdentityNotVerified
.
Metode markForReset()
adalah parameter kedua opsional, yang menentukan umur token pengaturan ulang kata sandi dalam hitungan detik. Jika diterapkan, contoh sebelumnya terlihat seperti berikut:
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ token = $ recovery -> markForReset ( $ identity , 7200 );
Ini akan membuat token pengaturan ulang kata sandi dapat digunakan selama dua jam setelah identitas pengguna ini ditandai untuk diatur ulang. Ketika waktu yang diizinkan telah habis, Anda tidak akan dapat menemukan identitas ini menggunakan findEmailIdentityByToken()
di layanan Search
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findEmailIdentityByToken ( $ token , palladium Entity Identity:: ACTION_RESET );
$ recovery -> resetIdentityPassword ( $ identity , ' foobar ' );
Jika tidak ditemukan identitas yang cocok dengan token tertentu, metode findEmailIdentityByToken()
akan memunculkan pengecualian IdentityNotFound
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ identification -> changePassword ( $ identity , $ oldPassword , $ newPassword );
Jika tidak ditemukan identitas yang cocok dengan alamat email yang diberikan (atau jenis pengenal lainnya), metode findStandardIdentityByIdentifier()
akan memunculkan pengecualian IdentityNotFound
.
Jika kata sandi tidak cocok, metode changePassword()
akan memunculkan pengecualian PasswordMismatch
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ factory , $ logger );
$ list = $ search -> findIdentitiesByParentId ( $ identity -> getId ());
$ identification -> discardIdentityCollection ( $ list );
Nilai kembalian findIdentitiesByParentId()
akan mengembalikan IdentityCollection
, yang boleh kosong.
Seperti disebutkan sebelumnya, layanan di perpustakaan ini mengharapkan logger yang kompatibel dengan PSR-3 sebagai ketergantungan. Ini akan digunakan untuk mencatat tiga tingkat peristiwa:
LogLevel::INFO
Tingkat log ini digunakan untuk melacak operasi biasa, yang akan dilakukan pengguna, saat menggunakan aplikasi Anda dengan cara yang dimaksudkan:
LogLevel::NOTICE
Log dengan tingkat ini akan dicatat, jika pengguna mencoba melakukan operasi yang gagal, hal ini tidak akan terjadi dalam skenario penggunaan yang benar:
LogLevel::WARNING
Hanya digunakan untuk kasus logging, ketika pengguna mencoba menggunakan cookie yang disusupi.
Perpustakaan ini berfokus pada satu tugas tertentu. Itu tidak mencakup salah satu fungsi berikut:
Jika menurut Anda, perpustakaan autentikasi tersebut memerlukan salah satu bagian yang tercantum di atas, maka ini bukan perpustakaan yang Anda cari.