Generator untuk counter berbasis (RFC 4226) dan waktu berbasis (RFC 6238) satu kali kata sandi (OTP). (alias implementasi Google Authenticator lainnya!)
ext-curl untuk Sinkronisasi Waktu Server Steam Guardext-sodium untuk implementasi waktu konstan base64 encode/decode dan hex2bin/bin2hex ( paragonie/constant_time_encoding digunakan sebagai fallback) membutuhkan komposer
Via Terminal: composer require chillerlan/php-authenticator
composer.json
{
"require" : {
"php" : " ^8.2 " ,
"chillerlan/php-authenticator" : " dev-main "
}
} Catatan: Ganti dev-main dengan kendala versi, misalnya ^5.0 - lihat rilis untuk versi yang valid
Laba!
Rahasianya biasanya dibuat sekali selama proses aktivasi di panel kontrol pengguna. Jadi yang perlu Anda lakukan hanyalah menampilkannya kepada pengguna dengan cara yang nyaman - sebagai string teks dan kode QR misalnya - dan menyimpannya di suatu tempat dengan data pengguna.
use chillerlan Authenticator { Authenticator , AuthenticatorOptions };
$ options = new AuthenticatorOptions ;
$ options -> secret_length = 32 ;
$ authenticator = new Authenticator ( $ options );
// create a secret (stored somewhere in a *safe* place on the server. safe... hahaha jk)
$ secret = $ authenticator -> createSecret ();
// you can also specify the length of the secret key, which overrides the options setting
$ secret = $ authenticator -> createSecret ( 20 );
// set an existing secret
$ authenticator -> setSecret ( $ secret ); Rahasia yang dibuat dengan Authenticator::createSecret() juga akan disimpan secara internal, sehingga Anda tidak perlu memberikan rahasia yang baru saja Anda buat pada operasi tindak lanjut dengan instance saat ini.
Sekarang selama proses login - setelah pengguna berhasil memasukkan kredensial mereka - Anda akan meminta mereka kode satu kali untuk memeriksanya terhadap rahasia dari database pengguna Anda.
// verify the code
if ( $ authenticator -> verify ( $ otp )){
// that's it - 2FA has never been easier! :D
}Verifikasi kode yang berdekatan
// try the first adjacent
$ authenticator -> verify ( $ otp , time () - $ options -> period ); // -> true
// try the second adjacent, default is 1
$ authenticator -> verify ( $ otp , time () + 2 * $ options -> period ); // -> false
// allow 2 adjacent codes
$ options -> adjacent = 2 ;
$ authenticator -> verify ( $ otp , time () + 2 * $ options -> period ); // -> true // switch mode to HOTP
$ options -> mode = AuthenticatorInterface:: HOTP ;
// user sends the OTP for code #42, which is equivalent to
$ otp = $ authenticator -> code ( 42 ); // -> 123456
// verify [123456, 42]
$ authenticator -> verify ( $ otp , $ counterValueFromUserDatabase ) // -> true Untuk menampilkan kode QR untuk authenticator seluler, Anda akan memerlukan otpauth:// uri, yang dapat dibuat menggunakan metode berikut.
$label harus menjadi sesuatu yang mengidentifikasi akun yang menjadi milik rahasia itu$issuer adalah nama situs web atau perusahaan Anda misalnya, sehingga pengguna dapat mengidentifikasi beberapa akun. $ uri = $ authenticator -> getUri ( $ label , $ issuer );
// -> otpauth://totp/my%20label?secret=NKSOQG7UKKID4IXW&issuer=chillerlan.net&digits=6&period=30&algorithm=SHA1 Perlu diingat bahwa beberapa pengaturan URI belum (belum) diakui oleh semua autentikator. Periksa wiki Google Authenticator untuk info lebih lanjut.
// code length, currently 6 or 8
$ options -> digits = 8 ;
// valid period between 15 and 60 seconds
$ options -> period = 45 ;
// set the HMAC hash algorithm
$ options -> algorithm = AuthenticatorInterface:: ALGO_SHA512 ;Authenticator| metode | kembali | keterangan |
|---|---|---|
__construct(SettingsContainerInterface $options = null, string $secret = null) | - | |
setOptions(SettingsContainerInterface $options) | Authenticator | disebut secara internal oleh __construct() |
setSecret(string $secret) | Authenticator | disebut secara internal oleh __construct() |
getSecret() | string | |
createSecret(int $length = null) | string | $length mengesampingkan pengaturan AuthenticatorOptions |
code(int $data = null) | string | $data mungkin unix timestamp (TOTP) atau nilai penghitung (hotp) |
verify(string $otp, int $data = null) | bool | untuk $data lihat Authenticator::code() |
getUri(string $label, string $issuer, int $hotpCounter = null, bool $omitSettings = null) | string |
AuthenticatorOptions | milik | jenis | bawaan | diizinkan | keterangan |
|---|---|---|---|---|
$digits | int | 6 | 6 atau 8 | Panjang kode auth |
$period | int | 30 | 15 - 60 | periode validasi (detik) |
$secret_length | int | 20 | > = 16 | Panjang frasa rahasia (byte, biner yang tidak dimodelkan) |
$algorithm | string | SHA1 | SHA1 , SHA256 atau SHA512 | Algoritma hash HMAC, lihat AuthenticatorInterface::HASH_ALGOS |
$mode | string | totp | totp , hotp , battlenet atau steam | Mode Authenticator: Berdasarkan Waktu atau Penghitung, Lihat AuthenticatorInterface::MODES |
$adjacent | int | 1 | > = 0 | jumlah kode yang berdekatan |
$time_offset | int | 0 | * | Fixed Time Offset yang akan ditambahkan ke nilai waktu saat ini |
$useLocalTime | bool | BENAR | * | apakah akan menggunakan waktu setempat atau meminta waktu server |
$forceTimeRefresh | bool | PALSU | * | apakah akan memaksa waktu server yang menyegarkan pada setiap panggilan |
AuthenticatorInterface | metode | kembali | keterangan |
|---|---|---|
setOptions(SettingsContainerInterface $options) | AuthenticatorInterface | |
setSecret(string $encodedSecret) | AuthenticatorInterface | |
getSecret() | string | |
createSecret(int $length = null) | string | |
getServertime() | int | |
getCounter(int $data = null) | int | intern |
getHMAC(int $counter) | string | intern |
getCode(string $hmac) | int | intern |
getOTP(int $code) | string | intern |
code(int $data = null) | string | |
verify(string $otp, int $data = null) | bool |
| konstan | jenis | keterangan |
|---|---|---|
TOTP | string | |
HOTP | string | |
STEAM_GUARD | string | |
ALGO_SHA1 | string | |
ALGO_SHA256 | string | |
ALGO_SHA512 | string | |
MODES | array | Peta Mode -> ClassName |
HASH_ALGOS | array | Daftar algoritma hash yang tersedia |