Passport.session () ara yazılım ne yapar?


125

Kolay Düğüm Kimlik Doğrulaması: Kurulum ve Yerel öğreticisini kullanarak Passport.js kullanarak bir kimlik doğrulama sistemi oluşturuyorum .

Ne passport.session()yaptığı konusunda kafam karıştı .

Farklı ara yazılımlarla oynadıktan sonra express.session(), istemciye çerezler üzerinden bir oturum kimliği gönderenin ne olduğunu anladım, ancak neyin passport.session()yapıldığı ve buna ek olarak neden gerekli olduğu konusunda kafam karıştı express.session().

Uygulamamı şu şekilde oluşturuyorum:

// Server.js, uygulamayı yapılandırır ve web sunucusunu ayarlar

//importing our modules
var express = require('express');
var app = express();
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');

var configDB = require('./config/database.js');

//Configuration of Databse and App

mongoose.connect(configDB.url); //connect to our database

require('./config/passport')(passport); //pass passport for configuration

app.configure(function() {

    //set up our express application

    app.use(express.logger('dev')); //log every request to the console
    app.use(express.cookieParser()); //read cookies (needed for auth)
    app.use(express.bodyParser()); //get info from html forms

    app.set('view engine', 'ejs'); //set up ejs for templating

    //configuration for passport
    app.use(express.session({ secret: 'olhosvermelhoseasenhaclassica', maxAge:null })); //session secret
    app.use(passport.initialize());
    app.use(passport.session()); //persistent login session
    app.use(flash()); //use connect-flash for flash messages stored in session

});

//Set up routes
require('./app/routes.js')(app, passport);

//launch
app.listen(port);
console.log("Server listening on port" + port);

Yanıtlar:


139

passport.session() req nesnesini değiştirmek ve şu anda oturum kimliği (istemci tanımlama bilgisinden) olan 'kullanıcı' değerini gerçek serileştirilmemiş kullanıcı nesnesine dönüştürmek için bir ara yazılım görevi görür.

Diğer cevaplar bazı iyi noktaları ortaya koyarken, ben daha spesifik detayların verilebileceğini düşündüm.

app.use(passport.session());

eşdeğerdir

app.use(passport.authenticate('session'));

'Oturum', passportJS ile birlikte verilen aşağıdaki stratejiyi ifade eder.

https://github.com/jaredhanson/passport/blob/master/lib/strategies/session.js

Özellikle 59-60 satırları:

var property = req._passport.instance._userProperty || 'user';
req[property] = user;

Esasen bir ara yazılım olarak hareket ettiği ve req nesnesindeki 'kullanıcı' özelliğinin değerini kullanıcının serileştirilmemiş kimliğini içerecek şekilde değiştirdiği durumlarda. Bunun düzgün çalışmasına izin vermek için özel kodunuza serializeUserve deserializeUserişlevlerini eklemelisiniz .

passport.serializeUser(function (user, done) {
    done(null, user.id);
});

passport.deserializeUser(function (user, done) {
    //If using Mongoose with MongoDB; if other you will need JS specific to that schema.
    User.findById(user.id, function (err, user) {
        done(err, user);
    });
});

Bu, veritabanından doğru kullanıcıyı bulacak ve onu bir kapanış değişkeni olarak geri aramaya geçirecektir, done(err,user);böylece yukarıdaki kod passport.session(), req nesnesindeki 'kullanıcı' değerini değiştirebilir ve yığındaki bir sonraki ara katman yazılımına geçebilir.


hey, kullanıcı bilgilerini yalnızca oturumda nasıl saklayabilirim, onları doğrudan veritabanında saklamak istemiyorum
Çaylak

1
"istek başlıklarında"? hayır sadece istek nesnesinde
caub

Oturum stratejisinin yetkilendirmeyi geri yükleyebildiğini ve kullanıcıyı seriyi kaldırabildiğini fark ettim. Ancak buna rağmen, kimlik doğrulama hala bir sonraki stratejiye geçiyor, benim senaryomda facebook kimlik doğrulaması. Oturum kullanıcıyı kurtarabildiğinde bile aşağıdaki stratejileri kullanmaya devam ederse oturum stratejisinin amacının ne olduğunu merak ediyorum.
nishant

15

Gönderen dokümantasyon

Connect veya Express tabanlı bir uygulamada, Passport'u başlatmak için passport.initialize () ara yazılım gereklidir. Uygulamanız kalıcı oturum açma oturumları kullanıyorsa, passport.session () ara yazılım da kullanılmalıdır.

ve

Oturumlar

Tipik bir web uygulamasında, bir kullanıcının kimliğini doğrulamak için kullanılan kimlik bilgileri yalnızca oturum açma isteği sırasında iletilecektir. Kimlik doğrulama başarılı olursa, kullanıcının tarayıcısındaki bir çerez seti aracılığıyla bir oturum kurulur ve sürdürülür.

Sonraki her istek kimlik bilgilerini içermez, bunun yerine oturumu tanımlayan benzersiz tanımlama bilgisini içerir. Oturum açma oturumlarını desteklemek için, Passport oturumda kullanıcı örneklerini serileştirecek ve serisini kaldıracaktır.

ve

Çoğu uygulama için önerilse de, oturum desteğini etkinleştirmenin tamamen isteğe bağlı olduğunu unutmayın. Etkinleştirilirse, oturumun doğru sırada geri yüklendiğinden emin olmak için passport.session () 'dan önce express.session () kullandığınızdan emin olun.


1
Hızlı cevabınız için teşekkür ederim ama bu sorumu cevaplamıyor. Ayrıca, ekspres bir uygulamanız varsa ve express.session () 'ı kullanırsanız, ekspres sunucunuza bağlanan herhangi bir istemcide (kimliği doğrulanmış olsun veya olmasın), kendisine bir çerez aracılığıyla bir oturum verileceğini unutmayın. Bu, uygulamanızın giriş korumalı bir sayfasında olup olmadığından bağımsızdır. Yine de her iki ara yazılım arasındaki farkı bilmek istiyorum.
Georges Krinker

1
@GeorgesKrinker, serializeUser () ve deserializeUser yöntemleridir. Ekspres ara yazılım, oturum bilgilerini geri yükleyecektir, ancak bunun passport'un kullanıcı bilgilerini nasıl yönettiğiyle ilgili olması gerekmez. Bu seans ekspres ile rehidrate edildikten sonra yapılmalıdır.
Josh C'de

Ben serializeUser () ve deserializeUser metodlarının yolların içinde Authenticate () üzerinde çalıştığı izlenimine kapılmıştım.
Georges Krinker

@GeorgesKrinker Sanmıyorum. Pasaport kullandığımda, yalnızca oturum açarken .authenticate'i aradım.
Josh C.

app.post('/login', passport.authenticate('local'), ...
Josh C.

11

Kullanacağınız iken PassportJsgiriş URL'nin bir parçası olarak kullanıcıyı doğrulamak için, hala oturumda bu kullanıcı bilgilerini saklamak için bazı mekanizma gerekir ve takip eden her istek (yani serialize / kullanıcı serisini) ile geri almak.

Yani aslında, bu kimlik doğrulamasının oturum açma yanıtında olduğu gibi bir veritabanına veya oauth'a bakması gerekmese bile, her istekte kullanıcının kimliğini doğruluyorsunuz. Bu nedenle pasaport, oturum kimlik doğrulamasını da başka bir kimlik doğrulama stratejisi olarak ele alacaktır.

Ve adı verilen bu stratejiyi sessionkullanmak için basit bir kısayol kullanın app.use(passport.session()). Ayrıca, bu özel stratejinin, bariz nedenlerden ötürü işlevleri serileştirmenizi ve seriyi kaldırmanızı isteyeceğini unutmayın.


11

Basitçe oturumun kimliğini doğrular (doldurulur express.session()). Şuna eşdeğerdir:

passport.authenticate('session');

buradaki kodda görülebileceği gibi:

https://github.com/jaredhanson/passport/blob/42ff63c/lib/authenticator.js#L233


6
Ne demek istiyorsun? Her istek üzerine çalışır ve kimlik doğrulaması için herhangi bir kimlik bilgisine sahip olması gerekmez. Her istekte gerçekleşen iş akışı hakkında bana biraz daha ayrıntı verebilir misiniz?
Georges Krinker

6
Evet, her istek üzerine çalışır. Express tarafından üretilen oturum kimliği, tarayıcının her istekte gönderdiği bir kimlik doğrulama belirtecine kabaca eşdeğer olan benzersiz bir kimliktir. Bu oturumda saklanan veriler, kullanıcının kimlik doğrulama durumunu geri yüklemek için kullanılır.
Jared Hanson

Merhaba @JaredHanson sen bakmak Could bu . Cevabı hiçbir yerde bulamadım?
Saras Arya

@JaredHanson Yaygın olarak kullanılan OAuth2 uyumlu bir açık kaynak yetkilendirme sunucusuyla kimlik doğrulamak için passport.js kullanmaya çalışıyorum. Ama bir hata alıyorum. Sorunun çözülmesine yardım etmeye istekli misiniz? İşte bağlantı: stackoverflow.com/questions/38176236/…
DollarCoffee

@JaredHanson: Gözlemlediğim şey, google-oauth ile giriş yaptıktan hemen sonra passport.user bilgisi ile arttırılan gerekli nesnenin, sitede yeni bir sayfa için bir sonraki talep yapıldığında kaybolması. Bu beklenen davranış mı? Öyleyse, son zamanlarda giriş yapmış olan kullanıcı bilgilerini nasıl geri alacağımı bilmiyorum?
user1102171
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.