集成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