【发布时间】:2017-03-20 20:03:41
【问题描述】:
我想用 Passport.js 和 Github Strategy 实现登录。这是我使用的代码:
...
/* 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 文档中搜索了很多,但我找不到这些问题的答案:
- 在我的情况下,为什么会话不保存身份验证?例如,如果我在路由上设置了 ensureAuthenticated 中间件,它总是将我重定向到 /,登录表单在哪里。
- 为什么我无法从 req.user 访问用户信息以查看用户信息?
- 为什么 logout 路径不起作用?
【问题讨论】:
-
哈哈,我现在也遇到同样的问题。如果您检查您的请求(使用您的 Chrome/Firefox 开发人员工具或 POSTMAN),您的会话 cookie 是否在您的身份验证请求后返回? (它应该包含键 'connect.sid' 和会话 id 值)
-
你解决了吗?我的想法是它不保存会话,但我想存储会话的是 Mongo/Redis。我想这会奏效。
-
好吧,我昨晚确实让它工作了,我会尽快写一个答案,详细说明我所做的事情。在我做之前,你有像 Angular 这样的特定前端吗?还是在 NodeJS 服务器中准备视图?
-
啊,我看到你在使用'partials',我认为假设你在服务器上呈现你的视图是安全的
标签: javascript node.js passport.js