108 lines
3.4 KiB
PHP
108 lines
3.4 KiB
PHP
<?php
|
|
namespace WorkbloomERP\Module\Auth\Service;
|
|
|
|
use RuntimeException;
|
|
use WorkbloomERP\Module\Auth\DTO\LoginDTO;
|
|
use WorkbloomERP\Module\Auth\Repository\AuthRepository;
|
|
use WorkbloomERP\Security\JwtService;
|
|
|
|
class AuthService {
|
|
private AuthRepository $repository;
|
|
private JwtService $jwtService;
|
|
|
|
public function __construct(
|
|
?AuthRepository $repository = null,
|
|
?JwtService $jwtService = null
|
|
) {
|
|
$this->repository = $repository ?? new AuthRepository();
|
|
$this->jwtService = $jwtService ?? new JwtService();
|
|
}
|
|
|
|
/**
|
|
* Realiza a autenticação do usuário com validação de credenciais e status.
|
|
*
|
|
* @param LoginDTO $dto
|
|
* @return array
|
|
* @throws RuntimeException
|
|
*/
|
|
public function login(LoginDTO $dto): array {
|
|
$user = $this->repository->findByLogin($dto->login);
|
|
|
|
// Prevenção contra enumeração de usuários: mensagem genérica para usuário inexistente
|
|
if ($user === null) {
|
|
throw new RuntimeException('Credenciais inválidas.', 401);
|
|
}
|
|
|
|
// Validação de conta ativa
|
|
if (empty($user['ativo'])) {
|
|
throw new RuntimeException('Usuário inativo no sistema.', 403);
|
|
}
|
|
|
|
// Validação segura de senha com hash
|
|
if (!password_verify($dto->senha, $user['senha_hash'])) {
|
|
throw new RuntimeException('Credenciais inválidas.', 401);
|
|
}
|
|
|
|
$userUuid = (string)$user['uuid'];
|
|
$empresas = $this->repository->findEmpresasByUsuarioUuid($userUuid);
|
|
|
|
$tokenPayload = [
|
|
'sub' => $userUuid,
|
|
'email' => $user['email'],
|
|
'nome_usuario' => $user['nome_usuario'],
|
|
'nome_completo' => $user['nome_completo'],
|
|
];
|
|
|
|
$tokenData = $this->jwtService->generateToken($tokenPayload);
|
|
|
|
return [
|
|
'token' => $tokenData['token'],
|
|
'token_type' => 'Bearer',
|
|
'expires_in' => $tokenData['expires_in'],
|
|
'expires_at' => $tokenData['expires_at'],
|
|
'usuario' => [
|
|
'uuid' => $user['uuid'],
|
|
'nome_completo' => $user['nome_completo'],
|
|
'cpf' => $user['cpf'],
|
|
'email' => $user['email'],
|
|
'nome_usuario' => $user['nome_usuario'],
|
|
],
|
|
'empresas' => $empresas,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Retorna os dados do usuário autenticado a partir do UUID (sem expor credenciais nem ID inteiro).
|
|
*
|
|
* @param string $userUuid
|
|
* @return array
|
|
* @throws RuntimeException
|
|
*/
|
|
public function getProfile(string $userUuid): array {
|
|
$user = $this->repository->findByUuid($userUuid);
|
|
|
|
if ($user === null) {
|
|
throw new RuntimeException('Usuário não encontrado.', 404);
|
|
}
|
|
|
|
if (empty($user['ativo'])) {
|
|
throw new RuntimeException('Usuário inativo no sistema.', 403);
|
|
}
|
|
|
|
$empresas = $this->repository->findEmpresasByUsuarioUuid($userUuid);
|
|
|
|
return [
|
|
'usuario' => [
|
|
'uuid' => $user['uuid'],
|
|
'nome_completo' => $user['nome_completo'],
|
|
'cpf' => $user['cpf'],
|
|
'email' => $user['email'],
|
|
'nome_usuario' => $user['nome_usuario'],
|
|
'ativo' => (bool)$user['ativo'],
|
|
'created_at' => $user['created_at'],
|
|
],
|
|
'empresas' => $empresas,
|
|
];
|
|
}
|
|
}
|