其他分享
首页 > 其他分享> > 集成Web3.0区块链去中心化MetaMask统一认证

集成Web3.0区块链去中心化MetaMask统一认证

作者:互联网

Web3.0区块链:

去中心化:web3.0去中心化,个人隐私得到了极大的保护,但是交易是公开透明的,比如说我们几个在去中心化的区块链上,每个人占据一个网络节点,我们之间可以进行交易,但是交易记录是可以被查看的,比如我借了你钱没还,其他节点的人可以知道你不还钱,下次其他人就不会借给你钱了。区块链技术,是web3.0的驱动力

 

背景:这里我做的是MetaMask以太坊一键登录,现在各大平台,为了免注册流程,大多数登录都是选择Google,Github等社交登陆的方式,这种方式虽然节约了用户的时间,但是用户登陆的信息也会被第三方平台记录,也就说我们做了什么,第三方平台都会一目了然,甚至还会对我们的行为进行分析,画像。为了极大的保护用户隐私,使用的是MetaMask的三方登录,它的所有信息都只保存在客户端和后端,并不牵扯第三方平台授权,最大的保证用户隐私。

 

 流程:安装Metamask浏览器插件===>导入以太坊库ethers===>打开浏览器插件===>前端进行上链操作===>判断是否在公链===>获取当前用户的上链钱包地址===>加签操作===>到后端进行钱包地址+签名验签===>信息入库生成本站token

 

怎么做的:

前端点击MetaMask按钮,触发click事件,到声明登录激活的方法,在方法中先开启浏览器插件,声明实例过后上链,上链成功,列出所有的钱包列表,也就是当前连接的钱包,获取用户钱包地址,获取签名对象,通过时间戳拼接生成签名,通过axios方法请求后端,后端拿到签名进行验签,这里我写了一个checksign方法,在这里创建时间戳,生成签名,进行反编译获取签名对象,如果该签名对象等于钱包地址,就执行登陆的正常操作,若不一样,返回False

 

 1 class UserHandler(BaseMange):
 2 
 3     # 用户验签  metamask登录
 4     async def put(self):
 5 
 6         accountaddress = self.get_argument('accountaddress',None)
 7         signature = self.get_argument("signature",None)
 8         cate = self.get_argument('cate',None)
 9         print('cate>>>>',cate)
10 
11         res_sign = await self.checksign(accountaddress,signature)
12         print("aaaaaaaa",res_sign)
13 
14         if res_sign:
15             try:
16                 user = await self.create(UserModel,{"phone":accountaddress,"password":make_password('123'),"role":cate})
17             except Exception as e:
18                 print(str(e))
19 
20                 _where = "(model.phone == '{}' ) & (model.role == {})".format(accountaddress,cate)
21 
22                 user = await self.get_one_where(UserModel,_where)
23 
24 
25 
26             token = await self.makejwt({'id':user.id})
27 
28             res = {"errcode":0,'msg':'登陆成功',"token":token,"phone":user.phone}
29 
30             return self.finish(res)
31         else:
32             res = {"errcode": 1, 'msg': '你的钱包不合法'}
33 
34             return self.finish(res)

 

写checksign方法验签:

 1     async def checksign(self,accountaddress,signature):
 2 
 3         # 获取当前域名
 4         # print(self.request)
 5         domain = self.request.host
 6 
 7         print("@@@@",domain)
 8 
 9         if ":" in domain:
10             domain = domain[0:domain.index(":")]
11 
12         if domain == "localhost":
13             domain = "127.0.0.1"
14 
15         # 时间戳 默认秒
16         now = int(time.time())
17 
18         sortanow = now - now % 600
19 
20         # 生成签名
21         message = "Signing in to {} at {}".format(domain, sortanow)
22         print(message)
23 
24         # 反编译
25         message_hash = defunct_hash_message(text=message)
26 
27         # 获取签名对象
28         signer = w3.eth.account.recoverHash(message_hash, signature=signature)
29 
30         if accountaddress == signer:
31 
32             return True
33         else:
34             return False

 

 

 

 

标签:accountaddress,domain,链去,Web3.0,res,self,签名,print,中心化
来源: https://www.cnblogs.com/just23/p/16657489.html