Помогите реализовать валидацию в 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>'.
//ну я вродже разделил.
Но ничего не получается. Я не могу определить что я делаю не так. Помогите пожалуйста.