31个版本
0.10.2 | 2024年8月4日 |
---|---|
0.10.1 | 2023年12月23日 |
0.10.0 | 2023年8月21日 |
0.9.5 | 2023年4月3日 |
0.1.1 | 2017年6月15日 |
在 Web编程 中排名 117
每月下载量 5,076
被 3 个Crate 使用
69KB
1K SLoC
Rust Web Push
此Crate实现了Web推送API的服务端部分,使用Rust编写!
有关Web推送框架本身的更多背景信息,请参阅 这篇优秀的文档。
要求
- 客户端需要异步执行器。
- 编译需要OpenSSL。您必须在您的宿主机上安装它或使用openssl crate的
vendored
功能。
迁移说明
此库仍在积极开发中,将根据semver进行重大更改。请参阅GitHub发布说明以获取详细说明。
示例
use web_push::*;
use std::fs::File;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
let endpoint = "https://updates.push.services.mozilla.com/wpush/v1/...";
let p256dh = "key_from_browser_as_base64";
let auth = "auth_from_browser_as_base64";
//You would likely get this by deserializing a browser `pushSubscription` object via serde.
let subscription_info = SubscriptionInfo::new(
endpoint,
p256dh,
auth
);
//Read signing material for payload.
let file = File::open("private.pem").unwrap();
let mut sig_builder = VapidSignatureBuilder::from_pem(file, &subscription_info)?.build()?;
//Now add payload and encrypt.
let mut builder = WebPushMessageBuilder::new(&subscription_info);
let content = "Encrypted payload to be sent in the notification".as_bytes();
builder.set_payload(ContentEncoding::Aes128Gcm, content);
builder.set_vapid_signature(sig_builder);
let client = IsahcWebPushClient::new()?;
//Finally, send the notification!
client.send(builder.build()?).await?;
Ok(())
}
VAPID
VAPID认证可以防止未知来源向客户端发送通知,并且在发送有效载荷时所有当前浏览器都需要。
服务器使用的私钥可以使用OpenSSL生成
openssl ecparam -genkey -name prime256v1 -out private_key.pem
从刚刚生成的私钥派生一个公钥,用于JavaScript客户端
openssl ec -in private_key.pem -pubout -outform DER|tail -c 65|base64|tr '/+' '_-'|tr -d '\n'
签名使用VapidSignatureBuilder
创建。它将自动添加所需的声明aud
和exp
。手动将这些声明添加到构建器中将覆盖默认值。
使用示例程序
要从命令行发送Web推送,首先使用浏览器订阅接收推送通知,并将订阅信息存储到json文件中。它应该包含以下内容
{
"endpoint": "https://updates.push.services.mozilla.com/wpush/v1/TOKEN",
"keys": {
"auth": "####secret####",
"p256dh": "####public_key####"
}
}
Google有良好的说明用于构建接收通知的前端。
将订阅信息存储到examples/test.json
中,并使用以下命令发送通知:cargo run --example simple_send -- -v ./private_key.pem -f examples/test.json -p "It works!"
。
概述
目前,该库实现了RFC8188内容加密,用于通知有效负载。这是通过委托加密到mozilla的ece crate来实现的。因此,我们的安全性与他们的紧密相关。默认客户端基于isahc构建,但可以使用hyper-client
功能与基于hyper的客户端交换。可以使用request_builder
模块创建自定义客户端。
该库已与谷歌和Mozilla的推送通知服务进行了测试。还验证了其在Edge浏览器上的兼容性。
构建需要Openssl。在*nix上安装openssl-dev
或等效版本,或在Windows上使用openssl
通过vcpkg
安装。还提供了一个nix脚本。
如果在Windows上安装,这是确切的命令
vcpkg integrate install
vcpkg install openssl:x64-windows-static-md
调试
如果您遇到错误或推送通知无法工作,您可以尝试以下说明进行调试
将以下内容添加到您的Cargo.toml
log = "0.4"
pretty_env_logger = "0.3"
将以下内容添加到您的main.rs
extern crate pretty_env_logger;
// ...
fn main() {
pretty_env_logger::init();
// ...
}
或使用与https://docs.rs/log/兼容的任何其他日志库
然后使用以下环境变量运行您的程序
RUST_LOG="web_push::client=trace" cargo run
这将打印有关推服务请求的更多信息,这可能会帮助您或其他人找到错误。
依赖项
~13–28MB
~442K SLoC