繁体   English   中英

Node.js 护照认证忽略控制器功能

[英]Node.js passport authentication ignores controller function

如果护照返回用户 { status: 200 }:

护照.js

...
return done(null, rows[0], { status: 200 });
...

我希望调用控制器“controllerLogin.login”:

路由/index.js

const express = require('express');
const passport = require('passport');
const passportConf = require('../passport');
const controllerLogin = require('../controllers/login');
...

router.route('/v1/login')
    .post( function(req, res, next) {

        passport.authenticate('local-login', function (err, user, context = {}) {
            if (err) {
                console.log(err);
            }
            if (context.status === 429) {
                return res.status(429).send({ status: 429, success: false })
            }
            if (context.status === 401){
                return res.status(401).send({ status: 401, success: false })
            }
            next();
            //return;

        })(req, res, next);

}, controllerLogin.login );

但我无法访问控制器“controllerLogin.login”。 我错过了什么以及如何执行“controllerLogin.login”?

下面的工作,但我需要更高的版本。

const passLogin = passport.authenticate('local-login', { session: false, failWithError: true });

router.route('/v1/login')
    .post( passLogin, function(err, req, res, next) {
        return res.status(401).send({ status: 401, success: false })
}, controllerLogin.login );

编辑:什么有效......

router.route('/v1/login')
    .post( function(req, res, next) {

        passport.authenticate('local-login', { session: false, failWithError: false }, function (err, user, context = {}) {
            if (err) {
                console.log(err);
            }
            if (context.statusCode === 429) {
                return res.status(429).send({ status: 429, success: false, message: { name: 'Rate Limit Error' } })
            }
            if (context.statusCode === 401){
                return res.status(401).send({ status: 401, success: false, message: { name: 'Authentication Error' } })
            }

            // this works getting user information
            console.log('user:');
            console.log(user);

            next();

        })(req, res, next);

}, /*controllerLogin.login*/ (req, res) => { res.status(200).json({just: 'testing'})} );

控制器/登录.js

module.exports = {
    login: async (req, res, next) => {

        // Can't access user information via 'req.user' anymore 
        console.log('req.user:');
        console.log(req.user);  

        /* .. How to access user information here?  .. */

        res.status(200).json({just: 'testing'})

  }
}

这听起来像 controllerLogin.login 想要req.user ,但没有被设置。 因此,请尝试在传入护照authenticate功能的回调中手动执行此操作。

router.route('/v1/login')
    .post( function(req, res, next) {

        passport.authenticate('local-login', { session: false, failWithError: false }, function (err, user, context = {}) {
            if (err) {
                console.log(err);
                return next(err); // might want to add this line to handle errors?
            }
            if (context.statusCode === 429) {
                return res.status(429).send({ status: 429, success: false, message: { name: 'Rate Limit Error' } })
            }
            if (context.statusCode === 401){
                return res.status(401).send({ status: 401, success: false, message: { name: 'Authentication Error' } })
            }
            if(!user) {
                // might want to handle this separately? user not found?
                //return next('User not found');
            }

            // this works getting user information
            console.log('user:');
            console.log(user);

            req.user = user;
            next(); // this moves us on to controllerLogin.login

        })(req, res, next);

}, controllerLogin.login);

然后在控制器/登录

module.exports = {
    login: (req, res) => {
        // remove user logging once this works, don't want to log sensitive info (!)
        console.log('req.user in controller/login:')
        console.log(req.user)

        // user logic here

        res.status(200).json({status: 200, success: true})
  }
}

值得一看“自定义回调”部分下的passportjs文档 该示例不会像您所做的那样传递给另一个函数,但它可以帮助您了解另一种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM