Passport.js - त्रुटि: सत्र में उपयोगकर्ता को क्रमबद्ध करने में विफल रहा


180

मुझे Passport.js मॉड्यूल और Express.js के साथ एक समस्या मिली।

यह मेरा कोड है और मैं केवल पहले प्रयास के लिए हार्डकोड लॉगिन का उपयोग करना चाहता हूं।

मुझे हमेशा संदेश मिलता है:

मैंने बहुत खोज की और स्टैकओवरफ्लो में कुछ पोस्ट पाए लेकिन मुझे असफलता नहीं मिली।

Error: failed to serialize user into session
    at pass (c:\Development\private\aortmann\bootstrap_blog\node_modules\passport\lib\passport\index.js:275:19)

मेरा कोड इस तरह दिखता है।

'use strict';

var express = require('express');
var path = require('path');
var fs = require('fs');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var nodemailer = require('nodemailer');

var app = express();

module.exports = function setupBlog(mailTransport, database){
var config = JSON.parse(fs.readFileSync('./blog.config'));

app.set('view options', {layout: false});

app.use(express.static(path.join(__dirname, '../', 'resources', 'html')));


app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: 'secret' }));
app.use(passport.initialize());
app.use(passport.session());


app.get('/blog/:blogTitle', function(req, res) {
  var blogTitle = req.params.blogTitle;
  if(blogTitle === 'newest'){
    database.getLatestBlogPost(function(post) {
      res.send(post);
    });
  } else {
    database.getBlogPostByTitle(blogTitle, function(blogPost) {
      res.send(blogPost);
    });
  }
});

passport.use(new LocalStrategy(function(username, password, done) {
  // database.login(username, password, done);
  if (username === 'admin' && password === 'admin') {
    console.log('in');
    done(null, { username: username });
  } else {
    done(null, false);
  }
}));

app.post('/login', passport.authenticate('local', {
  successRedirect: '/accessed',
  failureRedirect: '/access'
}));





app.listen(8080);
console.log('Blog is running on port 8080');

}();

धन्यवाद।

जवाबों:


363

ऐसा लगता है कि आपने लागू नहीं किया है passport.serializeUserऔर passport.deserializeUser। इसे जोड़ने का प्रयास करें:

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

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

2
मेरे लिए काम किया। मुझे हर जगह लिखे गए 'आईडी' भाग का उपयोग क्यों नहीं करना है?
अध्येता

9
@ स्केलेन्जर यह इस बात पर निर्भर करेगा कि आप क्रमांकन कैसे लागू करते हैं। कभी-कभी आप उपयोगकर्ता आईडी द्वारा अनुक्रमित करते हैं, जिसका अर्थ है कि serializeUserफ़ंक्शन सत्र में उपयोगकर्ता आईडी को संग्रहीत deserializeUserकरता है , और उस डेटा का उपयोग डेटाबेस (उदाहरण के लिए) से उपयोगकर्ता डेटा प्राप्त करने के लिए करता है। यह सत्र भंडारण को वास्तविक उपयोगकर्ता डेटा से रोकने के लिए है।
रॉबर्टबेलप

+1 @robertklep टिप्पणी। मैं हमेशा उपयोगकर्ता की जानकारी को अनुक्रमित करने से बचता हूँ, लेकिन केवल आईडी (ब्लोट / पूर्ण कारणों के लिए व्यक्तिगत रूप से)।
इलेक्ट्रालकेक

2
@robertklep मैं इसे सत्र में संग्रहीत नहीं करना चाहता। मैं JWT का उपयोग कर रहा हूं। क्या serializeUser / deserializeUser की आवश्यकता है? मुझे नो सेशन चाहिए। मैं जेडब्ल्यूटी उपयोग कर रहा हूँ
Internial

@ यदि आपको उनकी आवश्यकता है, तो निश्चित नहीं है, लेकिन यह परीक्षण करना एक आसान बात होगी।
रॉबर्टबेलप

44

यदि आप सत्र का उपयोग नहीं करने का निर्णय लेते हैं, तो आप सत्र को गलत पर सेट कर सकते हैं

app.post('/login', passport.authenticate('local', {
  successRedirect: '/accessed',
  failureRedirect: '/access',
  session: false
}));

लेकिन उस बंद अन्य सभी अंतिमबिंदुओं (जहां मैं भी किसी भी सत्र नहीं करना चाहती) पर सत्र चालू नहीं होगा
jayarjo

17

लगता है कि आप पासपोर्ट सेटअप के एक भाग से चूक गए, विशेष रूप से ये दो तरीके:

passport.serializeUser(function(user, done) {
    done(null, user._id);
    // if you use Model.id as your idAttribute maybe you'd want
    // done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

मैंने ._idबनाम के बारे में थोड़ा जोड़ा, .idलेकिन यह स्निपेट डॉक्स के कन्फिगर सेक्शन से है, एक और पढ़ें और शुभकामनाएं दें :)


2

यहां सत्रों का उपयोग करने के लिए एक कामकाजी लेकिन अभी भी आलसी तरीका है और अभी भी मूल्यों को "क्रमबद्ध" करता है।

var user_cache = {};

passport.serializeUser(function(user, next) {
  let id = user._id;
  user_cache[id] = user;
  next(null, id);
});

passport.deserializeUser(function(id, next) {
  next(null, user_cache[id]);
});

मामले में या अजीब त्रुटियां बस अपने आप से पूछती हैं: "क्या मैं अपने उपयोगकर्ता ऑब्जेक्ट में '_id' को rlly सेट कर सकता हूं?" - ज्यादातर मामलों में आप न। इसलिए कुंजी के रूप में एक उचित विशेषता का उपयोग करें।


0

SerializeUser और deserializeUser के साथ वादा का उपयोग करना:

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

passport.deserializeUser((id, done) => {
  // console.log(`id: ${id}`);
  User.findById(id)
    .then((user) => {
      done(null, user);
    })
    .catch((error) => {
      console.log(`Error: ${error}`);
    });
});

कृपया इस मुद्दे को हल करने के तरीके के लिए एक पूर्ण कोड उदाहरण के लिए मेरे गिथब रेपो देखें ।


-1

in passport.use ('स्थानीय-लॉगिन' ...) / या / ('स्थानीय-एकल' ...)

अगर आपको गलत "गलत" लौटना है तो {{किया गया (null, req.flash ('megsign', 'Username पहले से ही मौजूद है #! #');} true {return किया गया (null, false, req.flash) megsign ',' Username पहले से ही मौजूद है #! # ')) ;;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.