首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >护照ensureAuthenticated

护照ensureAuthenticated
EN

Stack Overflow用户
提问于 2017-03-20 20:03:41
回答 2查看 1.2K关注 0票数 2

我想用Passport.jsGithub战略实现一个登录。下面是我使用的代码:

代码语言:javascript
复制
...

/* 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访问用户信息来查看用户信息?
  • 为什么注销路由不能工作?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-22 07:43:44

Foreword/Preamble

我和地方战略也有同样的问题。关于您的系统架构,我没有太多的信息,但是我的系统使用了以下内容:

  • PassportJS (w/本地战略)
  • ExpressJS处理会话&路由(w/ a Redis MemoryStore)
  • NodeJS服务器
  • AngularJS 2前端

事务要签出

  1. CORS在这个问题上扮演了重要的角色。

我使用cors库来缓解我在那里遇到的问题。特别是,我对配置做了以下更改:

代码语言:javascript
复制
let cors_config = {
    origin: "http://localhost:8080",
    credentials: true
};

这将您的CORS设置配置为包括在飞行前请求中的访问控制-允许-凭据:真正的标题。

  1. 确保内存存储和会话配置正确,

从没有指定的内存存储开始(默认是LocalStore)并从那里开始工作。我看你现在没在用,所以还是继续读吧。

代码语言:javascript
复制
server.use(session({
    secret: "secret_c0de",
    resave: false,
    saveUninitialized: false//,
    //store: new redis_store(redis_settings)
}));

检查在进行身份验证时,您的会话cookie在验证后是否返回。它应该包含一个键值,键为“connect.sid”,这是您的会话ID。

如果您没有获得会话cookie,那么您知道您的会话可能没有正确配置,在这种情况下,您应该:

  • 检查“使用”调用的加载顺序
  • 尝试并识别会话处理代码中的任何错误或问题。

如果您正在接收cookie,但是isAuthenticated()检查在后续请求中失败,这通常会提示您的MemoryStore无法工作。

  • 如果您最初使用的是LocalStore,这不需要太多配置,因此再次提示您的会话配置存在问题
  • 如果您正在使用像Redis这样的商店,试着听Redis事件 (主要是“连接”和“错误”)并将输出记录到控制台,这样您就可以看到它是否工作了。

是我在你的代码中注意到的

  • 检查您的序列化函数,您将序列化整个用户对象。

这更像是一种优化,但是已经注意到,仅仅序列化用户的ID并反序列化它,人们就会获得更大的成功。

代码语言:javascript
复制
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中返回,然后从那里继续。

  • 为什么我不能从req.user访问用户信息来查看用户信息?

用户在成功地尝试从Passport反序列化之后被注入。在您的示例中,会话从未创建过,从未序列化到您的MemoryStore中,因此永远无法反序列化(因为它不存在)。

  • 为什么注销路径不起作用?

req.logout()只适用于正在创建的成功会话。从您提供的其他代码和信息来看,我想这就是您所指的。

希望你能在这里找到一些有价值的信息,如果你想聊天的话,可以随意评论!:)

票数 1
EN

Stack Overflow用户

发布于 2017-03-22 08:00:13

了解和实现基于护照身份验证的代码的最佳来源就在这里。检查一次https://www.coursera.org/learn/server-side-development/lecture/Clovu/passport

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42912926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档