无法在私有 cookie Rocket-Rust 中设置过期

Cannot set expire in private cookie Rocket-Rust

我正在尝试使用 rocket::http::Cookie.

在 Rust(Rocket Framework 版本 0.5.0-rc.1)中的私有 Cookie 中设置过期

在 rocket add_private 文档中我读到:

Unless a value is set for the given property, the following defaults are set on cookie before being added to self:

path: "/"
SameSite: Strict
HttpOnly: true
Expires: 1 week from now

我不明白如何设置 Expires 属性。

我尝试创建一个新的 cookie 并使用 .set_expires() 设置过期(如文档 example 中所示),但它给了我错误:“特征 From<OffsetDateTime> std::option::Option<time::offset_date_time::OffsetDateTime> 未实施”。 return 错误的代码类似于(此处的值仅用于测试目的):

use rocket::http::{Cookie, CookieJar};
use cookie::time::{Duration, OffsetDateTime};

fn handler(jar: &CookieJar<'_>) {
    let mut cookie = Cookie::new("name", "value");

    let mut now = OffsetDateTime::now_utc();
    now += Duration::days(1);
    cookie.set_expires(now);

    jar.add_private(cookie);
}

我想知道我是否必须使用 cookie crate 而不是 rocket::http 来创建 cookie,但在那种情况下我不能在响应处理程序中使用 CookieJar,因为它需要一个 rocket::http::Cookie而不是 cookie::Cookie.

有没有其他方法可以使用 Rocket http 模块在私人 cookie 中设置过期或最长期限?

我遇到了同样的问题,我想我已经解决了:

  • Rocket 在内部同时使用 cookietime
  • rocket::http::Cookie 的 Rocket 文档中的示例代码实际上来自 cookie 包,因此容易混淆地使用 use cookies::Cookie; 而不是 use rocket::http::Cookie
  • 关键点: https://api.rocket.rs/v0.5-rc/ 中的文档似乎比 crates.io 中的代码更新,并且使用了 [=12] 的不同版本=] 和 time 个板条箱。

因此您需要使用与 Rocket 相同的版本或 cookietime。如果你使用 crates.io 的 rocket 0.5.0-rc.1 那么你需要 cookie 0.15 或 time 0.2.11.

我能够让我的代码在 Cargo.toml:

中使用这些行
rocket = { version = "0.5.0-rc.1", features = ["secrets", "json"] }
time = "0.2.11"

您的示例代码将变为:

use rocket::http::{Cookie, CookieJar};
use time::{Duration, OffsetDateTime};

fn handler(jar: &CookieJar<'_>) {
    let mut cookie = Cookie::new("name", "value");

    let mut now = OffsetDateTime::now_utc();
    now += Duration::days(1);
    cookie.set_expires(now);

    jar.add_private(cookie);
}

或者,我认为如果您使用 cookie 的 0.15 版(您可能使用的是 0.16.0-rc.1),那么您的代码应该可以正常工作。不过,我认为直接从 time 包导入 DurationOffsetTime 更干净。

看起来 Github 中的最新版本的 Rocket 将 time 公开为 rocket::time,因此我们应该能够在最终 0.5 版本发布时切换到该版本。