32 lines
1.1 KiB
PHP
32 lines
1.1 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
declare(strict_types=1);
|
|||
|
|
|
|||
|
|
namespace App\Http\Middleware;
|
|||
|
|
|
|||
|
|
use Closure;
|
|||
|
|
use Illuminate\Http\Request;
|
|||
|
|
use Symfony\Component\HttpFoundation\Response;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Сервис-токен канала «Телеграм-робот кабинета МТС → Портал» (/api/tg-robot/*).
|
|||
|
|
*
|
|||
|
|
* Это НЕ пользовательский вход: робот ходит от своего имени, без tenant-контекста.
|
|||
|
|
* Пустой токен в настройках → канал закрыт (401), чтобы его нельзя было случайно
|
|||
|
|
* открыть без секрета. Тот же порядок, что у CreativeRobotToken.
|
|||
|
|
*/
|
|||
|
|
class TgRobotToken
|
|||
|
|
{
|
|||
|
|
public function handle(Request $request, Closure $next): Response
|
|||
|
|
{
|
|||
|
|
$expected = (string) config('services.tg_robot.token', '');
|
|||
|
|
$given = (string) $request->header('X-Tg-Robot-Token', '');
|
|||
|
|
|
|||
|
|
if ($expected === '' || ! hash_equals($expected, $given)) {
|
|||
|
|
abort(401, 'Неверный сервис-токен телеграм-робота.');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return $next($request);
|
|||
|
|
}
|
|||
|
|
}
|