Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1025,32 +1025,35 @@ def get_order_monitop():
|
|
| 1025 |
|
| 1026 |
|
| 1027 |
# Функция для валидации подписи ВКонтакте
|
| 1028 |
-
|
|
|
|
| 1029 |
"""Проверка подписи ВКонтакте"""
|
| 1030 |
-
#
|
| 1031 |
-
parsed_url = urlparse(
|
| 1032 |
query_params = parse_qs(parsed_url.query)
|
| 1033 |
|
| 1034 |
-
#
|
| 1035 |
-
vk_subset =
|
| 1036 |
-
(k, v[0]) for k, v in query_params.items() if k.startswith("vk_") and k != "sign"
|
| 1037 |
-
))
|
| 1038 |
-
|
| 1039 |
-
# Строка для подписи
|
| 1040 |
-
data_to_sign = urlencode(vk_subset, doseq=True)
|
| 1041 |
|
| 1042 |
-
#
|
| 1043 |
-
|
| 1044 |
|
| 1045 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1046 |
decoded_hash_code = hash_code[:-1].replace('+', '-').replace('/', '_')
|
| 1047 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1048 |
logging.debug(f"Строка для подписи: {data_to_sign}")
|
| 1049 |
logging.debug(f"Вычисленная подпись (Base64): {decoded_hash_code}")
|
| 1050 |
-
logging.debug(f"Полученная подпись из запроса: {
|
| 1051 |
|
| 1052 |
-
|
| 1053 |
-
return query.get("sign") == decoded_hash_code
|
| 1054 |
|
| 1055 |
# Чтение ордера по ключу и ВК ИД для приложения
|
| 1056 |
@app.route('/get_order', methods=['POST'])
|
|
@@ -1059,13 +1062,13 @@ def get_order():
|
|
| 1059 |
logging.debug("Начало обработки запроса get_order")
|
| 1060 |
|
| 1061 |
# Чтение параметров из POST-запроса
|
|
|
|
| 1062 |
vkid = request.form.get('vk_id', '')
|
| 1063 |
order = request.form.get('order', '')
|
| 1064 |
-
apps_id = request.form.get('apps_id', '')
|
| 1065 |
-
fullUrl = request.form.get('fullUrl', '')
|
| 1066 |
|
| 1067 |
# Логирование параметров запроса
|
| 1068 |
-
logging.debug(f"Полученные параметры: vk_id: {vkid}, order: {order}, apps_id: {apps_id}
|
| 1069 |
|
| 1070 |
# Получение ключей приложения
|
| 1071 |
api_key_apps_vk_dict = json.loads(api_key_apps_vk)
|
|
@@ -1077,8 +1080,8 @@ def get_order():
|
|
| 1077 |
return jsonify({"error": "Secret key not found for app ID"}), 400
|
| 1078 |
|
| 1079 |
# Проверка подписи
|
| 1080 |
-
if not is_valid(
|
| 1081 |
-
logging.error(f"Неверная подпись для запроса: {
|
| 1082 |
return jsonify({"error": "Invalid signature"}), 400
|
| 1083 |
|
| 1084 |
# Проверка наличия vk_id и order
|
|
@@ -1123,6 +1126,34 @@ def get_order():
|
|
| 1123 |
|
| 1124 |
|
| 1125 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1126 |
|
| 1127 |
|
| 1128 |
|
|
|
|
| 1025 |
|
| 1026 |
|
| 1027 |
# Функция для валидации подписи ВКонтакте
|
| 1028 |
+
# Функция для валидации подписи ВКонтакте
|
| 1029 |
+
def is_valid(*, full_url: str, secret: str) -> bool:
|
| 1030 |
"""Проверка подписи ВКонтакте"""
|
| 1031 |
+
# Разбираем URL
|
| 1032 |
+
parsed_url = urlparse(full_url)
|
| 1033 |
query_params = parse_qs(parsed_url.query)
|
| 1034 |
|
| 1035 |
+
# Извлекаем параметры, начинающиеся с "vk_" и исключаем "sign"
|
| 1036 |
+
vk_subset = {k: v[0] for k, v in query_params.items() if k.startswith("vk_") and k != "sign"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1037 |
|
| 1038 |
+
# Сортируем параметры по алфавиту
|
| 1039 |
+
vk_subset_sorted = sorted(vk_subset.items())
|
| 1040 |
|
| 1041 |
+
# Формируем строку для подписи
|
| 1042 |
+
data_to_sign = urlencode(vk_subset_sorted, doseq=True)
|
| 1043 |
+
|
| 1044 |
+
# Создаем подпись
|
| 1045 |
+
hash_code = b64encode(HMAC(secret.encode(), data_to_sign.encode(), sha256).digest()).decode('utf-8')
|
| 1046 |
decoded_hash_code = hash_code[:-1].replace('+', '-').replace('/', '_')
|
| 1047 |
|
| 1048 |
+
# Получаем подпись из параметра "sign"
|
| 1049 |
+
received_sign = query_params.get('sign', [None])[0]
|
| 1050 |
+
|
| 1051 |
+
# Логирование для отладки
|
| 1052 |
logging.debug(f"Строка для подписи: {data_to_sign}")
|
| 1053 |
logging.debug(f"Вычисленная подпись (Base64): {decoded_hash_code}")
|
| 1054 |
+
logging.debug(f"Полученная подпись из запроса: {received_sign}")
|
| 1055 |
|
| 1056 |
+
return received_sign == decoded_hash_code
|
|
|
|
| 1057 |
|
| 1058 |
# Чтение ордера по ключу и ВК ИД для приложения
|
| 1059 |
@app.route('/get_order', methods=['POST'])
|
|
|
|
| 1062 |
logging.debug("Начало обработки запроса get_order")
|
| 1063 |
|
| 1064 |
# Чтение параметров из POST-запроса
|
| 1065 |
+
fullUrl = request.form.get('fullUrl', '') # Получаем полный URL из запроса
|
| 1066 |
vkid = request.form.get('vk_id', '')
|
| 1067 |
order = request.form.get('order', '')
|
| 1068 |
+
apps_id = request.form.get('apps_id', '')
|
|
|
|
| 1069 |
|
| 1070 |
# Логирование параметров запроса
|
| 1071 |
+
logging.debug(f"Полученные параметры: vk_id: {vkid}, order: {order}, apps_id: {apps_id}")
|
| 1072 |
|
| 1073 |
# Получение ключей приложения
|
| 1074 |
api_key_apps_vk_dict = json.loads(api_key_apps_vk)
|
|
|
|
| 1080 |
return jsonify({"error": "Secret key not found for app ID"}), 400
|
| 1081 |
|
| 1082 |
# Проверка подписи
|
| 1083 |
+
if not is_valid(full_url=fullUrl, secret=secret_key):
|
| 1084 |
+
logging.error(f"Неверная подпись для запроса: {fullUrl}")
|
| 1085 |
return jsonify({"error": "Invalid signature"}), 400
|
| 1086 |
|
| 1087 |
# Проверка наличия vk_id и order
|
|
|
|
| 1126 |
|
| 1127 |
|
| 1128 |
|
| 1129 |
+
|
| 1130 |
+
|
| 1131 |
+
|
| 1132 |
+
|
| 1133 |
+
|
| 1134 |
+
|
| 1135 |
+
|
| 1136 |
+
|
| 1137 |
+
|
| 1138 |
+
|
| 1139 |
+
|
| 1140 |
+
|
| 1141 |
+
|
| 1142 |
+
|
| 1143 |
+
|
| 1144 |
+
|
| 1145 |
+
|
| 1146 |
+
|
| 1147 |
+
|
| 1148 |
+
|
| 1149 |
+
|
| 1150 |
+
|
| 1151 |
+
|
| 1152 |
+
|
| 1153 |
+
|
| 1154 |
+
|
| 1155 |
+
|
| 1156 |
+
|
| 1157 |
|
| 1158 |
|
| 1159 |
|