В настоящее время я разрабатываю мгновенную игру Facebook, которая будет взаимодействовать с внешним сервером, на котором будет запущено приложение в C#. Как часть этого, я понимаю, что важно проверить «подпись» пользователей. Эта подпись объясняется в разделе «getSignature» здесь . Я нашел приведенный ниже код Node.JS, который, по-видимому, работает, поэтому я пытаюсь преобразовать его в C#, но у меня ничего не получается - проверка на равенство завершается неудачно. Что я делаю не так?
Node JS код
var validate = function(signedRequest) {
// You can set USE_SECURE_COMMUNICATION to false in the .env file to bypass validation
// while doing local testing and using the FBInstant mock SDK.
if (process.env.USE_SECURE_COMMUNICATION == false){
console.log('Not validating signature')
return true;
}
try{
var firstpart = signedRequest.split('.')[0];
var replaced = firstpart.replace(/-/g, '+').replace(/_/g, '/');
var signature = crypto.enc.Base64.parse(replaced).toString();
const dataHash = crypto.HmacSHA256(signedRequest.split('.')[1], process.env.APP_SECRET).toString();
var isValid = signature === dataHash;
if (!isValid) {
console.log('Invalid signature');
console.log('Expected', dataHash);
console.log('Actual', signature);
}
return isValid;
} catch (e) {
return false;
}
};
C# код
public static bool ValidateSignature(string signature)
{
if (signature == null)
throw new ArgumentNullException(nameof(signature));
var split = signature.Split('.');
var firstPart = split[0];
var converted = firstPart.Base64Decode();
using (var hasher = new HMACSHA256(Encoding.Unicode.GetBytes(ConfigurationManager.AppSettings["APPSECRET"])))
{
return Encoding.Unicode.GetString(converted) == Encoding.Unicode.GetString(hasher.ComputeHash(split[1].Base64Decode()));
}
}
public static byte[] Base64Decode(this string base64EncodedData)
{
var replaced = base64EncodedData.Replace("-", "+").Replace("_", "/");
switch (base64EncodedData.Length % 4)
{
case 2: replaced += "=="; break;
case 3: replaced += "="; break;
}
return System.Convert.FromBase64String(replaced);
}