Отключение cookie сеанса в Rust с помощью Rocket

Я пока не могу отменить сеанс через конечную точку logout, которую я создал в Rocket.

Ниже приведен код, который создает файл cookie:

impl AuthToken {
    pub fn from_string(string: String) -> Self {
        AuthToken(string)
    }

    pub fn to_string_ptr(&self) -> &String {
        &self.0
    }

    pub fn as_cookie(&self) -> Cookie<'static> {
        let clone = self.to_string();

        Cookie::build("session-token", clone)
            .path("/")
            .same_site(SameSite::Strict)
            .http_only(true)
            .finish()
    }
}

И это код, который пытается его уничтожить


#[post("/logout")]
pub fn logout(mut cookies: Cookies) -> APIResponse {

    cookies.remove(Cookie::named("session-token"));

    ok().data(json!({
        "success": true
    }))
}

Файл cookie добавляется при успешном вызове POST '/signup' или POST '/login'.

В инструментах разработки Chrome вы можете увидеть, что файл cookie устанавливается в ответе POST '/login'.

Заголовки ответа на вход

Затем я выхожу из системы, используя POST '/logout', и получаю такой ответ:

Заголовки ответа на выход

В этот момент я делаю жесткое обновление. После этого вызывается GET '/get-profile', который не должен работать при выходе из системы, но по-прежнему отправляет cookie в заголовках запроса.

введите здесь описание изображения

Итак, кажется, что файл cookie сеанса не удаляется должным образом, есть ли правильный способ сделать это в Rocket?


person Gabriel Ratener    schedule 09.02.2020    source источник


Ответы (1)


Когда вы смотрите документацию, она говорит следующее:

pub fn remove(&mut self, cookie: Cookie<'static>)
[−]

Removes cookie from this collection and generates a "removal" cookies to send to the client on response. For correctness, cookie must contain the same path and domain as the cookie that was initially set. Failure to provide the initial path and domain will result in cookies that are not properly removed.

A "removal" cookie is a cookie that has the same name as the original cookie but has an empty value, a max-age of 0, and an expiration date far in the past.

Это именно то, что происходит, когда вы просматриваете заголовок Set-Cookie. Проблема, с которой я столкнулся, заключалась в том, что файл cookie для удаления был установлен в домене, отличном от исходного файла cookie. Убедившись, что файл cookie для удаления был установлен в том же домене, файл cookie сбрасывается правильно.

Создать куки:

        let domain = env!("DOMAIN", "DOMAIN must be set");
        let app_env = env!("APP_ENV", "APP_ENV must be set");

        let on_production = app_env == "production";

        let cookie = Cookie::build(key, value)
            .domain(domain.to_string())
            .path("/")
            .secure(on_production)
            .max_age(Duration::days(365))
            .http_only(true)
            .finish();

        cookies.add_private(cookie);

Удалить куки:


        let domain = env!("DOMAIN", "DOMAIN must be set");
        let app_env = env!("APP_ENV", "APP_ENV must be set");

        let on_production = app_env == "production";

        let cookie = Cookie::build(name, "")
            .domain("lvh.me")
            .path("/")
            .secure(on_production)
            .max_age(Duration::days(365))
            .http_only(true)
            .finish();

        cookies.remove_private(cookie);
person Ramsy de Vos    schedule 09.02.2020