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
330KB
2K SLoC
ic_siwe
是一个 Rust 库,它简化了将基于以太坊钱包的身份验证与互联网计算机(ICP)平台上的应用程序集成的过程。该库提供从生成 SIWE 消息到创建代表身份的所有必需工具。
ic_siwe
是 ic-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-before
、request-id
、resources
- 未实现。这些字段在 SIWE 标准中被标记为“可选”,对于当前实现不是必需的。
登录流程
使用 ic_siwe
创建代表身份的三步过程包括以下步骤
- 准备登录
- 登录
- 获取委托
实现 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
- 在登录成功后,前端应用程序会调用
siwe_get_delegation
方法。该方法接受委托过期时间作为参数,并返回一个委托。 siwe_get_delegation
方法在ic_siwe
库中没有对应的函数。创建委托身份需要设置信标机的认证数据。这不应该由库来完成,而应该由实现信标机的部分完成。- 创建委托身份涉及到与以下
ic_siwe
函数的交互:delegation::generate_seed
,delegation::create_delegation
,delegation::create_delegation_hash
,delegation::witness
,delegation::create_certified_signature
。 - 有关完整实现示例,请参阅
ic_siwe_provider
信标机。
更新
有关更新详情,请参阅 CHANGELOG。
贡献
欢迎贡献。请提交您的 pull 请求或打开问题来提出更改或报告错误。
作者
- [email protected]
- Twitter: @kristoferlund
- Discord: kristoferkristofer
- Telegram: @kristoferkristofer
许可
本项目采用 MIT 许可证。有关更多详细信息,请参阅 LICENSE 文件。
依赖项
~8–19MB
~270K SLoC