所以我们有一个" web"服务器和API服务器 - Web服务器提供HTML,API服务器提供JSON。
我们使用Passport的Twitter策略在 web 服务器上进行身份验证。
我的问题是 - 检查API服务器上用Web服务器验证过的用户是否也通过API进行身份验证的最佳方法是什么?
我的假设是我们应该将大部分Passport代码放入Web服务器,让用户像往常一样使用Passport进行身份验证,并使用 API 服务器中的一些中间件来检查如果用户已登录(有会话):
app.use(passport.initialize());
app.use(passport.session());
app.use(expressSession({
secret: 'keyboard cat',
store: new MongoStore({mongooseConnection: mongoose.connection})
}));
app.use(function(req,res,next){
if(req.isAuthenticated()){
next();
}
else{
console.log('unauthenticated request');
res.status(403).json({error:'unauthorized request'});
}
});
但是,上述情况似乎还不够。我对API服务器上需要的代码完全感到困惑 - 我相信我需要从Web服务器写入的同一会话存储中读取并查看API服务器请求中的令牌并将其与会话商店中的令牌?
我不确定我是否了解req.isAuthenticated()函数的作用?好像我现在需要编写自己的req.isAuthenaticated()函数,该函数以异步方式从会话存储中读取...
有没有人有一个如何做到这一点的例子?
答案 0 :(得分:1)
您可以按照自己的说法进行操作 - 使用Web服务器进行身份验证,并验证是否使用API对其进行了身份验证。
假设两个服务器共享同一个远程会话存储,并且两个端点都可以访问快速会话cookie,那么您应该能够为API实现类似的功能:
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated())
return next();
else
// Not authenticated
}
或者
if (req.user) {
// logged in
} else {
// not logged in
}
作为中间件(如您在示例中所示)或per-route basis。
如果您无法访问相同的共享会话cookie,这可能不可行。其他选项可能是可用的,具体取决于您的应用程序的内置结构,即。 - 如果Web服务器直接与API通信。
您可以从护照github中读取原始req.isAuthenticated函数。