#互联网计算机 #以太坊 #钱包 #身份验证 #siwe

ic_siwe

通过互联网计算机(ICP)平台将基于以太坊钱包的身份验证(SIWE)与应用程序集成

6 个版本

新版本 0.1.0 2024 年 8 月 22 日
0.0.7 2024 年 7 月 5 日
0.0.6 2024 年 3 月 25 日
0.0.5 2024 年 2 月 22 日
0.0.4 2024 年 1 月 31 日

#互联网计算机 中排名 23

每月下载次数 39

MIT 许可证 MIT

330KB
2K SLoC

Sign in with Ethereum for the Internet Computer

Crate Docs

ic_siwe 是一个 Rust 库,它简化了将基于以太坊钱包的身份验证与互联网计算机(ICP)平台上的应用程序集成的过程。该库提供从生成 SIWE 消息到创建代表身份的所有必需工具。

ic_siweic-siwe 项目的一部分。该项目旨在增强以太坊与互联网计算机平台之间的互操作性,使开发者能够构建利用两个平台优势的应用程序。

https://youtu.be/lQV4Otp6Y_s?si=pcDgTenV98JabV9r&t=95

主要特性

  • 以太坊钱包登录:为 ICP 应用程序提供以太坊钱包登录功能。使用任何 eth 钱包登录以生成 ICP 身份和会话。
  • 会话身份唯一性:确保会话身份针对每个应用程序的上下文特定,防止跨应用程序身份误用。
  • 一致的主体生成:保证使用以太坊钱包登录始终生成相同的主体,无论使用哪个客户端。
  • 直接以太坊地址到主体的映射:在当前应用程序范围内创建以太坊地址与主体之间的一对一关联。
  • 时间限制的会话:允许开发者设置会话的过期时间,增强安全和控制。

目录

预构建的 ic_siwe_provider 罐头

虽然 ic_siwe 库可以与任何基于 Rust 的 ICP 项目集成,但使用预先构建的 ic-siwe-provider canister 是将以太坊钱包身份验证集成到您的应用程序中最简单的方法。

该 canister 设计为开发人员的即插即用解决方案,使得现有的 ICP 应用程序能够以最少的编码需求轻松集成。通过将预构建的 ic_siwe_provider canister 添加到 ICP 项目的 dfx.json 中,开发人员可以快速启用基于以太坊钱包的应用程序身份验证。该 canister 通过管理 SIWE 消息的创建和验证以及处理用户会话管理来简化身份验证流程。

React 演示应用程序

一个使用 ic_siwe_provider canister 来演示完整登录流程的演示应用程序可在 ic-siwe-react-demo-rust 找到。该演示使用来自 ic-siwe 项目的另一个包,即 ic-use-siwe-identity,这是一个 React 钩子和上下文提供程序,可轻松实现与启用 SIWE 的 Internet Computer canister 的前端集成。

SIWE 标准

ERC-4361: Sign-In with Ethereum - 为以太坊账户建立会话的链下身份验证

SIWE 标准定义了一种用于以太坊账户链下身份验证的协议。该协议旨在使应用程序能够在其他平台(如 Internet Computer)上实现基于以太坊钱包的身份验证。该协议的核心是 SIWE 消息,这是一种包含用户以太坊地址和一些附加元数据的签名消息。SIWE 消息由用户的以太坊钱包签名,然后发送到应用程序的后端。后端验证签名和以太坊地址,然后为用户创建会话。

ic_siwe 实现了 SIWE 标准的大部分内容,但有一些显著的例外

  • not-beforerequest-idresources - 未实现。这些字段在 SIWE 标准中被标记为“可选”,对于当前实现不是必需的。

登录流程

使用 ic_siwe 创建代表身份的三步过程包括以下步骤

  1. 准备登录
  2. 登录
  3. 获取委托

实现 canister 可以根据自己的需求以任何方式实现这些步骤。然而,建议实现 canister 遵循以下描述的登录流程并实现 SIWE canister 接口。这样做可以确保 canister 与 ic-use-siwe-identity React 钩子和上下文提供程序兼容。

登录流程如下所示

                                ┌────────┐                                        ┌────────┐                              ┌─────────┐
                                │Frontend│                                        │Canister│                              │EthWallet│
   User                         └───┬────┘                                        └───┬────┘                              └────┬────┘
    │      Push login button       ┌┴┐                                                │                                        │
    │ ────────────────────────────>│ │                                                │                                        │
    │                              │ │                                                │                                        │
    │                              │ │          siwe_prepare_login(eth_address)      ┌┴┐                                       │
    │                              │ │ ─────────────────────────────────────────────>│ │                                       │
    │                              │ │                                               └┬┘                                       │
    │                              │ │                OK, siwe_message                │                                        │
    │                              │ │ <─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─                                        │
    │                              │ │                                                │                                        │
    │                              │ │                                   Sign siwe_message                                    ┌┴┐
    │                              │ │ ──────────────────────────────────────────────────────────────────────────────────────>│ │
    │                              │ │                                                │                                       │ │
    │                              │ │                  Ask user to confirm           │                                       │ │
    │ <───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ │
    │                              │ │                                                │                                       │ │
    │                              │ │                          OK                    │                                       │ │
    │  ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ >│ │
    │                              │ │                                                │                                       └┬┘
    │                              │ │                                      OK, signature                                      │
    │                              │ │ <─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
    │                              │ │                                                │                                        │
    │                              │ │────┐                                           │                                        │
    │                              │ │    │ Generate random session_identity          │                                        │
    │                              │ │<───┘                                           │                                        │
    │                              │ │                                                │                                        │
    │                              │ │             siwe_login(eth_address,            │                                        │
    │                              │ │          signature, session_identity)         ┌┴┐                                       │
    │                              │ │ ─────────────────────────────────────────────>│ │                                       │
    │                              │ │                                               │ │                                       │
    │                              │ │                                               │ │────┐                                  │
    │                              │ │                                               │ │    │ Verify signature and eth_address │
    │                              │ │                                               │ │<───┘                                  │
    │                              │ │                                               │ │                                       │
    │                              │ │                                               │ │────┐                                  │
    │                              │ │                                               │ │    │ Prepare delegation               │
    │                              │ │                                               │ │<───┘                                  │
    │                              │ │                                               └┬┘                                       │
    │                              │ │     OK, canister_pubkey, delegation_expires    │                                        │
    │                              │ │ <─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─                                        │
    │                              │ │                                                │                                        │
    │                              │ │     siwe_get_delegation(delegation_expires)   ┌┴┐                                       │
    │                              │ │ ─────────────────────────────────────────────>│ │                                       │
    │                              │ │                                               └┬┘                                       │
    │                              │ │                 OK, delegation                 │                                        │
    │                              │ │ <─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─                                        │
    │                              │ │                                                │                                        │
    │                              │ │────┐                                           │                                        │
    │                              │ │    │ Create delegation identity                │                                        │
    │                              │ │<───┘                                           │                                        │
    │                              └┬┘                                                │                                        │
    │ OK, logged in with            │                                                 │                                        │
    │ Principal niuiu-iuhbi...-oiu  │                                                 │                                        │
    │ <─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─                                                  │                                        │
  User                          ┌───┴────┐                                        ┌───┴────┐                              ┌────┴────┐
                                │Frontend│                                        │Canister│                              │EthWallet│
                                └────────┘                                        └────────┘                              └─────────┘

siwe_prepare_login

  • siwe_prepare_login 方法由前端应用程序调用以启动登录流程。该方法接受用户的以太坊地址作为参数,并返回一个包含 nonce 的 SIWE 消息。前端应用程序使用 SIWE 消息提示用户使用他们的以太坊钱包签名消息。
  • 见:login::prepare_login

siwe_login

  • siwe_login 方法在用户已签名 SIWE 消息后由前端应用程序调用。该方法接受用户的以太坊地址、签名、会话身份和 nonce 作为参数。该方法验证签名和以太坊地址,并为下一个步骤(即 siwe_get_delegation 函数)准备委托。
  • 参见: login::login

siwe_get_delegation

更新

有关更新详情,请参阅 CHANGELOG

贡献

欢迎贡献。请提交您的 pull 请求或打开问题来提出更改或报告错误。

作者

许可

本项目采用 MIT 许可证。有关更多详细信息,请参阅 LICENSE 文件。

依赖项

~8–19MB
~270K SLoC