会话不是持久的 [PASSPORT]
Posted
技术标签:
【中文标题】会话不是持久的 [PASSPORT]【英文标题】:Sessions are not persistent [PASSPORT] 【发布时间】:2017-04-19 00:19:53 【问题描述】:我正在尝试通过 OAuth 2.0 实现登录,但是我无法让我的会话持续存在,似乎在用户通过身份验证后他们的会话就消失了。此外,该应用似乎在回调函数中的重定向处卡在 routes/bnetauth.js 中。
这些是我使用护照的文件
app.js
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
//TOOLS
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session'); //Persistant sessions
var passport = require('passport');
//REQUIRE MODELS
require('./models/News');
require('./models/Application');
//REQUIRE ROUTES
var bnetauth = require('./routes/bnetauth')(passport);
var api = require('./routes/api');
var public = require('./routes/public');
var admin = require('./routes/admin');
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/karatechop');
require('./config/passport')(passport);
var app = express();
app.use(express.static('views'));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: false ));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session(
secret: 'ilovescotchscotchyscotchscotch', // session secret
resave: true,
saveUninitialized: true
));
app.use(passport.initialize());
app.use(passport.session());
//Use Routes
app.use('/auth', bnetauth)
app.use('/api', api);
app.use('/admin', admin);
app.use('/', public);
// catch 404 and forward to error handler
app.use(function(req, res, next)
var err = new Error('Not Found');
err.status = 404;
next(err);
);
// error handler
app.use(function(err, req, res, next)
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : ;
// render the error page
res.status(err.status || 500);
);
module.exports = app;
routes/bnetauth.js(通过战网登录,因此是 bnetauth 名称)
var express = require('express');
var router = express.Router();
module.exports = function(passport)
router.get('/bnet',
passport.authenticate('bnet'));
router.get('/bnet/callback',
passport.authenticate('bnet',
failureRedirect: '/' ),
function(req, res, next)
console.log('Authenticated: ' + req.isAuthenticated())
####THIS IS WHERE IT GETS STUCK####
res.redirect('https://localhost:3000/');
);
配置/passport.js
var BnetStrategy = require('passport-bnet').Strategy;
var BNET_ID = 'hidden'
var BNET_SECRET = 'hidden'
var User = require('../models/user')
// expose this function to our app using module.exports
module.exports = function(passport)
console.log('Entering passport')
// =========================================================================
// passport session setup ==================================================
// =========================================================================
// required for persistent login sessions
// passport needs ability to serialize and unserialize users out of session
// used to serialize the user for the session
passport.serializeUser(function(user, done)
console.log('Serializing')
done(null, user.id);
);
// used to deserialize the user
passport.deserializeUser(function(id, done)
User.findById(id, function(err, user)
console.log('Deserializing')
done(err, user);
);
);
passport.use(new BnetStrategy(
clientID: BNET_ID,
clientSecret: BNET_SECRET,
region: 'eu',
callbackURL: "https://localhost:3000/auth/bnet/callback"
, function(accessToken, refreshToken, profile, done)
console.log(profile)
console.log(accessToken)
User.findOne(id: profile.id, function(err, user)
console.log("Trying!")
if(err)
return done(err);
if(user)
return done(null, user);
else
var newUser = new User();
newUser.id = profile.id,
newUser.token = accessToken,
newUser.battle_tag = profile.battletag
newUser.save(function(err)
if (err)
throw err;
return done(null, newUser);
);
);
));
;
return router;
【问题讨论】:
【参考方案1】:我找到了解决问题的方法!
问题在于我在config/passport.js
中的序列化和反序列化函数
在我的用户模型上,我有两种形式的 id。
-
mongo应用的_id
我从 users 对象中保存的 ID 从 Battle.net 传回给我(这是 Battle.net 上的用户 ID)。
在序列化中,将用户序列化到会话时使用的 id 将是战网 id(因为我调用的是 user.id
而不是 user._id
然后,在从用户对象中提取数据时的反序列化中,我使用了 mongo 的 findById 函数,该函数使用了._id
(这与我的用户对象中的.id
完全不同,因此它返回了'undefined'
。
将序列化函数中的.id
更改为._id
解决了我的问题,并且会话现在可以正常工作并且是持久的。
【讨论】:
以上是关于会话不是持久的 [PASSPORT]的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.7 在播种机中使用 Passport 进行测试
Laravel 5.4建站06--API 认证系统 Passport