Passport.js - ত্রুটি: সেশনে ব্যবহারকারীকে সিরিয়ালাইজ করতে ব্যর্থ হয়েছে


179

আমি পাসপোর্ট.জেএস মডিউল এবং এক্সপ্রেস.জেএস-এ সমস্যা পেয়েছি।

এটি আমার কোড এবং আমি প্রথমবারের জন্য একটি হার্ডকোডযুক্ত লগইনটি ব্যবহার করতে চাই।

আমি সর্বদা বার্তাটি পাই:

আমি প্রচুর অনুসন্ধান করেছি এবং স্ট্যাকওভারফ্লোতে কিছু পোস্ট পেয়েছি তবে আমি ব্যর্থতা পাইনি।

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

}();

ধন্যবাদ।

উত্তর:


360

দেখে মনে হচ্ছে আপনি বাস্তবায়ন করেন নি 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
@ আরবার্টক্লেপ আমি এটি সেশনে সংরক্ষণ করতে চাই না। আমি JWT ব্যবহার করছি। সিরিয়ালাইজ ব্যবহারকারী / ডিসরিয়ালাইজার ব্যবহারকারী প্রয়োজন? আমি একটি সেশন চাই। আমি
JWT

@ অভ্যন্তরীণ আপনার প্রয়োজন কিনা তা নিশ্চিত নন তবে এটি পরীক্ষা করা সহজ জিনিস হবে।
Robertklep

44

আপনি যদি সেশনগুলি ব্যবহার না করার সিদ্ধান্ত নেন তবে আপনি সেশনটি মিথ্যাতে সেট করতে পারেন

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

তবে এটি অন্য সব শেষ পয়েন্টগুলিতে সেশনটি বন্ধ করবে না (যেখানে আমি কোনও
অধিবেশনও

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' সেট করি?" - বেশিরভাগ ক্ষেত্রে আপনি না। সুতরাং কী হিসাবে একটি যথাযথ বৈশিষ্ট্য ব্যবহার করুন।


0

সিরিয়ালাইজ ইউজার এবং ডিসিরিয়ালাইজ ব্যবহারকারীর সাথে প্রতিশ্রুতি ব্যবহার করা:

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

পাসপোর্ট.উজে ('লোকাল-লগইন' ...) / অথবা / ('লোকাল-সিঙ্গআপ' ...)

যদি ভুল হয় তবে আপনাকে "মিথ্যা" ভুল {রিটার্ন শেষ করতে হবে (নাল, রিকিউ.ফ্লেশ ('মেগসাইন', 'ব্যবহারকারীর নাম ইতিমধ্যে বিদ্যমান! megsign ',' ব্যবহারকারীর নাম ইতিমধ্যে বিদ্যমান #! # '));}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.