我想用Passport.js和Github战略实现一个登录。下面是我使用的代码:
...
/* Ensure Auth function */
function ensureAuthenticated(req, res, next){
if (req.isAuthenticated()) return next()
else res.redirect('/');
}
/* Some modules */
global.passport = require('passport');
global.GithubStrategy = require('passport-github2').Strategy;
global.util = require('util');
global.session = require('express-session');
global.bodyParser = require('body-parser');
global.methodOverride = require('method-override');
global.partials = require('express-partials');
global.request = require('request');
/* Passport */
passport.serializeUser(function(user, done){
done(null, user);
});
passport.deserializeUser(function(obj, done){
done(null, obj);
});
passport.use(new GithubStrategy({
clientID: config.githubID,
clientSecret: config.githubSecret,
callbackURL: config.githubURL
},
function(accessToken, refreshToken, profile, done){
process.nextTick(function(){
return done(null, profile);
});
}
));
app.use(partials());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(methodOverride());
app.use(session({secret: 'keyboard cat', resave: false, saveUninitialized: false}));
app.use(passport.initialize());
app.use(passport.session());
/* Controllers */
app.get('/auth/github', passport.authenticate('github', {scope: ['user:email']}), function(req, res){});
app.get('/auth/github/callback', passport.authenticate('github', { failureRedirect: '/' }), function(req, res){
res.redirect('/dashboard');
});
app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
我在Passport.js文档中搜索了很多,但是我找不到这些问题的答案:
发布于 2017-03-22 07:43:44
Foreword/Preamble
我和地方战略也有同样的问题。关于您的系统架构,我没有太多的信息,但是我的系统使用了以下内容:
事务要签出
我使用cors库来缓解我在那里遇到的问题。特别是,我对配置做了以下更改:
let cors_config = {
origin: "http://localhost:8080",
credentials: true
};这将您的CORS设置配置为包括在飞行前请求中的访问控制-允许-凭据:真正的标题。
从没有指定的内存存储开始(默认是LocalStore)并从那里开始工作。我看你现在没在用,所以还是继续读吧。
server.use(session({
secret: "secret_c0de",
resave: false,
saveUninitialized: false//,
//store: new redis_store(redis_settings)
}));检查在进行身份验证时,您的会话cookie在验证后是否返回。它应该包含一个键值,键为“connect.sid”,这是您的会话ID。
如果您没有获得会话cookie,那么您知道您的会话可能没有正确配置,在这种情况下,您应该:
如果您正在接收cookie,但是isAuthenticated()检查在后续请求中失败,这通常会提示您的MemoryStore无法工作。
是我在你的代码中注意到的
这更像是一种优化,但是已经注意到,仅仅序列化用户的ID并反序列化它,人们就会获得更大的成功。
passport.serializeUser(function(user, done){
done(null, user.id);
});
passport.deserializeUser(function(obj, done){
User.findById(obj, function(err, user){
if(err){/*code to handle error with not finding user*/}
done(null, user);
});
});回答您的问题
会话创建在您的应用程序中中断,因此您应该尝试并调试它。如前所述,您应该检查身份验证请求之后会话ID是否在会话cookie中返回,然后从那里继续。
用户在成功地尝试从Passport反序列化之后被注入。在您的示例中,会话从未创建过,从未序列化到您的MemoryStore中,因此永远无法反序列化(因为它不存在)。
req.logout()只适用于正在创建的成功会话。从您提供的其他代码和信息来看,我想这就是您所指的。
希望你能在这里找到一些有价值的信息,如果你想聊天的话,可以随意评论!:)
发布于 2017-03-22 08:00:13
了解和实现基于护照身份验证的代码的最佳来源就在这里。检查一次https://www.coursera.org/learn/server-side-development/lecture/Clovu/passport
https://stackoverflow.com/questions/42912926
复制相似问题