是否可以在没有本地数据库的情况下使用PassportJS?

时间:2016-06-12 10:58:33

标签: javascript node.js express passport.js

我有一个应用程序,它使用与护照捆绑在一起的所有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会表现/得到更新。

在其他地方无法找到关于此的单一指南或问题,所以会喜欢一些指导!

1 个答案:

答案 0 :(得分:2)

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

以您想要的方式对用户进行身份验证是完全合法的,并且您的代码示例似乎足够合法(前提是您并不意味着创建来自策略的用户回调,但使用该远程API验证一个(见下面的解释))。

要考虑的一件事是,策略回调并不是用户数据获取的唯一地方#34;这也发生在passport.deserializeUser()回调中,后者被调用您想要进行身份验证的每条路线。

由您决定要在会话中存储多少用户信息(这是serializeUser()所做的)。存储更多信息意味着您不必为deserializeUser()调用远程API,但这也意味着任何本地存储(在会话中)用户数据可能与远程API不同步(如果这可能发生。)

编辑:关于在策略回调中创建用户:这不是非法的,但如果推荐的话,则取决于策略的类型。

对于针对远程服务实施身份验证的策略,例如passport-facebook,从策略回调创建或更新用户很常见,因为这是您收到策略回调的唯一入口点来自远程服务的信息。

但是,在您的情况下,并且通常使用passport-local,您可能只应使用策略回调进行身份验证,因为您无法始终访问您可能需要的所有用户信息创建一个新用户。

最好创建一个单独的Express路由,发布一个create-user-form,它将负责创建用户(在本地数据库中或使用远程服务,就像你的情况一样) )。

相关问题