如何使用护照调用反序列化用户

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 正在存储所有凭据。

希望对您有所帮助。

【讨论】:

以上是关于如何使用护照调用反序列化用户的主要内容,如果未能解决你的问题,请参考以下文章

当护照js中的序列化和反序列化调用时

关于护照序列化/反序列化用户中的回调函数的困惑

Passport js 序列化用户和反序列化用户

TypeError:User.findById 不是反序列化用户的函数

nodejs护照身份验证令牌

passport.deserializeUser 从不调用