lilydocs
HTTP APIWebSocketConsumer
Güvenlik2 dk okuma

Cookie’ler

Cookie okuyun, yanıtla birlikte yazın ve imzalı veya şifreli cookie kullanımını seçin.

RequestCookies gelen cookie’leri okur. ResponseCookie giden cookie’nin kapsamını ve browser politikasını tanımlar. Typed bir yanıtla birlikte cookie yazmak için passthrough context kullanabilirsiniz.

Okuma ve yazma#

cookies.rs
use std::sync::Arc;
use lilyrs::http_api::{
    controller, Controller, ControllerInitError, ControllerTrait, CookieSameSite,
    Extensions, HttpApiError, PassthroughResponseContext, PassthroughResponseError,
    RequestCookies, ResponseCookie,
};
use serde::Serialize;

#[derive(Serialize)]
struct Preference { theme: String }

#[derive(Controller)]
#[base_path("/preferences")]
struct PreferenceController;

#[lilyrs::http_api::async_trait::async_trait]
impl ControllerTrait for PreferenceController {
    async fn new(_: Arc<Extensions>) -> Result<Self, ControllerInitError> { Ok(Self) }
}

#[controller]
impl PreferenceController {
    #[get("/theme")]
    async fn read(&self, cookies: RequestCookies) -> Result<Preference, HttpApiError> {
        let theme = cookies.get("theme")
            .map_err(|_| HttpApiError::BadRequest("cookie is invalid".into()))?
            .map(str::to_owned).unwrap_or_else(|| "light".into());
        Ok(Preference { theme })
    }

    #[put("/theme")]
    async fn set(&self, mut response: PassthroughResponseContext<'_>)
        -> Result<Preference, HttpApiError>
    {
        let cookie = ResponseCookie::new("theme", "dark")
            .map_err(PassthroughResponseError::from)?
            .http_only(true).secure(true).same_site(CookieSameSite::Lax)
            .path("/").map_err(PassthroughResponseError::from)?;
        response.set_cookie(&cookie)?;
        Ok(Preference { theme: "dark".into() })
    }
}

GET /preferences/theme cookie yoksa light, varsa değerini döndürür. PUT /preferences/theme tema cookie’sini dark yapar ve JSON yanıtına ekler. RequestCookies::get sonucu Result<Option<&str>, RequestCookieError> türündedir; bozuk cookie’yi güvenli bir HTTP hatasına çevirin.

HTTPS örneği. Bu kod Secure cookie yazar. Yerel HTTP denemesinde browser cookie’yi geri göndermeyebilir; geliştirme politikasını buna göre açıkça ayarlayın.

Signed cookie bütünlük kontrolü, private cookie buna ek olarak gizlilik sağlar. Anahtarları uygulamanızın secret kaynağından alın; örneklere sabit production anahtarı yazmayın.

Secret ve response bağlamı sağlandığında
let key_ring = CookieKeyRing::new(primary_secret)?
    .with_previous(previous_secret)?;
let verified = cookies.private(&key_ring).get("session")?;
response.set_private_cookie(&cookie, &key_ring)?;

Bu bir API parçasıdır: primary_secret, previous_secret, cookie ve response bağlamını uygulama sağlar; error türlerini action sözleşmenize eşleyin. verified içindeki SecureCookieValue, value() ve needs_rotation() sunar. Önceki anahtarla çözülen değeri primary anahtarla yenileyebilirsiniz.

CookieRemoval, orijinal cookie’nin Path, Domain ve Partitioned kapsamını tekrar etmelidir. Farklı kapsamla silmek browser’daki asıl cookie’yi kaldırmayabilir. Signed/private cookie için delete_signed_cookie ve delete_private_cookie yolları bulunur.

Session sınırı#

Bir cookie’nin imzalı olması session store’daki oturumun hâlâ geçerli olduğunu kanıtlamaz. Expiry, revoke ve refresh rotation politikasını session akışında tamamlayın. Cookie ile kimlik taşınan browser uygulamalarında CSRF politikasını da seçin.

Bu sayfanın kaynakları v0.1.0

Anlatım, incelenen framework commit’ine dayanır.

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod