x7f

Sign Check

x7f
Sep 9th, 2020 (edited)
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const fastify = require('fastify')({
  2.   logger: true
  3. });
  4. const crypto = require('crypto');
  5.  
  6. /* По вопросам улучшения: https://vk.com/devgg */
  7.  
  8. const key = '********************'; // секретный ключ из настроек приложения
  9.  
  10. const chars = { // перечень символов, которые надо заменять
  11.   '+': '-',
  12.   '/': '_',
  13.   '=': '',
  14. };
  15.  
  16. const checkSign = (params) => { // алгоритм проверки подписи
  17.   const paramsSign = params.sign;
  18.   const sortedParams = Object.keys(params).sort().reduce((r, k) => (k.substr(0,3)==='vk_'&&(r[k] = params[k]), r), {});
  19.   const sortedParamsString = Object.keys(sortedParams).map((key) => key + '=' + sortedParams[key]).join('&');
  20.   const rawSign = crypto.createHmac('sha256', key).update(sortedParamsString).digest('base64');
  21.   const sign = rawSign.replace(/\+|\/|=$/gi, (char) => chars[char]);
  22.   return sign === paramsSign;
  23. }
  24.  
  25. fastify.addHook('onRequest', (request, reply, done) => { // hook, который будет проверять запросы перед их приходом
  26.   reply.headers({
  27.     'Access-Control-Allow-Origin': '*',
  28.     'Access-Control-Allow-Headers': '*',
  29.   })
  30.   if (!checkSign(request.query)) { // передаём данные для проверки и смотрим, что бы они были валидны
  31.     reply.code(401).send({error:{code:23,msg:'Подпись не действительна'}}) // иначе возвращаем ошибку
  32.   }
  33.   done();
  34. })
Add Comment
Please, Sign In to add comment