es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede establecer una fecha de caducidad en una cookie privada llamada Rocket-Rust.

Estoy intentando establecer una expiración en una Cookie privada en Rust (versión 0.5.0-rc.1 del framework Rocket) utilizando rocket::http::Cookie.

En la documentación de add_private de Rocket leo lo siguiente:

A menos que se establezca un valor para la propiedad dada, los siguientes valores predeterminados se establecen en la cookie antes de ser agregada a sí misma:

path: "/"
SameSite: Strict
HttpOnly: true
Expires: 1 semana a partir de ahora

No entiendo cómo establecer la propiedad Expires.

Intenté crear una nueva cookie y establecer la expiración usando .set_expires() (como en el ejemplo de la documentación), pero me da el error: “la característica From<offsetdatetime> no está implementada para std::option::Option<time::offset_date_time::offsetdatetime>“. El código que retorna el error es algo como esto (los valores aquí solo son para propósitos de prueba):

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);
}

Me pregunto si debo usar el crate cookie en lugar de rocket::http para crear la cookie, pero en ese caso no puedo usar CookieJar en el manejador de la respuesta porque espera un rocket::http::Cookie y no un cookie::Cookie.

¿Existe alguna otra forma de establecer una expiración o una duración máxima en una cookie privada utilizando el módulo http de Rocket?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según la documentación, la propiedad expires de una cookie se puede establecer utilizando la estructura rocket_http::hyper::header::Expires.

    Aquí tienes un ejemplo:

    use rocket::http::{Cookie, CookieJar};
    use rocket_http::hyper::header::Expires;
    use time::Duration;
    
    fn handler(jar: &CookieJar<'_>) {
        let mut cookie = Cookie::new("name", "value");
    
        let now = time::OffsetDateTime::now_utc();
        let one_week_from_now = now + Duration::weeks(1);
        let expires = Expires(one_week_from_now);
    
        cookie.set_http_only(true);
        cookie.set_same_site(rocket_http::SameSite::Strict);
        cookie.set_expires(expires);
    
        jar.add_private(cookie);
    }
    

    En este ejemplo, creamos una instancia de Expires al pasar un time::OffsetDateTime que representa una semana a partir de ahora. Luego, establecemos la propiedad expires del objeto Cookie con este valor.

    Ten en cuenta que también establecemos las propiedades http_only y same_site de la cookie, que son prácticas recomendadas para la seguridad.

Comments are closed.