ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – 如何处理passport.deserializeUser()中的错误?

2019-06-11 11:32:07  阅读:270  来源: 互联网

标签:javascript node-js passport-js


我已经像这样配置了Express和Passport:

var express = require("express");
var site = express();
var flash = require("connect-flash");
var passport = require("passport");

site.use(require("cookie-parser")());
site.use(require("body-parser").urlencoded({extended:false}));
site.use(require("express-session")(...));
site.use(flash());
site.use(passport.initialize());
site.use(passport.session());

我有一个很好的股票实现deserializeUser(我正在使用由Bookshelf支持MySQL的本地身份验证):

var db = require("./database.js"); // exports models e.g. db.User

passport.deserializeUser(function(id, done) {
    db.User.findById(id).then(function (user) {
        done(null, user);
    }).catch(function (err) {
        done(err, null);
    });
});

我遇到了以下特定问题:当从数据库中删除登录用户时(例如,当站点管理员删除用户时),反序列化失败,如预期的那样,具有来自的CustomError(“EmptyResponse”)书架.但是,我不知道如何处理它; done(err,null)最终只会导致错误消息和堆栈跟踪以HTML格式发送回客户端.

问题是:如何在失败时从deserializeUser提供自定义,优雅的错误处理?

现在,如果它简化了事情,我可以在db.User.findById调用中添加{require:false}给我一个空用户而不是错误,但我仍然不知道如何处理它(我还是确实需要处理错误对象,例如,如果数据库服务器已关闭并且存在连接错误).

我想要失败的操作是将用户重定向回登录页面,可能带有描述性的flash消息,但我没有访问deserializeUser中的请求/响应,我不知道如何通信背部.

解决方法:

我找到了一个解决方案.这里的错误可以在Express中间件错误处理程序中处理.所以,例如:

// Note: Must be used *after* passport middleware.
site.use(function(err, req, res, next) {
    if (err) {
        // Handle deserialization errors here.
    } else {
        next();
    }
});

但一个重要的警告是,如果反序列化失败不可恢复,通过护照访问的所有路由(即使不需要身份验证的路径)将继续失败,这很可能还包括您的登录和注销端点,从而永久性地断开访问直到用户清除他们的饼干.所以你必须强制退出,这是唯一真正的恢复方式:

site.use(function(err, req, res, next) {
    if (err) {
        req.logout(); // So deserialization won't continue to fail.
    } else {
        next();
    }
});

在此基础上进一步构建,在我的情况下,我想通过flash消息重定向回登录页面.但是你必须要小心:如果登录页面本身发生错误,你需要避免无限重定向,所以:

site.use(function(err, req, res, next) {
    if (err) {
        req.logout();
        if (req.originalUrl == "/loginpage") {
            next(); // never redirect login page to itself
        } else {
            req.flash("error", err.message);
            res.redirect("/loginpage");
        }
    } else {
        next();
    }
});

当然,您可能只想对CustomError(“EmptyResponse”)执行此操作,或者甚至重新执行deserialize实现中的错误处理,以使其抛出您自己更具体的错误.

有点奇怪的方法,但似乎完成了工作.打开更清洁的建议.

标签:javascript,node-js,passport-js
来源: https://codeday.me/bug/20190611/1218405.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有