• File: TerminalsV2.php
  • Full Path: /var/www/imaliapi/app/Http/Middleware/TerminalsV2.php
  • Date Modified: 04/10/2025 4:48 PM
  • File size: 2.27 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?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;
    }
}