如何使用护照调用反序列化用户
Posted
技术标签:
【中文标题】如何使用护照调用反序列化用户【英文标题】:How to call deserializeUser with passport 【发布时间】:2018-03-03 02:01:58 【问题描述】:我发现了以下关于 deserializeUser 应该如何工作的帖子:PassportJS serializeUser and deserializeUser execution flow
但是,当我尝试将包含用户密钥的 JSON 发送到服务器时,我无法调用 req.user 来查找用户的详细信息。
我不确定如何检查发生了什么,因为很多事情都在幕后发生。
passport 是否希望我发送一个包含密钥的 cookie 来表达? cookie 或格式的任何特定名称? 是否要求我以 JSON 格式发送密钥?
const express = require('express')
const app = express()
const mongoose = require('mongoose')
var cors = require('cors')
const bodyParser = require('body-parser')
var http = require('http')
var cookieParser = require('cookie-parser');
app.use(cookieParser('someSecret'));
var session = require('express-session');
app.use(session());
var flash=require("connect-flash");
app.use(flash());
passport.use(new LocalStrategy(
usernameField: 'username',
passwordField: 'password',
session: true,
passReqToCallback: true
,
function(req, username, password, done)
registrationModel.findOne(username: username, function(err, user)
if (err) return done(err);
if (!user)
console.log("Username incorrect")
return done(null, false, message: 'Incorrect username.');
if (user.password != password)
console.log("Password Incorrect")
return done(null, false, message: 'Incorrect Password.');
else
console.log("Returning good stuff")
console.log(user)
return done(null, user);
);
));
//Needed for authenticating the session and initializing passport
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done)
console.log("Serializing User")
console.log(user.id)
console.log("Should be serialized")
done(null, user.id);
);
passport.deserializeUser(function(id, done)
users.User.findById(id, function(err, User)
console.log('attempting to deserialize user')
console.log(user)
console.log('--------------')
if (User)
done(err, User);
else
done(err, null);
)
)
app.post('/api/authenticate', passport.authenticate('local'),
function(req, res)
const individualIWant = jsonQuery('req.sessionStore.sessions')
res.cookie('FreeUp', req.session.passport.user)
var cookie = JSON.stringify(req.session.passport.user)
res.send('name': 'FreeUp', 'value': cookie)
)
我可以在浏览器中看到一个 cookie: 名称:“免费” 值:“”59c4cf4ecb364a000f23a707“”
该值是对象的数据库 ID,而不是序列化对象的键。我知道我需要使用 res.req.sessionID 来访问序列化对象的密钥并将其发回。
但问题仍然存在,我不知道是将其作为 json 文件还是 cookie 发送回来。它似乎是一个使用起来很复杂的库。
当我从 Ember 发回数据时,护照希望我使用哪种格式?
谢谢!
【问题讨论】:
您能展示一下您是如何配置您的应用程序的吗?您的问题的答案很大程度上取决于此。 【参考方案1】:我也遇到了很多麻烦。
据我了解,Passport 本身实际上并没有创建会话。所以你需要使用另一个中间件,比如 express-session,你还需要一个 cookie 解析器。
我使用他们在 Scotch 提供的教程构建了我的身份验证:https://scotch.io/tutorials/easy-node-authentication-setup-and-local。它的评论非常好,并且是我能找到的唯一直接的教程(尤其是对于本地身份验证)。我可以验证它是否对我有用,并且当我在路由中传递它时,req.user 正在存储所有凭据。
希望对您有所帮助。
【讨论】:
以上是关于如何使用护照调用反序列化用户的主要内容,如果未能解决你的问题,请参考以下文章