在KrakenJS中,如何在另一个之前声明Passport中间件?

时间:2016-09-05 10:27:03

标签: express passport.js kraken.js

我在Kraken项目中使用Passport进行身份验证。 当我调用authenticate时,我传递“failWithError:true”,因此将错误传递给“next”回调。然后我在config.json中声明了一个errorHandler中间件:

"errorHandler": {
    "priority": 130,
    "module": "path:./lib/errorHandler"
}

我的问题是护照直接返回错误,所以我猜这是优先考虑的问题。

我试过这样注册护照:

app.requestBeforeRoute = function requestBeforeRoute(server) {
    server.use(passport.initialize());
};
passport.use(auth.localApiKeyStrategy());

就像这样:

app.on('middleware:before:errorHandler', function (eventargs) {
    passport.use(auth.localApiKeyStrategy());
    app.use(passport.initialize());
});

但它不起作用。 另外,我发现了这个:Adding a way to configure a scope to factory function但我还没有真正得到它的工作原理。

非常感谢。

1 个答案:

答案 0 :(得分:0)

所以,最后我提出了一个解决方案。在我的情况下,我不需要护照中的会话中间件,因为我正在开发REST API。

首先,config.json中的护照声明:

"passport": {
    "enabled": true,
    "priority": 10,
    "module": {
        "name": "passport",
        "method": "initialize"
    }
}

然后在index.js中,我说护照使用我的策略:

passport.use(auth.localApiKeyStrategy());

最后,在模型的控制器中,我实现了一个自定义回调,因为Passport文档说你可以,我位于auth.js

router.get('/', function(req, res, next) {
    auth.authenticate(req, res, next, function() {
        // authenticated
        // stuff to do when authenticated
    });
});

// auth.js
exports.authenticate = function(req, res, next, callback) {
    passport.authenticate('localapikey', function(err, device) {
        if (err) {
            return next(err);
        }
        if (!device) {
            err = new Error();
            err.code = statusWell.UNAUTHORIZED;
            return next(err);
        }
        callback();
    })(req, res, next);
};

现在我可以使用下一个函数来处理身份验证并将错误传递给我的errorHandler中间件。