前言
我们将使用以太坊来处理身份验证的问题。我们在这里所给出的是与区块链身份验证技术相关的典型问题。比特币自2009 年问世以来,以其去中心化的、安全的货币交易理念惊艳了整个世界。以太坊的概念不仅仅只是数字化货币,它通过与图灵完备的智能合约相结合赋能了去中心化的交易模式。在这篇文章,我们联手Ivo Zieliński,Konrad Kozioł,David Belinchon,和来自GFT创新团队的Nicolás González为以太坊用户开发了一套可实现的基于以太坊的登录系统。这是一个理想的登录系统,它能够允许任何以太坊用户在不必使用其私钥的情况下,证明自己的以太坊帐户的所有权,就像他们登录到Facebook一样。
介绍
我们先来看看用户是如何登录到一个简单的系统上的:
1. 一个用户浏览到一个需要登录的第三方网站。该网站要求用户在文本区域内输入以太坊地址。
2. 用户输入其以太坊地址,并单击"登录"。
3. 后端的第三方生成一个挑战字符串,并且签发一个JWT(Json webtoken),该挑战字符串被嵌入其中。
4. 由于login合约已在以太坊上可用了,用户可以直接将挑战字符串发送给login的方法。
5. 后端持续观察以太坊网络,是否出现由以太坊地址所有者在步骤2中所输入的并且被发送过来的挑战字符串。
6. 如果在合理的时间内,后端监测到挑战字符串,则用来自步骤2的以太坊地址作为标识,将该用户标记为登录成功的状态。一个新的带有完整地址的JWT随即会被发布给第三方网站。
不过上述这种方法存在着一系列的问题:
要确保用户的以太坊地址与身份验证过程相独立,系统会生成一个完全不同的、仅作身份验证的以太坊地址。该地址通过使用以太坊合约与用户的以太坊地址相关联。换句话说,用户的以太坊地址和系统仅作登录用的地址之间的映射关系会被建立。这种映射在合约的帮助下被存储在以太坊的区块链内。
pragmasolidity ^0.4.2;contractMapper { event AddressMapped(address primary,address secondary); event Error(uint code, address sender); mapping (address => address) publicprimaryToSecondary; mapping (address => bool) publicsecondaryInUse; modifiersecondaryAddressMustBeUnique(address secondary) { if(secondaryInUse[secondary]) { Error(1, msg.sender); throw; } _; } function mapAddress(address secondary) secondaryAddressMustBeUnique(secondary){ // If there is no mapping, this doesnothing secondaryInUse[primaryToSecondary[msg.sender]] = false; primaryToSecondary[msg.sender] =secondary; secondaryInUse[secondary] = true; AddressMapped(msg.sender, secondary); }}