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

Download history 320/week @ 2024-05-01 210/week @ 2024-05-08 339/week @ 2024-05-15 258/week @ 2024-05-22 542/week @ 2024-05-29 275/week @ 2024-06-05 209/week @ 2024-06-12 233/week @ 2024-06-19 204/week @ 2024-06-26 189/week @ 2024-07-03 176/week @ 2024-07-10 166/week @ 2024-07-17 898/week @ 2024-07-24 1638/week @ 2024-07-31 1430/week @ 2024-08-07 1057/week @ 2024-08-14

每月下载量 5,076
3 个Crate 使用

Apache-2.0

69KB
1K SLoC

Rust Web Push

Cargo tests crates.io docs.rs

此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创建。它将自动添加所需的声明audexp。手动将这些声明添加到构建器中将覆盖默认值。

使用示例程序

要从命令行发送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