Facebook Instant Games - проверка подписи - PullRequest
0 голосов
/ 15 января 2020

В настоящее время я разрабатываю мгновенную игру 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);
    }
...