【问题标题】:Node.js Express - sharing Passport sessions on different serversNode.js Express - 在不同服务器上共享 Passport 会话
【发布时间】:2016-01-18 18:19:32
【问题描述】:

所以我们有一个“网络”服务器和一个 API 服务器——网络服务器提供 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() 函数,该函数从会话存储中异步读取...

有没有人举例说明如何正确地做到这一点?

【问题讨论】:

    标签: node.js session express passport.js


    【解决方案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,这可能不可行。其他选项可能可用,具体取决于您的应用程序内置的结构,即。 - 如果网络服务器直接与 API 对话。

    您可以从护照 github 中读取原始的 req.isAuthenticated 函数。

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 2018-05-18
      • 1970-01-01
      • 2014-04-16
      • 2018-10-02
      • 2016-06-17
      • 2014-07-11
      • 1970-01-01
      • 2014-05-20
      相关资源
      最近更新 更多