14个版本
0.6.1 | 2024年2月29日 |
---|---|
0.6.0 | 2023年6月28日 |
0.5.2 | 2023年6月5日 |
0.5.0 | 2022年10月6日 |
0.0.0 | 2021年11月24日 |
#1318 in 魔法豆
12,748 每月下载量
用于 15 个crate(5个直接使用)
49KB
889 行
使用以太坊登录
此crate提供了一个纯Rust实现的EIP-4361:使用以太坊登录。
安装
SIWE可以通过将其包含在项目的cargo.toml
文件中轻松安装到任何Rust项目中
siwe = "0.6"
可用特性
serde
用于序列化/反序列化支持;ethers
用于支持符合EIP-1271的合约钱包;以及typed-builder
用于更友好的验证选项构建。
用法
SIWE公开了一个实现EIP-4361的Message
结构体。
解析SIWE消息
解析是通过Message
的FromStr
实现完成的。
let message: Message = string_message.parse()?;
验证和认证SIWE消息
验证和认证是通过EIP-191进行的,使用Message
的address
字段作为预期的签名者。这返回签名者的以太坊公钥
let signer: Vec<u8> = message.verify_eip191(&signature)?;
也可以在当前或特定时间验证时间限制(到期和开始时间)
if message.valid_now() { ... };
// equivalent to
if message.valid_at(&OffsetDateTime::now_utc()) { ... };
可以使用verify
在单个调用中执行时间限制和认证的联合验证
message.verify(&signature).await?;
SIWE消息的序列化
Message
实例也可以通过Message
的Display
实现序列化为它们的EIP-4361字符串表示形式
println!("{}", &message);
不仅支持EIP-191个人签名预哈希签名输入格式(如果您的以太坊钱包不支持EIP-191直接签名)
let eip191_bytes: Vec<u8> = message.eip191_bytes()?;
直接作为EIP-191个人签名哈希化签名输入(通过.eip191_string
输出生成)
let eip191_hash: [u8; 32] = message.eip191_hash()?;
示例
解析和验证Message
非常简单
use hex::FromHex;
use siwe::{Message, TimeStamp, VerificationOpts};
use std::str::FromStr;
use time::{format_description::well_known::Rfc3339, OffsetDateTime};
#[tokio::main]
async fn main() {
let msg = r#"localhost:4361 wants you to sign in with your Ethereum account:
0x6Da01670d8fc844e736095918bbE11fE8D564163
SIWE Notepad Example
URI: https://127.0.0.1:4361
Version: 1
Chain ID: 1
Nonce: kEWepMt9knR6lWJ6A
Issued At: 2021-12-07T18:28:18.807Z"#;
let message: Message = msg.parse().unwrap();
let signature = <[u8; 65]>::from_hex(r#"6228b3ecd7bf2df018183aeab6b6f1db1e9f4e3cbe24560404112e25363540eb679934908143224d746bbb5e1aa65ab435684081f4dbb74a0fec57f98f40f5051c"#).unwrap();
let verification_opts = VerificationOpts {
domain: Some("localhost:4361".parse().unwrap()),
nonce: Some("kEWepMt9knR6lWJ6A".into()),
timestamp: Some(OffsetDateTime::parse("2021-12-08T00:00:00Z", &Rfc3339).unwrap()),
..Default::default()
};
if let Err(e) = message.verify(&signature, &verification_opts).await {
// message cannot be correctly authenticated at this time
}
// do application-specific things
}
免责声明
我们用于以太坊登录的Rust库尚未经过正式的安全审计。我们欢迎对其实用性、架构和安全性的持续反馈。
另请参阅
依赖项
~6–21MB
~326K SLoC