2015-10-20 110 views
2

所以我们有一个“web”服务器和一个API服务器 - 网络服务器提供HTML,API服务器提供JSON。Node.js Express - 在不同服务器上共享Passport会话

我们使用Passport的Twitter策略在网络服务器上进行身份验证。

我的问题是 - 什么是检查API服务器的最佳方法是,用Web服务器进行身份验证的用户也使用API​​进行身份验证?

我的假设是我们应该将大部分Passport代码放入Web服务器,让用户像往常一样使用Passport进行身份验证,并使用服务器中的某些中间件来检查用户是否登录(有会话):

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

您可能可以按照您的说法进行操作 - 使用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函数。