AMAX登录签名

签名字符串


//  签名字符串一般为固定说明+随机字符串。
// 为什么要+随机字符串?防止所有签名是相同的。
const signatureString = "用户登录"  + new Date()
or

// GMFZSJZCQYYS是随机出的字符串
const signatureString =  "Welcome to NFT One! Click \"Sign\" to sign in. No password needed! I accept the NFT One Terms of Service GMFZSJZCQYYS"

获取签名公钥


这个比较麻烦,因为无法通过一个用户名直接获取私钥对应的publicKey。比如:用户frank12345oo,私钥5Kfs388vr6TM8oMsCd4xfkqsR9132nw9TWfpma7NNfRzvM*******的公钥是AM6aZPsm846vGvf96gRpEoKUYadvaC53i6RQHchuQxn9Dy8FqWPH。但通过getAccount查出的数据是

{
   // ...
    "permissions": [
        {
            "perm_name": "active",
            "parent": "owner",
            "required_auth": {
                "threshold": 1,
                "keys": [
                    {
                        "key": "AM5cizvBZobd1rNhw5N89wuqevzZbLxk2x6QZQVWvFdg3uTFpEJV",
                        "weight": 1
                    },
                    {
                        "key": "AM6aZPsm846vGvf96gRpEoKUYadvaC53i6RQHchuQxn9Dy8FqWPH",
                        "weight": 1
                    }
                ],
                "accounts": [],
                "waits": []
            }
        },
        {
            "perm_name": "owner",
            "parent": "",
            "required_auth": {
                "threshold": 1,
                "keys": [
                    {
                        "key": "AM6aZPsm846vGvf96gRpEoKUYadvaC53i6RQHchuQxn9Dy8FqWPH",
                        "weight": 1
                    }
                ],
                "accounts": [],
                "waits": []
            }
        }
    ]
}

查到的active权限对应的公钥有两个,如果这时用AM5cizvBZobd1rNhw5N89wuqevzZbLxk2x6QZQVWvFdg3uTFpEJV去签名,那肯定是不对的,因为它不是私钥对应的公钥,它只是有操作这个帐户active权限的另一个帐户的公钥。

那么如何用正确的公钥去签名?答案是遍历所有公钥去签名,对的那个就是正确的,如果都不对,那么登录失败。

实现如下:

注意: APP与插件签名逻辑是: 先验证publicKey与私钥对应的公钥是否相等,如果不一样,直接报402错,弹窗都不会出现。 如果一样,则出现弹窗,继续往下操作… 但是,APP1.2.4 以及之前,是没有publicKey判断的,签名都会有弹框,也会正常的返回。 1.2.4之后,就会加上publicKey判断。所以dapp如果存在逻辑问题可能会报错。

欢迎提出更好的建议或者方法。理解逻辑才能走得更远,代码才会写得更为优雅。

最后更新于