109 lines
3.1 KiB
PHP
109 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace classes;
|
|
|
|
use Exception;
|
|
use interfaces\authentication_i;
|
|
use objects\plate_scanners_o;
|
|
use objects\tokens_o;
|
|
use objects\users_o;
|
|
|
|
class authentication implements authentication_i
|
|
{
|
|
|
|
public function authenticate(int $customer_number, string $password): bool
|
|
{
|
|
// Get the customer from the database
|
|
$customer = (new users_o())->getUserByCustomerNumber( $customer_number );
|
|
// Check if the customer exists
|
|
if (!$customer->password->value()) {
|
|
return false;
|
|
}
|
|
// Check if the password is correct
|
|
if (!$this->match_passwords($password, $customer->password->value())) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public function create_token(int $customer_number): string
|
|
{
|
|
// Create a token
|
|
$token = bin2hex(random_bytes(32));
|
|
// Get the user id
|
|
$user_id = (new users_o())->getUserByCustomerNumber($customer_number)->id;
|
|
// Save the token in the database
|
|
(new tokens_o())->create($user_id, $token, 'AUTH_TOKEN');
|
|
return $token;
|
|
}
|
|
|
|
public function validate_token(string $token): bool
|
|
{
|
|
// Get the token from the database
|
|
$token = (new tokens_o())->getToken($token);
|
|
// Check if the token exists
|
|
if (!$token->id) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @throws Exception
|
|
*/
|
|
public function get_user(): users_o|false
|
|
{
|
|
/**
|
|
* Get the user from the token
|
|
*/
|
|
// Get the token from the headers
|
|
$headers = getallheaders();
|
|
if (!isset($headers['Authorization'])) {
|
|
return false;
|
|
}
|
|
$token = $headers['Authorization'];
|
|
// Strip the Bearer prefix
|
|
$token = str_replace('Bearer ', '', $token);
|
|
// Get the token from the database
|
|
$token = (new tokens_o())->getToken($token);
|
|
// Check if the token exists
|
|
if (!$token->id) {
|
|
return false;
|
|
}
|
|
// Get the user from the database
|
|
return (new users_o())->getUserById($token->user_id->value());
|
|
}
|
|
|
|
public function get_plate_scanner(): plate_scanners_o|false
|
|
{
|
|
// Get the token from the headers
|
|
$headers = getallheaders();
|
|
if (!isset($headers['Authorization'])) {
|
|
return false;
|
|
}
|
|
$token = $headers['Authorization'];
|
|
// Strip the Bearer prefix
|
|
$token = str_replace('Bearer ', '', $token);
|
|
// Get the token from the database
|
|
$token = (new plate_scanners_o())->getPlateScannerByApiKey($token);
|
|
// Check if the token exists
|
|
if (!isset($token->id)) {
|
|
return false;
|
|
}
|
|
// Get the plate scanner from the database
|
|
return $token;
|
|
}
|
|
|
|
|
|
public function hash_password($password): string
|
|
{
|
|
// Hash the password
|
|
return password_hash($password, PASSWORD_DEFAULT);
|
|
}
|
|
|
|
public function match_passwords($password, $hash): bool
|
|
{
|
|
// Compare the password with the hash
|
|
return password_verify($password, $hash);
|
|
}
|
|
} |