ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-09-05 11:33:14  阅读:177  来源: 互联网

标签:accountaddress domain 链去 Web3.0 res self 签名 print 中心化


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有