-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTelegramWebappDataValidatorUtil.java
50 lines (42 loc) · 1.67 KB
/
TelegramWebappDataValidatorUtil.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package ua.te.seller.util;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
/**
* Validates Telegram Bot WebApp InitData via `HMAC_SHA_256`
*/
@Slf4j
@UtilityClass
public class TelegramWebappDataValidatorUtil {
public static boolean isValid(String initData, String telegramBotToken) {
Map<String, String> initDataMap = parseInitData(initData);
String hash = initDataMap.get("hash");
initDataMap.remove("hash");
String dataCheckString = new TreeMap<>(initDataMap)
.entrySet()
.stream()
.map(e -> e.getKey() + "=" + e.getValue())
.collect(Collectors.joining("\n"));
byte[] secret = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "WebAppData")
.hmac(telegramBotToken);
String dataCheckHash = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, secret)
.hmacHex(dataCheckString);
return hash.equals(dataCheckHash);
}
private static Map<String, String> parseInitData(String initData) {
Map<String, String> initDataMap = new HashMap<>();
String[] keyValuePairs = initData.split("&");
for (String keyValuePair : keyValuePairs) {
String[] parts = keyValuePair.split("=", 2);
if (parts.length == 2) {
initDataMap.put(parts[0], parts[1]);
}
}
return initDataMap;
}
}