Отключение сеанса Cook ie в Rust с помощью ракеты - PullRequest
0 голосов
/ 09 февраля 2020

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

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

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

Повар ie добавляется в случае успешного вызова POST '/ signup' или POST '/ login.

В Chrome devtools вы можете видеть, как повар ie устанавливается в ответе POST '/ login'.

Login Response Headers

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

Logout Response Headers

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

enter image description here

Так что, похоже, сессия повара ie не правильно установлена, есть ли правильный способ сделать это в Rocket?

1 Ответ

0 голосов
/ 09 февраля 2020

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

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-Cook ie. Проблема, с которой я столкнулся, заключалась в том, что повар удаления ie был установлен в другом домене, чем исходный повар ie. Убедившись в том, что повар удаления ie был установлен в том же домене, повар ie будет сброшен правильно.

Создать повар ie:

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

Удалить повар ie :


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