<?php
namespace App\Http\Middleware;
use App\Classes\SendResponse;
use App\Terminal;
use Closure;
use Illuminate\Http\Request;
class TerminalsV2
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
// Obtém o valor do cabeçalho Authorization
$authHeader = $request->header('Authorization');
$terminalID = $request->header('X-Terminal-ID');
// return $request->hasHeader('X-Terminal-ID');
if (!$request->hasHeader('X-Terminal-ID')) return SendResponse::errorResp400('X-Terminal-ID nao existe', 'X-Terminal-ID does not exists');
// Verifica se o cabeçalho Authorization está presente
if ($authHeader && preg_match('/Bearer\s(\S+)/', $authHeader, $matches)) {
$token = $matches[1];
$terminal = Terminal::query()->whereNotNull('terminal_id')->where('terminal_id', $terminalID)->select('terminal_key', 'private_key', 'terminal_id')->first();
if (!$terminal) return SendResponse::errorResp401unauthenticated('ID do Terminal invalido', 'Invalid Terminal ID');
$terminal_key = $this->isValidToken($terminal, $token);
if (!$terminal_key) return SendResponse::errorResp401unauthenticated('Chave de encriptação invalida', 'Invalid Encryption Key');
if ($terminal->terminal_key !== $terminal_key) return SendResponse::errorResp401unauthenticated();
$request->request->add(['store_id' => $terminal->store_id]);
} else {
return SendResponse::errorResp401unauthorized();
}
return $next($request);
}
private function isValidToken($terminal, $token)
{
try {
return $this->decryptString($token, $terminal->private_key);
} catch (\Throwable $th) {
return false;
}
}
public function decryptString($encryptedData, $privateKey)
{
openssl_private_decrypt(base64_decode($encryptedData), $decryptedData, $privateKey);
return $decryptedData;
}
}