在我们掌握了DID的基础知识(还没有掌握DID基础知识?请先阅读我之前的关于DID的文章),构建DID平台的时候,DID的常见应用就是基于DID实现第三方平台的登录。接下来,我们假设已经构建了一个基础的DID平台,用长安链实现了DID文档的链上管理,并提供了DID钱包托管用户的公私钥和VC证书,建设全新的第三方系统实现DID登录。
我们已经建设了一个DID分布式身份的应用,为每个用户颁发了DID,对应的DID文档也上到了一条区块链(比如长安链)上。每个用户有自己的DID钱包(可以是浏览器插件钱包,也可以是手机APP钱包),在DID钱包中保存了用户的公私钥、DID和各种颁发的证书VC信息。
现在我们要建一个新的服务系统,并希望使用DID进行登录,类似于网上的使用Google账号登录或者微信扫码登录这样的OAuth登录,只要是在长安链上有颁发了身份的用户,都可以通过其DID钱包进行登录。
以下是一个简化版的DID钱包登录流程,并以浏览器插件钱包为例:
1.用户在第三方应用上发起登录请求。 2.第三方应用后端生成一个随机数(nonce)并发送给钱包浏览器插件。 3.钱包浏览器插件使用用户的DID私钥对随机数进行签名,并将签名和用户的DID一起发送给第三方应用后端。 4.第三方应用后端将签名和DID发送给DID合约进行验证。 5.DID合约查询区块链上的DID文档,获取DID的公钥,并使用公钥验证签名。如果验证成功,返回用户的身份信息给第三方应用后端。 6.第三方应用后端根据返回的身份信息,完成用户的登录或注册操作,并返回登录结果给用户。
以下是对应的时序图:
sequenceDiagram 用户->>应用前端: 发起登录请求 应用前端->>应用后端: 请求随机数(nonce) 应用后端->>应用前端: 返回随机数(nonce) 应用前端->>钱包插件: 发送随机数(nonce) 用户->>钱包插件: 用DID私钥签名nonce 钱包插件->>应用前端: 发送签名和用户DID 应用前端->>应用后端: 请求验证签名和用户DID 应用后端->>DID合约: 发送签名和用户DID进行验证 DID合约->>应用后端: 查询链上DID文档,返回验证结果和身份信息 应用后端->>应用前端: 返回验证结果和身份信息 应用前端->>用户: 返回登录结果
有些应用并不是任何获得了DID身份的用户就能够登录的,比给企业T做一个员工福利网站,只有企业T的员工才能正常登录。所以我们需要基于VC(可验证凭证)和VP(可验证表示)的DID登录。
前置条件是企业T已经作为颁证机构,给自己企业的员工都颁发了员工卡VC,员工在登录网站的时候,需要出示该员工卡VC,验证VC通过才能正常登录。流程如下:
sequenceDiagram 用户->>应用前端: 发起登录请求 应用前端->>应用后端: 请求随机数(nonce)和VC类型 应用后端->>应用前端: 返回随机数(nonce)和VC类型 应用前端->>钱包插件: 发送随机数(nonce)和VC类型 钱包插件->>用户: 选择相应的VC 用户->>钱包插件: 用DID私钥签名VP 钱包插件->>应用前端: 发送签名的VP 应用前端->>应用后端: 请求验证VP和VC 应用后端->>DID合约: 发送VP和VC进行验证 DID合约->>应用后端: 返回验证结果和身份信息 应用后端->>应用前端: 返回验证结果和身份信息 应用前端->>用户: 返回登录结果
基于DID进行登录相对于互联网的OAuth登录有以下优势: