Задать вопрос

Webapp телеграм. Как сделать сессию?

В хедере index.php я отправляю запрос на валидацию
var WebApp = window.Telegram.WebApp;
let initDataURLSP = new URLSearchParams(WebApp.initData);
var checkDataString = initDataURLSP.toString();

$.ajax({
    url: '/validate.php',
    method: 'post',
    dataType: 'json',
    data: {checkDataString:checkDataString},
    success: function(data){}
});

в файле делаю проверку токенов

$bot_token = "1234567890987654321234567890";
$data_check_string = $_POST['checkDataString'];

$data_check_arr = explode('&', rawurldecode($data_check_string));

$needle = 'hash=';
$check_hash = FALSE;
foreach( $data_check_arr AS &$val ){
    if( mb_substr( $val, 0, mb_strlen($needle) ) === $needle ){
        $check_hash = trim(substr_replace( $val, '', 0, mb_strlen($needle) ));
        $val = NULL;
    }
}

// if( $check_hash === FALSE ) return FALSE;
$data_check_arr = array_filter($data_check_arr);

sort($data_check_arr);

$data_check_string = implode("\n", $data_check_arr);
$secret_key = hash_hmac( 'sha256', $bot_token, "WebAppData", TRUE );
$hash = trim(bin2hex( hash_hmac( 'sha256', $data_check_string, $secret_key, TRUE ) ));

if( strcmp($hash, $check_hash) === 0 ){
    //echo  "validation success";
	echo "{\"data_check\":\"$check_hash\"}";
}else{
	header('HTTP/1.1 403 incorrect user');
	exit();
}

Далее, при validation success я буду доставать пользователя из базы.
До этого момента мне все понятно.

А вот дальше, как взаимодействовать, не могу разобраться, чтобы авторизация из файла validate.php передавалась в index.php.

Попробовал сделать set_cookie в файле validate.php, но что-то не получилось.
В какую сторону копать?
  • Вопрос задан
  • 450 просмотров
Подписаться 3 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
thewind
@thewind
php программист, front / backend developer
Вы видимо не совсем правильно поняли концепцию работы мини-апп в Телеграм.
Цепочка выглядит так: вы (клиент с Телеграмом) <=> мини-апп (ваш фронтенд) <=> сервер с логикой (ваш бэкенд).

Каждый раз, когда клиент (вы) открывает мини-апп, Телеграм присылает туда данные TelegramInitData - где содержатся данные юзера, подтверждающий хеш и другие.

Ваш мини-апп должен эти данные принять и всегда держать под рукой. И каждый раз посылать на бэкенд в удобном для вас виде (заголовок, например). А каждый ваш скрипт (куда вы обращаетесь по ajax) должен иметь некий middleware (или пре-хук или listener - как вам удобнее) с обработкой / проверкой этого заголовка (с данными TelegramInitData). И если проверка прошла успешно - то дальнейшие действия выполняются. Если нет - отдается ответ с кодом 401 или 403 - тут как сами решите.

Логика должна быть такой. Ничего сохранять на вашем сервере не надо и ставить дополнительных кук (прости Господи) не надо. У вас по сути stateless backend.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы