查看原文
其他

Internet Identity(II)的设计和实现:第三篇

tinywateer ICPL 2022-06-09


本期概要

在本系列的前两篇文章中【Internet Identity(II)的设计和实现:第一篇Internet Identity(II)的设计和实现:第二篇】,介绍了Internet Identity (II) 的初步设计和后端核心代码,这篇文章将介绍 II 的前端部分。


说到前端,主要是 Agent-JS(https://github.com/dfinity/agent-js),在 IC 上开发 DApp 必须要用到这个库。

Agent-JS 简单来说,是这样:

  1. Ed25519:生成公私钥对,实现 SignIdentity

  2. Auth Client:请求 II 生成 DelegationIdentity,它提供 transformRequest 方法进行签名

  3. Http Agent :封装 DelegationIdentity、提供 call、query、readState、status 通用函数

  4. 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。



Auth Client 的 login 代码


在 _getEventHandler 中,如果认证成功,会执行 _handleSuccess 函数,_handleSuccess 从返回的数据中提取 Delegation,从而生成 Identity。



_handleSuccess 函数


注意,服务端返回的 message.userPublicKey.buffer 是用户的 Identity 对应的公钥,不是临时公钥。

DelegationChain.fromDelegations 这部分代码在这里(https://github.com/dfinity/agent-js/blob/main/packages/identity/src/identity/delegation.ts),这也是核心代码。

也可以看图:


DelegationChain 函数


然后调用 DelegationIdentity.fromDelegation 传入 公私钥对(key)、DelegationChain 生成 DelegationIdentity。

具体见:



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




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存