Node.js Express - 在不同服务器上共享Passport会话

时间:2015-10-20 07:40:19

标签: node.js session express passport.js

所以我们有一个" 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()函数,该函数以异步方式从会话存储中读取...

有没有人有一个如何做到这一点的例子?

1 个答案:

答案 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函数。