是否有 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');
});
我这里有一个相对独特的用例,我找不到完美的解决方案。
我有一个网站,用户可以通过 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');
});