是否有可能使用PassportJS没有本地数据库?

我有一个应用程序使用与护照捆绑在一起的所有oAuth身份validation,但我正在使用外部服务来创build数据库/用户。

如果我做这样的事情:

passport.use('local-signup', new LocalStrategy({ usernameField : 'email', passwordField : 'password', passReqToCallback : true }, function(req, username, password, done) { request.post('http://myapiservice.com/createuser').then(function(err, response, body){ return done(err, body.user); }) })) 

我将如何使用这个远程存储的用户? 我没有以任何方式连接到数据库,除了一个POST API调用创build用户和一个GET调用来检索用户,所以我不知道req.user将如何performance/得到更新。

无法find一个单一的指南或其他地方的问题,所以会喜欢一点指导!

req.user将填充任何你通过调用donecallback的策略“返回”作为第二个参数。 在您的示例代码中,这将是body.user

对用户进行身份validation是完全合法的,而且您的代码示例似乎足够合理(前提是您并不是要从策略callback中创build用户,而是使用该远程API对其进行身份validation(请参阅下面的解释))。

有一点需要考虑的是,策略callback不是用户数据被“查找”的唯一地方,这也发生在passport.deserializeUser()callback中,这个callback会被每一个你想要validation的路由调用。

这取决于您要在会话中存储多less用户信息(这是serializeUser()作用)。 存储更多信息意味着您不必为deserializeUser()调用远程API,但这也意味着本地存储的(在会话中)用户数据可能与远程API不同步(如果可能的话) 。

编辑 :关于创build用户在策略callback:这不是非法的,但它取决于战略的types,如果它的build议。

对于通过远程服务实现身份validation的策略(如passport-facebook ,通常从策略callback中创build或更新用户,因为这是从远程服务接收信息的唯一入口点。

但是,在您的情况下,以及一般passport-local情况下,您可能只应使用策略callback进行身份validation,因为您无法始终访问创build新用户所需的所有用户信息。

最好创build一个单独的Express路由,发布创build用户表单,这将负责创build用户(无论是在本地数据库还是远程服务,就像你的情况一样)。