Помогите реализовать валидацию в Telegram Mini Apps на C#

Чат жпт вроде обьяснил как это делать но не работает. Не могу попять почему. Толи я данные не те или не так отправляю. Толи реализация неверная. Вот что говорит документация

Data-check-string is a chain of all received fields, sorted alphabetically, in the format key=<value> with a line feed character ('\n', 0x0A) used as separator – e.g., 'auth_date=<auth_date>\nquery_id=<query_id>\nuser=<user>'.

The full check might look like:

data_check_string = ...
secret_key = HMAC_SHA256(<bot_token>, "WebAppData")
if (hex(HMAC_SHA256(data_check_string, secret_key)) == hash) {
  // data is from Telegram
}

А вот как делаю я.
Сам класс с валидацией:

public class ValidController : ControllerBase
{

 static string botToken = "111111:Sekret_token_bot";
      //Первый параметр данные, второй хеш который приходит вместе с данными
        public string Get(string data, string hash)
        {
        //генерируем  ключь из токен бота в документации это строка secret_key = HMAC_SHA256(<bot_token>, "WebAppData")
            byte[] secret_key = HMAC_SHA256(Encoding.UTF8.GetBytes(botToken), Encoding.UTF8.GetBytes("WebAppData"));
            //Далее генерируем строку из данных которые пришли и из секретного ключа, в документации это строка hex(HMAC_SHA256(data_check_string, secret_key))
            string calculatedHash = BitConverter.ToString(HMAC_SHA256(Encoding.UTF8.GetBytes(data), secret_key)).Replace("-", "");
           //далее сравниваем что получилось с тем что пришло.
            if (calculatedHash.Equals(hash, StringComparison.OrdinalIgnoreCase))
            {
                // Данные получены от Telegram
                return "OK";
            }
            else
            {
                // Хэш не совпадает, данные не действительны
                return "NOT OK";
            }
           
        
        }





private static byte[] HMAC_SHA256(byte[] data, byte[] key)
{
    using (HMACSHA256 hmac = new HMACSHA256(key))
    {
        return hmac.ComputeHash(data);
    }
}





}

Данные я подготавливаю так:

string dataAuth ="";
dataAuth = parsedQueryString["auth_date"] + "\n" + parsedQueryString["query_id"] + "\n" + parsedQueryString["user"];
//В документации написанно что нужно разделить данные, key=<value> with a line feed character ('\n', 0x0A) used as separator – e.g., 'auth_date=<auth_date>\nquery_id=<query_id>\nuser=<user>'.
//ну я вродже разделил.

Но ничего не получается. Я не могу определить что я делаю не так. Помогите пожалуйста.


Ответы (0 шт):