· 6 years ago · Jun 17, 2019, 05:28 PM
1const validateAppUrl = (url, secret_key) => {
2 // достаем параметры из url
3 const query_params = url.slice(url.indexOf("?") + 1).split("&").reduce((a, x) => {
4 const data = x.split("=");
5 a[decodeURIComponent(data[0])] = decodeURIComponent(data[1]);
6 return a;
7 }, {});
8
9 // выбираем нужные (с приставкой "vk_") и сортируем их
10 const sign_params = {};
11 Object.keys(query_params).sort()
12 .forEach((key) => {
13 if(!key.startsWith("vk_")) return;
14 sign_params[key] = query_params[key];
15 });
16
17 // образуем строку вида param1=value1¶m2=value2...
18 const sign_str = Object.keys(sign_params).reduce((a, x) => {
19 a.push(x + "=" + sign_params[x]);
20 return a;
21 }, []).join("&");
22
23 // подписываем
24 let sign = require("crypto").createHmac("sha256", secret_key).update(sign_str);
25 sign = sign.digest("binary");
26 sign = require("buffer").Buffer.from(sign, "binary").toString("base64");
27 sign = sign.split("+").join("-");
28 sign = sign.split("/").join("_");
29 sign = sign.replace(/=+$/, '');
30
31 // сравниваем подпись с оригинальной. если все окей, то возвращаем id пользователя, если нет - null
32 return sign === query_params["sign"] ? query_params["vk_user_id"] : null;
33};