【问题标题】:refactoring passport.js authentication code重构passport.js认证代码
【发布时间】:2020-02-19 10:35:16
【问题描述】:

我们有一个像这样的passport.js 文件:

const axios = require('axios')
const uuid = require('uuid/v4')
const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy
const session = require('express-session')
const mongoStore = require('connect-mongo')(session)

module.exports = (app) => {
    const users = [
        {
            id: '2f24vvg',
            email: 'test@test.com',
            password: 'password'
        }
    ]

    const mongoSessionStore = new mongoStore({
        url: 'mongodb://localhost/test-app',
        ttl: 30 * 60 // 30 min
    })

    let sess = {
        genid: (req) => {
            console.log('Inside the session middleware')
            console.log(req.sessionID)
            return uuid()
        },
        store: mongoSessionStore,
        secret: 'keyboard cat', // password from environment
        resave: false,
        rolling: true,
        saveUninitialized: true,
        unset: 'destroy', // removes the session from the server when end() is called
        cookie: {
            HttpOnly: true,
            maxAge: 30 * 60 * 1000 // 30 minutes
        }
    }

    app.use(session(sess))

    passport.use(new LocalStrategy(
        { usernameField: 'email' },
        (email, password, done) => {
            axios.get(`http://localhost:5000/users?email=${email}`)
                .then(res => {
                    const user = res.data[0]
                    if (!user) {
                        return done(null, false, { message: 'Invalid credentials.\n' })
                    }
                    if (password != user.password) {
                        return done(null, false, { message: 'Invalid password.\n' })
                    }
                    return done(null, user)
                })
                .catch(error => done(error))
        }
    ))

    passport.serializeUser((user, done) => {
        console.log('Inside serializeUser callback. User id is saved to the session store')
        done(null, user.id)
    })
    passport.deserializeUser((id, done) => {
        axios.get(`http://localhost:5000/users/${id}`)
            .then(res => done(null, res.data))
            .catch(error => done(error, false))
    })

    app.use(passport.initialize())
    app.use(passport.session())
}

我们有多个路由器文件包含相同的功能isAuthorized

function isAuthorized(req, res, next) {
    if (req.isAuthenticated()) {
        console.log('Is allowed')
        next()
    }
    else {
        console.log('Is not allowed')
        res.sendStatus(401)
        // res.redirect('/')
    }
}
// Example in use:
router.get('/secure', isAuthorized, (req, res) => {
    res.format({
        html: () => {
            res.render('secure')
        },

        json: () => {
            res.send({ message: 'you reached the secure endpoint' })
        }
    })
})

为了避免在每个routes.js 文件中包含函数isAuthorized,我们试图将其移动到一个模块中。为此,我认为将其添加到 passport.js 的末尾就足够了,如下所示:

module.exports = function isAuthorized(req, res, next) {
    if (req.isAuthenticated()) {
        console.log('Is allowed')
        next()
    }
    else {
        console.log('Is not allowed')
        res.sendStatus(401)
        // res.redirect('/')
    }
}

但是,当我们尝试在 route.js 文件中使用它时,我们会收到错误:

TypeError: req.isAuthenticated 不是函数

这个功能如何与路由分开并且仍然可以使用?感谢您的帮助。

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

    这就是你的中间件函数的样子

     module.exports = (req, res, next) => {
    
            if (req.Authenticated()) {
                return next();
    
            } else {
    
                res.status(401);
            }
        }
    

    这就是您在其他(即 server.js)文件中使用中间件的方式

        const theMiddleWare = "/middlewareDir";
        app.use("/routes",theMiddleWare(),"routeDir");
    // before doing this you have to add the passport middleware
    

    【讨论】:

    • 问题是方法isAuthenticated在模块passport.js中是未知的
    • 您必须在添加自定义中间件之前添加护照中间件,然后 req.isAuthenticated() 才能工作
    • 我可以在哪个文件中创建我的中间件函数isAuthorized?我需要在文件中require('passport') 吗?你能举个小例子说明将中间件放在不同的文件中吗?
    • 我已经编辑了我的问题,我希望澄清它
    • 谢谢,但我仍然遇到同样的错误。我已将您的代码添加到名为isAuthorized.js 的文件中,在route.js 的顶部我有const isAuthorized = require('../helpers/isAuthorized'),然后在router 中我们使用router.get('/secure', isAuthorized(), (req, res) => {。还是一样的错误:(
    猜你喜欢
    • 2016-11-12
    • 2014-06-17
    • 1970-01-01
    • 2015-01-01
    • 2013-10-08
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多