如何使用护照

时间:2017-09-21 16:12:01

标签: javascript authentication passport.js

我发现以下关于deserializeUser应如何工作的帖子:PassportJS serializeUser and deserializeUser execution flow

但是当我尝试将JSON发送到包含用户密钥的服务器时,我无法调用req.user来查找用户的详细信息。

我不确定如何查看正在发生的事情,因为很多内容正在进行中。

护照是否期望我发送包含密钥的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: 名:" FreeUp" 值:"" 59c4cf4ecb364a000f23a707""

该值是对象的数据库ID,而不是序列化对象的键。我知道我需要使用res.req.sessionID来访问序列化对象的密钥,然后将其发回。

然而,这一点仍然存在,我不知道是否将其作为json文件或cookie发回。它看起来像是一个复杂的库。

从Ember发回数据时,护照希望我使用哪种格式?

谢谢!

1 个答案:

答案 0 :(得分:0)

我也遇到了很多麻烦。

据我所知,Passport实际上并没有创建会话。所以你需要使用另一个中间件,比如快速会话,你还需要一个cookie解析器。

我使用他们在Scotch上的教程构建了我的身份验证:https://scotch.io/tutorials/easy-node-authentication-setup-and-local。它是非常好的评论和我能找到的唯一直接的教程(特别是对于本地身份验证)。我可以验证它对我有用,当我在路由中传递时,req.user正在存储所有凭据。

希望有所帮助。