我有一个应用程序,它使用与护照捆绑在一起的所有oAuth身份验证,但我使用外部服务来创建数据库/用户。
如果我这样做:
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调用和用于检索用户的GET调用之外,我没有以任何方式连接到数据库,因此我不确定Express' req.user
会表现/得到更新。
在其他地方无法找到关于此的单一指南或问题,所以会喜欢一些指导!
答案 0 :(得分:2)
req.user
将填充您的任何内容"返回"通过调用策略的done
回调作为第二个参数。在您的示例代码中,这将是body.user
。
以您想要的方式对用户进行身份验证是完全合法的,并且您的代码示例似乎足够合法(前提是您并不意味着创建来自策略的用户回调,但使用该远程API验证一个(见下面的解释))。
要考虑的一件事是,策略回调并不是用户数据获取的唯一地方#34;这也发生在passport.deserializeUser()
回调中,后者被调用您想要进行身份验证的每条路线。
由您决定要在会话中存储多少用户信息(这是serializeUser()
所做的)。存储更多信息意味着您不必为deserializeUser()
调用远程API,但这也意味着任何本地存储(在会话中)用户数据可能与远程API不同步(如果这可能发生。)
编辑:关于在策略回调中创建用户:这不是非法的,但如果推荐的话,则取决于策略的类型。
对于针对远程服务实施身份验证的策略,例如passport-facebook
,从策略回调创建或更新用户很常见,因为这是您收到策略回调的唯一入口点来自远程服务的信息。
但是,在您的情况下,并且通常使用passport-local
,您可能只应使用策略回调进行身份验证,因为您无法始终访问您可能需要的所有用户信息创建一个新用户。
最好创建一个单独的Express路由,发布一个create-user-form,它将负责创建用户(在本地数据库中或使用远程服务,就像你的情况一样) )。