您如何解释Passport序列化和反序列化方法的工作流程.
user.id去哪儿passport.serializeUser打电话?
我们正在呼吁passport.deserializeUser它在哪里适合工作流程?
// used to serialize the user for the session
passport.serializeUser(function(user, done) {
done(null, user.id);
// where is this user.id going? Are we supposed to access this anywhere?
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
Run Code Online (Sandbox Code Playgroud)我仍然试图绕过它.我有一个完整的工作应用程序,并没有遇到任何类型的错误.
我只是想了解这里到底发生了什么?
任何帮助表示赞赏.
我是expressjs和passportjs的初学者.我通过Google使用GoogleStrategy的护照进行身份验证.使用下面的代码我在/ users/hello路由处理程序中有req.user = {id:'123456'},但是我希望在没有会话支持的情况下得到一些这样的代码来将其作为经过身份验证的客户端的答案发送.换句话说,如果身份验证成功,我想向客户端发送一些令牌,而不启动cookie会话.当我关闭会话时,我找不到如何将用户对象转发到目标路由处理程序的方法.
passport.use(new GoogleStrategy({
returnURL: 'http://localhost/auth/google/return',
realm: 'http://localhost/'
},
function(identifier, profile, done) {
done(null, {id: '123456'});
}
));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
done(null, {id: id});
});
app.use(session({ secret: 'keyboard cat' }));
app.use(passport.initialize());
app.use(passport.session());
app.get('/auth/google', passport.authenticate('google');
app.get('/auth/google/return',
passport.authenticate('google', {
successRedirect: '/users/hello',
failureRedirect: '/users/goodbye'
}));
Run Code Online (Sandbox Code Playgroud) 我的问题与这个问题非常相似,但答案似乎对我不起作用(我看到用户也从未选择过答案).
我全新安装了Nodejs和Express.
我的设置:
app.use(express.static(path.join(__dirname, 'public')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser('hithere'));
app.use(session({
secret: 'hithere',
resave: false,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done) {
console.log('Serialize user called.');
return done(null, user);
});
passport.deserializeUser(function(id, done) {
console.log('Deserialize user called.');
return done(null, user);
});
passport.use(new LocalStrategy(
function(username, password, done) {
console.log('local strategy called with: %s', username);
return done(null, {username:username, password:password});
}));
app.use('/', routes);
app.use('/users', users);
app.get('/success', function(req, res) {
req.send('sucess!');
});
app.get('/failure', function(req, res) {
req.send('failure!');
})
app.post('/register', function(req, res) …Run Code Online (Sandbox Code Playgroud) 我正面临一个会话问题,在成功通行后获取req.user未定义。验证方法。
基本上在注册或登录后,当我重定向时,无法在请求变量中找到“用户”。
我使用了一个使用 mongo 的 hackathon starter,我试图改变一些东西来使用 Postgres。
编辑 - 在遵循评论建议之后
现在注册流程工作正常,但登录流程有一些问题。发生了一些奇怪的事情,当我添加很多断点时,它似乎间歇性地登录。使用评论建议更新代码
应用程序.js
const express = require('express');
const compression = require('compression');
const session = require('express-session');
const bodyParser = require('body-parser');
const logger = require('morgan');
const chalk = require('chalk');
const errorHandler = require('errorhandler');
const lusca = require('lusca');
const dotenv = require('dotenv');
const flash = require('express-flash');
const path = require('path');
const passport = require('passport');
const expressValidator = require('express-validator');
const expressStatusMonitor = require('express-status-monitor');
const sass = require('node-sass-middleware');
const multer = …Run Code Online (Sandbox Code Playgroud) 最初的问题: 我在后端使用passportJS,并使用MongoStore作为会话存储,并使用react前端。
我想做的是允许用户拥有持久的登录会话。已经有一个由express-session 自动设置的名为connect.sid 的cookie。然而,会话似乎不是持久的,因为req.user在使用登录时设置的相同 cookie 的后续请求中未定义该会话。req.user不断返回未定义,这意味着护照没有以某种方式验证会话cookie。
根据护照的文件,这是不应该发生的。
每个后续请求将不包含凭据,而是包含标识会话的唯一 cookie。为了支持登录会话,Passport 将对会话中的用户实例进行序列化和反序列化。
那么我想了解的是 PassportJS 到底如何处理客户端发送的 cookie?
有人可以帮我解释一下护照在这方面采取的步骤吗?
我还在我的猫鼬模型中使用了 Passport-local-mongoose 插件,其中包括下面 auth.js 中使用的内置身份验证/序列化/反序列化方法。
我的代码的相关部分供参考:
app.js:(没有包含完整的文件,因此可以很清楚,因为它有 100 多行,如果有人建议这可能是中间件顺序的问题,我将包含完整的代码)
//session and passport initialization
const sessionStore = new MongoStore({
mongooseConnection: mongoose.connection,
collection: "sessions",
});
app.use(
session({
secret: process.env.SERVER_SECRET_KEY,
resave: false,
saveUninitialized: false,
store: sessionStore,
cookie: {
path:"/",
httpOnly: true,
expires: 9999999999999999
}
})
);
app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)
auth.js
const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;
const config = require("./config"); …Run Code Online (Sandbox Code Playgroud) 我创建了一个简单的项目,有 3 个页面:主页、联系人和关于。
一切正常,然后我想用 mongo 添加用户注册。
所以我跟着这个教程
但是,当我添加一些新路线时,我无法访问更多页面。
这是我index.js可以访问我的 3 页的时候
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
/* GET contact page. */
router.get('/contact', function(req, res) {
res.render('contact');
});
/* POST contact page (submit). */
router.post('/contact', function(req, res) {
res.render('contact', { name: req.param('name') });
});
/* GET home page. */
router.get('/home', function(req, res) {
res.render('home');
});
/* POST home page (submit). …Run Code Online (Sandbox Code Playgroud) 好了,我这有一个类似的问题这一个(我知道这是类似于另一个)。但是req.user在我安装@types/passport之前是未定义的。
现在我在 VS Code 中遇到了这个问题,尽管我的服务器上有我的会话实例。

// Middlewares
app.use(bodyParser.urlencoded({ extended: false }));
app.use(logger(process.env.NODE_ENV === 'development' ? 'dev' : 'combined'));
app.use(express.json());
app.use(session({
secret: process.env.NODE_ENV === 'development' ? process.env.SESSION_SECRET : 'secret',
resave: false,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)
上面没有错误。因此......该应用程序实际上可以工作......但我在我的 VSC 文件中得到了这种“错误颜色”,这是很好的避免。有什么建议?
以防万一,我将包含整个路由器文件:
// POST - Crear usuario
router.post('/', async (req: Request, res: Response) => {
const resultado: IResultado = {
data: null,
ok: false
};
const messages: Array<object> = [];
const datos: IUsuario = req.body; …Run Code Online (Sandbox Code Playgroud) 我通过使用iisnode使用IIS节点,我遇到了设置CookieSession选项的麻烦secure:true.
我在IIS上使用HTTPS,我将任何HTTP重定向到HTTPS.但即便如此,如果我设置了CookieSession选项secure:true,则会话在登录后将不会有任何内容.
secure:一个布尔值,指示cookie是否仅通过HTTPS发送(HTTP默认为false,HTTPS默认为true).
我被迫使用secure:false它来使它工作.为什么?
passport.js ×7
express ×6
node.js ×6
cookies ×2
javascript ×2
session ×2
iis ×1
iisnode ×1
mongodb ×1
typescript ×1