Skip to main content

DAPP登陆认证方案

登陆流程

image.png

@startuml
actor User
participant dApp
participant Wallet
participant Server

User -> dApp: 打开dApp
dApp -> Wallet: 请求连接钱包
Wallet -> User: 请求确认连接
User -> Wallet: 确认连接
Wallet -> dApp: 返回钱包地址

dApp -> Server: 请求挑战信息(address)
Server -> Server: 生成随机挑战信息(nonce)
Server -> dApp: 返回挑战信息(nonce)

dApp -> Wallet: 请求签名挑战信息(nonce)
Wallet -> User: 请求签名
User -> Wallet: 签署nonce
Wallet -> dApp: 返回签名(signature)

dApp -> Server: 提交地址和签名(address, signature)
Server -> Server: 验证签名

alt 验证通过
    Server -> dApp: 返回token
else 验证失败
    Server -> dApp: 返回错误
end

dApp -> Server: 使用token访问受保护资源
Server -> Server: 验证token
Server -> dApp: 返回资源数据
@enduml

 

核心组件

钱包

管理夜莺网络等公链的地址组的资产和私钥。钱包管理的核心是私钥的管理,谁拥有私钥,谁拥有钱包,所以私钥不能泄漏。当用户需要操作自己的资产,不管是链上的通证,还是链下的资源都需要使用钱包的私钥签名确认后才可以操作。

中继器

当DAPP操作链下资源或者链上资产,就需要连接到钱包,这个过程需要借助其他服务来完成。这个服务不仅要能够传递消息在DAPP和钱包之间,还要自身保持开放和稳定,所以中继器本身应该是一个去中心化的网络。

令牌

在Web2的世界里,前后端通信的令牌主要是Jwt Token,后端之间通信的令牌主要是AK/SK,这种身份认证方式广泛存在于实际生产环境中,成熟且有效。如何通过钱包的私钥签名带时间戳的消息,实现令牌的动态创建和更新。

后台服务

使用钱包身份和后台服务交互,复用现有的令牌机制,需要后台服务理解这个令牌,同时遵守令牌的认证规则。


Relyer方案:

[前端] --签名消息--> [钱包] --签名--> [前端] --请求--> [中继服务] --验证&颁发Token--> [前端]

  1. 用户在前端发起请求
  2. 前端生成随机消息,要求用户用Web3钱包签名
  3. 前端将签名和钱包地址发送给后端
  4. 后端验证签名,颁发JWT Token
  5. 前端持Token访问后端受保护接口
  6. 后端校验Token,完成业务处理