Как можно осуществить проверку доступа в случае, если переменные $_COOKIE и $_SESSION недоступны?

Я столкнулся с определенными трудностями в разработке. <br/> У меня есть WebApp приложение в Телеграм, где существует файл app.php, содержащий видео-трансляцию в формате mjpg. <br/> <pre><code>&lt;img class="video-stream" src="mjpg.php" width="720" height="480"&gt;</code></pre> <br/> Файл mjpg.php отвечает за поток с камеры. <br/> <pre><code class="php">function streamCallback($curl, $data) {
    if (!headers_sent()) {
        header('Content-Type: multipart/x-mixed-replace; boundary=myboundary');
    }
    echo $data;
    return strlen($data);
} # далее идет cURL и обработка ошибок...</code></pre> <br/> Для справки, если кто не знает, webapp в Телеграм открывается по ссылке website.com/webpage.php#telegramData=1&data=2&... . В параметре data содержится основная информация о пользователе, которая позволяет осуществлять его авторизацию. Важным моментом является наличие хеша, который используется для проверки пользователя. Также данные доступны из window.Telegram.WebApp.initData. <br/> <br/> Прежде чем я узнал, что webapp Телеграма не поддерживает куки при открытии в веб-версии браузера, у меня всё работало со следующим кодом: в начале app.php и mjpg.php был добавлен `include 'auth.php';`. <br/> <pre><code class="php">if (isset($_COOKIE['tguser'])) {
	$data_check_string = $_COOKIE['tguser'];
	$bot_token = 'xxx';

	# если в cookie отсутствует hash
	if (strpos($data_check_string, 'hash=') === false) {
		setcookie("tguser", "", time() - 3600, "/");
		http_response_code(403);
		die();
	} 

	# проверка пользователя через hash
	$checkData = checkData($data_check_string,$bot_token);
	
	# если проверка не удалась
	if($checkData === false){
	        setcookie("tguser", "", time() - 3600, "/");
	        http_response_code(403);
	        die();
	    } 
} else {
	http_response_code(403);
	die(); 
} 
</code></pre> 
  • 31 декабря 2024 г. 5:53
Ответы на вопрос 2
Если вы столкнулись с проблемой использования куков и сессий для проверки доступа в веб-приложении на основе Telegram, есть несколько альтернативных способов для обеспечения безопасного доступа.

1. **Использование `initData`:** В Telegram Web App, как вы уже заметили, доступен объект `window.Telegram.WebApp.initData`, который содержит все необходимые данные о пользователе в виде хеша. Вы можете использовать этот хеш для проверки доступа к вашему приложению.

2. **Создание серверной проверки:** Ваш сервер может проверить, что данный хеш действительно соответствует пользователю. Для этого вы можете использовать метод `checkData`, который вы уже упоминали, и передавать данные для проверки через POST-запрос.

3. **Передача token на стороне клиента:** Если вы хотите расширить функциональность, вы можете генерировать уникальный токен в момент инициализации WebApp и хранить его на клиентской стороне (например, в `localStorage` или в переменной JavaScript). При обращении к защищенным ресурсам (например, при загрузке вашего `mjpg.php`) проверяйте наличие этого токена.

4. **Использование ссылок с параметрами:** Если у вас есть уникальный идентификатор пользователя (например, user_id), вы можете передавать его как параметр в URL при открытии вашего приложения в Telegram, например: `app.php?user_id=123456`, а затем проверять его на сервере.

5. **Использовать JWT (JSON Web Token):** Это более сложный, но надежный способ аутентификации. При авторизации вы можете создавать JWT-токен, который будет храниться в клиентском приложении (например, в `localStorage`). Этот токен затем можно передавать через заголовки запросов (headers) в API.

Вот пример кода, который можно использовать для проверки данных из `initData`:

```php
function validateTelegramUser($initData, $botToken) {
    // Строка для проверки
    $checkString = $initData . '/' . $botToken;
    
    // Генерация хеша
    $hash = md5($checkString);

    // Проверка на стороне сервера
    // Ваша логика проверки
    return $hash === expectedHashFunction(); // expectedHashFunction - ваша функция хеширования
}

// В app.php
$initData = $_GET['data']; // Получаем данные из URL
if (!validateTelegramUser($initData, 'your_telegram_bot_token')) {
    http_response_code(403);
    die("Access denied");
}

// Дальше ваш код...
```

Итак, в зависимости от вашей архитектуры, вы можете выбрать один или несколько подходов, чтобы обеспечить безопасность и проверку доступа в приложении Telegram WebApp без использования `$_COOKIE` и `$_SESSION`.
например, дописывай к mjpg.php GET параметрами ${tg.initData}, да проверяй $_GET или как там в php
Похожие вопросы