是否有 Passport 策略来处理非 OAuth 的异地 API?

Is there a Passport Strategy to handle an offsite API which isn't OAuth?

我这里有一个相对独特的用例,我找不到完美的解决方案。

我有一个网站,用户可以通过 facebook 和 linkedin 登录,它可以通过 passportjs 完美运行。 但是,我还需要能够通过非现场 API 登录,这不是 OAuth,而是提供标准 JSON 响应。

我目前使用 angular 来访问 API 和 return 用户对象,但我必须将其存储在 sessionStorage 中以保持登录。这并不理想因为这意味着有一个服务器会话和一个本地会话。要注销,我必须手动清除 sessionStorage,这会命中服务器的注销路径。

我想做的是在 ExpressJS 网站上创建一个本地登录路径,然后路由点击 API 登录,然后将用户存储在服务器会话中。

最后我破解了本地攻略

关键是添加 passReqToCallback 以便我可以操纵请求。

这会将响应添加到 req.user 并启动会话。

策略:

var passport = require('passport'),
    LocalStrategy = require('passport-local').Strategy,
    request = require('request')

module.exports = function() {
    passport.use(new LocalStrategy({
            passReqToCallback: true
         },
         function(req, username, password, done) {
             request.post({
                url: 'http://api/',
                form: {
                    username: username,
                    password: password
                },
                json: true
            }, function(err, httpResponse, body) {
                if (err || !body.success) done();
                else done(null, body);
            });
        }
    ));
};

路线:

app.post('/auth/local',
    passport.authenticate('local', {
        failureRedirect: '/fail'
    }),
    function(req, res) {
        res.redirect('/success');
    });