【问题标题】:Passport ensureAuthenticated护照确保认证
【发布时间】:2017-03-20 20:03:41
【问题描述】:

我想用 Passport.jsGithub 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


【解决方案1】:

前言/序言

Local Strategy 遇到了同样的问题。我没有太多关于您系统架构的信息,但是我的系统使用了以下内容:

  • PassportJS(带本地策略)
  • ExpressJS 处理会话和路由(使用 Redis MemoryStore)
  • NodeJS 服务器
  • AngularJS 2 前端

要结帐的东西

  1. CORS 在此问题中发挥了重要作用。

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

let cors_config = {
    origin: "http://localhost:8080",
    credentials: true
};

这会将您的 CORS 设置配置为在预检请求中包含 Access-Control-Allow-Credentials: true 标头。

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

从没有指定的内存存储开始(默认为 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 无法正常工作。

  • 如果您最初使用的是 LocalStore,则不需要太多配置,因此再次提示您的会话配置存在问题
  • 如果您使用的是 Redis 之类的存储,请尝试收听 Redis events(主要是“连接”和“错误”)并将输出记录到控制台,以便查看它是否正常工作。李>

我在你的代码中注意到了

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

这更像是一种优化,但已经注意到人们在序列化用户 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);
    });
});
  • 您应该要求 cookie-parser,因为会话使用会话 cookie。

回答您的问题

  • 为什么在我的情况下,会话不保存身份验证?

您的应用程序中的会话创建中断,因此您应该尝试调试它。如上所述,您应该在您的身份验证请求之后检查会话 ID 是否在会话 cookie 中返回,然后从那里继续。

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

在从 Passport 成功反序列化尝试后注入用户。在您的情况下,会话一开始就不会被创建,也不会被序列化到您的 MemoryStore 中,因此永远不会被反序列化(因为它不存在)。

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

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

希望您在这里找到一些有价值的信息,如果您想特别聊聊,请随时发表评论! :)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 2015-09-23
      • 2019-03-01
      • 1970-01-01
      • 2015-07-03
      • 2012-07-13
      • 2019-12-07
      相关资源
      最近更新 更多