Passport.js - 오류: 사용자를 세션으로 직렬화하지 못했습니다.
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');
}();
감사해요.
당신이 구현하지 않은 것처럼 보입니다.passport.serializeUser
그리고.passport.deserializeUser
다음을 추가해 보십시오.
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});
세션을 사용하지 않기로 결정한 경우 세션을 false로 설정할 수 있습니다.
app.post('/login', passport.authenticate('local', {
successRedirect: '/accessed',
failureRedirect: '/access',
session: false
}));
passportjs 설정의 일부, 특히 다음 두 가지 방법을 놓친 것 같습니다.
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
하지만 이 스니펫은 문서의 구성 섹션에서 나온 것입니다. 다시 한 번 읽고 행운을 빕니다 :)
여기서는 세션을 사용하면서도 값을 "직렬화"하는 작동하지만 여전히 게으른 방법입니다.
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'를 설정합니까?"라고 묻습니다. 대부분의 경우 설정하지 않습니다.따라서 적절한 속성을 키로 사용합니다.
비동기를 사용했는지 확인하고 사용자 데이터를 가져올 때까지 기다립니다.
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser(async (id, done) => {
const USER = await User.findById(id);
done(null, USER);
});
passport.use(
new GoogleStrategy(
{
// options for google strategy
clientID: keys.google.clientID,
clientSecret: keys.google.clientSecret,
callbackURL: "/auth/google/redirect",
},
async (accessToken, refreshToken, profile, done) => {
// passport callback function
// check if user already exist in our db
const oldUser = await User.findOne({ googleId: profile.id });
if (oldUser) {
return done(null, oldUser);
} else {
const newUser = await new User({
username: profile.displayName,
googleId: profile.id,
}).save();
return done(null, newUser);
}
}
)
);
get 또는 post 요청을 할 수 있는 server.js 파일에 이 코드를 사용합니다.
app.get('/auth/facebook/callback',passport.authenticate('facebook',{
successRedirect:'/profile',
failureRdirect:'/',
session: false
}))
일련 번호 지정과 함께 약속 사용사용자 및 역직렬화사용자:
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}`);
});
});
이 문제를 해결하는 방법에 대한 전체 코드 예제는 제 github repo를 참조하십시오.
이 코드를 놓쳤습니다.
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
자세한 내용은 http://www.passportjs.org/docs/configure/ 의 세션 부분을 참조하십시오.
제가 오늘 발견한 것처럼 이것에 대한 또 다른 일반적인 이유는 만약 당신이 여권, 여권-로컬, 여권-로컬-몽구스, 그리고 익스프레스-세션과 같은 표준 패키지를 사용하고 있고 당신이 이미 로그인하고 있던 세션에 있고 당신이 서버를 종료하고 다시 시작한다면,브라우저가 응답 없이 계속 로드되는 곳에 로그인하는 동안 동일한 세션에 있게 되며 "세션에 사용자를 직렬화하지 못했습니다."라는 오류가 발생합니다.
"user"가 객체 배열로 반환되므로 다음을 시도하십시오.
passport.serializeUser(function(user, cb) {
process.nextTick(function() {
return cb(null, user[0].id);
});
});
passport.use ('local-singup'...)/ 또는 /('local-singup'...)
오류가 발생하면 "false" 오류 {return done(null, req.flash('megsign', '사용자 이름이 이미 존재함 #!#')}을(를) 반환해야 합니다. 참 {return done(null, false, req.flash('megsign', '사용자 이름이 이미 존재함 #')}.
언급URL : https://stackoverflow.com/questions/19948816/passport-js-error-failed-to-serialize-user-into-session
'programing' 카테고리의 다른 글
테스트 환경에서 Rails 콘솔을 실행하고 test_helper.rb를 로드하는 방법은 무엇입니까? (0) | 2023.06.03 |
---|---|
Ruby에서 정규식의 모든 항목을 일치시키는 방법 (0) | 2023.06.03 |
POSTGRESQL에서 DATE에서 연도를 추출하는 방법 (0) | 2023.06.03 |
레일즈 앱에 대한 사용자 지정 구성 옵션을 만드는 가장 좋은 방법은 무엇입니까? (0) | 2023.06.03 |
Mipmap 대 그리기 가능한 폴더 (0) | 2023.06.03 |