Oturumlar Express.js'de Node.js ile nasıl çalışır?


96

Express.js kullanarak oturumlar son derece basittir. Aslında nasıl çalıştıklarını merak ediyorum.

İstemcide biraz çerez depoluyor mu? Öyleyse, bu kurabiyeyi nerede bulabilirim? Gerekirse nasıl kodunu çözebilirim?

Temel olarak, kullanıcı o sırada sitede olmasa bile bir kullanıcının oturum açıp açmadığını görmek istiyorum (örneğin, facebook'un başka sitelerdeyken oturum açtığınızı nasıl bildiği gibi). Ama önce oturumların nasıl işlediğini anlamam gerektiğini anlamalıyım.

Yanıtlar:


43

Express.js'yi hiç kullanmadım, ancak konuyla ilgili belgelerine göre şöyle görünüyor:

  • Çerezler, istemcide bir anahtarla (sunucunun oturum verilerini almak için kullanacağı) ve bir karmayla (sunucunun çerez verilerinin değiştirilmediğinden emin olmak için kullanacağı) depolanır. çerezin geçersiz olacağı bir değer)

  • Bazı çerçevelerin aksine (ör. Play Framework !) Oturum verileri sunucuda tutulur, bu nedenle tanımlama bilgisi gerçek oturum verilerinin sahibinden çok oturum için bir yer tutucu gibidir.

  • Gönderen burada sunucuda bu oturumda veri bellekte tutulan varsayılan gibi ne olursa olsun depolama formu uygular uygun API için değişmiş olabilir rağmen, bu görünüyor.

Yani, belirli bir reqistek nesnesi olmadan her şeyi kontrol etmek istiyorsanız , söylediğiniz gibi, sadece aynı depoya erişmeniz gerekir. İlk dokümantasyon sayfasının altında, depolamanın uygulaması gereken gerekli yöntemleri ayrıntılarıyla anlatır, bu nedenle depolama API'nize aşinaysanız, belki de böyle bir .getAll()şey varsa bir yürütebilir ve oturum verilerinde döngü oluşturabilir ve ne varsa istediğiniz değerler.


167

Genel Bakış

Express.js, kullanıcının tarayıcısında bir oturum kimliğini (şifreleme imzasıyla) saklamak için bir çerez kullanır ve daha sonra, sonraki isteklerde, sunucuda depolanan oturum bilgilerini almak için bu çerezin değerini kullanır. Bu sunucu tarafı depolama, bir bellek deposu (varsayılan) veya gerekli yöntemleri uygulayan başka herhangi bir depo ( connect-redis gibi ) olabilir.

Detaylar

Express.js / Connect, kullanarak 24 karakterlik bir Base64 dizesi oluşturur utils.uid(24)ve içinde saklar req.sessionID. Bu dize daha sonra bir tanımlama bilgisindeki değer olarak kullanılır.

İstemci Tarafı

İmzalı çerezler her zaman oturumlar için kullanılır, bu nedenle çerez değeri aşağıdaki biçime sahip olacaktır.

[sid].[signature]

Burada [sid], oturum kimliği ve [imza], oturum ara yazılımı başlatılırken sağlanan gizli anahtar kullanılarak [sid] imzalanarak oluşturulur. İmzalama adımı, kurcalanmayı önlemek için yapılır. Kullanılan gizli anahtar bilgisi olmadan [sid] 'yi değiştirmek ve ardından [imza]' yı yeniden oluşturmak sayısal olarak olanaksız olmalıdır. [Sid] 'de herhangi bir değişiklik gerekmiyorsa, oturum tanımlama bilgisi hırsızlığa ve yeniden kullanıma karşı hala savunmasızdır.

Bu çerezin adı

connect.sid

Sunucu Tarafı

cookieParserVe sessionara yazılımdan sonra bir işleyici ortaya çıkarsa , değişkene erişimi olacaktır req.cookies. Bu, anahtarları çerez anahtarları ve değerleri çerez değerleri olan bir JSON nesnesi içerir. Bu, adlandırılmış bir anahtar içerecek connect.sidve değeri imzalı oturum tanımlayıcısı olacaktır.

Her istekte oturum tanımlama bilgisinin varlığını kontrol edecek ve değerini konsola yazdıracak bir yolun nasıl ayarlanacağına dair bir örnek aşağıda verilmiştir.

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

Yönlendiricinin ( app.use(app.router)) yapılandırma bölümünüze cookieParserve sonrasına dahil edildiğinden de emin olmanız gerekir session.

Aşağıda, Express.js / Connect tarafından dahili olarak depolanan verilere bir örnek verilmiştir.

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

userAlan bir gelenektir. Geri kalan her şey oturum yönetiminin bir parçasıdır.

Örnek, Express 2.5'ten alınmıştır.


1
cookie değerini console.log ile yazdırırken, kodlanmış (imzalı) tanımlama bilgisini verir. gerçek bilgileri nasıl alırım?
vsync

Ne demek istiyorsun - "[sid] 'de herhangi bir değişiklik gerekmiyorsa oturum tanımlama bilgisi hırsızlığa ve yeniden kullanıma hala açıktır." SID express tarafından oluşturulduğundan, onu asla değiştiremeyiz, doğru mu?
Hrushikesh

2
@WebHrushi Bir Ortadaki Adam saldırısını düşünüyordum: en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn

Birisi bana bu sorularda yardımcı olabilir mi: stackoverflow.com/questions/21982791/…
roundrobin

herhangi bir belirli session_id için nasıl token yaratırım?
aman verma

9

Aslında nasıl çalıştıklarını merak ediyorum.

Bu yanıta ve wiki maddelerine bakmaya çalışın .

İstemcide biraz çerez depoluyor mu?

Evet, genellikle sahteciliği önlemek için bir sır ile imzalanması gereken, atanmış oturum kimliğine sahip bir çerezdir.

Öyleyse, bu kurabiyeyi nerede bulabilirim? Gerekirse nasıl kodunu çözebilirim?

İstemci tarafında bir oturum çereziyle uğraşmamalısınız. Sunucu tarafında oturumlarla çalışmak istiyorsanız, ilgili express.js'ye göz atmalı ve dokümanları bağlamalısınız .


Efendim, konuşabilir miyiz, tüm bunlarla ilgili bazı şüphelerim var.
Suraj Jain

1

Zaten mükemmel yanıtlara ek olarak, Ekspres oturumlarını, çerezlerle bağlantılarını ve depolamayı açıklamak için oluşturduğum 2 şema aşağıda verilmiştir:

  • çikolatalı kurabiye: çikolata
  • çilekli kurabiye: çilek

Üzgünüm ama diyagramdan pek bir şey anlamadım. Onunla / içinde ne aktarmaya çalışıyordun?
Rafael Sofi-zada

1
@ RafaelSofi-zada her çerezin benzersiz bir "çeşidi" (veya sessionId) vardır. Çilek çerezi sunucuya sunulduğunda (HTTP isteği ile), sunucu bu çeşidi tanır ve ilgili verileri depodan yükler: Rosie'nin verileri ve req.session!
abernier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.