C#检查Telegram登录HMAC

3
我尝试在我的项目中实现Telegram登录小部件,但遇到了问题。我不知道为什么,但我从Telegram收到的哈希值与我计算的哈希值(通过{{link1:Telegram教程}})不相等。我编写了自己的哈希计算方法,并尝试使用{{link2:Telegram登录小部件nuget包}},但两种方法都无法正常工作 :(。
我的哈希计算方法:
public class TelegramHmacTest
{
    private const string BotToken = "123:ABC";
    private const string ExpectedHash = "blablabla";
    
    [Fact]
    public void HmacTest()
    {
        var info = new Dictionary<string, string>
        {
            {"auth_date", "1234567"},
            {"first_name", "abc"},
            {"id", "123456"},
            {"photo_url", "https://t.me/i/userpic/...jpg"},
            {"username", "usr"},
        };

        var dataString = CombineString(info);
        var computedHash = HashHMAC(dataString);

        Assert.Equal(ExpectedHash, computedHash.ToLower());
    }

    private string HashHMAC(string message)
    {
        using var hasher = SHA256.Create();
        var keyBytes = hasher.ComputeHash(Encoding.UTF8.GetBytes(BotToken));

        var messageBytes = Encoding.UTF8.GetBytes(message);
        var hash = new HMACSHA256(keyBytes);
        var computedHash = hash.ComputeHash(messageBytes);
        return Convert.ToHexString(computedHash);
    }

    private string CombineString(IReadOnlyDictionary<string, string> meta)
    {
        var builder = new StringBuilder();

        TryAppend("auth_date");
        TryAppend("first_name");
        TryAppend("id");
        TryAppend("last_name");
        TryAppend("photo_url");
        TryAppend("username", true);

        return builder.ToString();

        void TryAppend(string key, bool isLast = false)
        {
            if (meta.ContainsKey(key))
                builder.Append($"{key}={meta[key]}{(isLast ? "" : "\n")}");
        }
    }
}

使用库计算哈希:

[Fact]
    public void TestLib()
    {
        var BotToken = "123:ABC";
        var info = new Dictionary<string, string>
        {
            {"auth_date", "1234567"},
            {"first_name", "abc"},
            {"id", "123456"},
            {"photo_url", "https://t.me/i/userpic/...jpg"},
            {"username", "usr"},
        };

        var loginWidget = new LoginWidget(BotToken);
        if (loginWidget.CheckAuthorization(info) == Authorization.Valid)
        {
            // user valid
        }
    }

也许有人遇到了类似的问题?

1
你尝试过运行官方的PHP示例吗?https://gist.github.com/anonymous/6516521b1fb3b464534fbc30ea3573c2 - jurilents
1
我检查了你的代码。它可以正常工作。它的结果与Nuget库的工作结果相符。 - FreeVice
2
@FreeVice 非常感谢,但问题出在另一个地方。在 Telegram 登录小部件文档中没有提到您必须在 BotFather 中为您的机器人注册域名。此外,我发现您只能注册 https 域和 'http://127.0.0.1' 用于测试。就像这样 :) - tweeker
1个回答

2
问题出在我没有在BotFather中注册域名。在Telegram登录小部件文档中,没有提到你必须在BotFather中为你的机器人注册域名。此外,我发现你只能注册https域名和'127.0.0.1'进行测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接