Internet Identity(II)的设计和实现:第三篇
本期概要
在本系列的前两篇文章中【Internet Identity(II)的设计和实现:第一篇;Internet Identity(II)的设计和实现:第二篇】,介绍了Internet Identity (II) 的初步设计和后端核心代码,这篇文章将介绍 II 的前端部分。
说到前端,主要是 Agent-JS(https://github.com/dfinity/agent-js),在 IC 上开发 DApp 必须要用到这个库。
Agent-JS 简单来说,是这样:
Ed25519:生成公私钥对,实现 SignIdentity
Auth Client:请求 II 生成 DelegationIdentity,它提供 transformRequest 方法进行签名
Http Agent :封装 DelegationIdentity、提供 call、query、readState、status 通用函数
Actor:封装 IDL、Http Agent、Canister ID 等生成直接请求后端函数的 Actor
具体的代码还是挺多的,这里不一一列举。
只讲讲 Auth Client 和 DelegationIdentity 的部分。
Auth Client 的核心代码在这里(https://github.com/dfinity/agent-js/blob/main/packages/auth-client/src/index.ts),也可以看下面的图。
可以看到,使用 Ed25519 生成一对临时的公私钥对,默认有效时间 8 小时,并绑定了 _getEventHandler。
在 _getEventHandler 中,如果认证成功,会执行 _handleSuccess 函数,_handleSuccess 从返回的数据中提取 Delegation,从而生成 Identity。
注意,服务端返回的 message.userPublicKey.buffer 是用户的 Identity 对应的公钥,不是临时公钥。
DelegationChain.fromDelegations 这部分代码在这里(https://github.com/dfinity/agent-js/blob/main/packages/identity/src/identity/delegation.ts),这也是核心代码。
也可以看图:
然后调用 DelegationIdentity.fromDelegation 传入 公私钥对(key)、DelegationChain 生成 DelegationIdentity。
具体见:
注意,DelegationIdentity 中的 getPublicKey 返回的是用户身份的公钥,不是临时公钥。
DelegationIdentity 还提供了 sign 函数,通过临时的私钥对请求进行签名,发送给后端。
具体的签名动作是在 transformRequest 函数中,每次发送请求都会执行 transformRequest,后端会验证 Delegation 是否正确。
transformRequest 中的 sender_pubkey 就是用户身份的公钥,在 DApp 中可以拿到并使用。
作者:tinywateer
原文链接:
https://mirror.xyz/0xFd007bb46C47D8600C139E34Df9DfceC86F0B319/Ie5xWUPQ0w1rLGk_GtLNM7UOXs_IJH-U59xXt5RAm-o
小助手微信号
入群请添加
联系我们
ICPL 官网
https://icpl.app
ICPL Twitter
https://twitter.com/icpleague_com
ICPL Medium
https://medium.com/icp-league
ICPL Telegram
https://t.me/ICPL_en
ICPL 论坛
https://icpleague.com