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如果存在逻辑问题可能会报错。
欢迎提出更好的建议或者方法。理解逻辑才能走得更远,代码才会写得更为优雅。
最后更新于