【问题标题】:Is it possible to use PassportJS without a local database?是否可以在没有本地数据库的情况下使用 PassportJS?
【发布时间】:2016-06-12 10:58:32
【问题描述】:

我有一个使用与护照捆绑在一起的所有 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 的行为/更新方式。

在其他地方找不到关于此的单一指南或问题,因此希望得到一些指导!

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

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

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

    需要考虑的一点是,策略回调并不是“查找”用户数据的唯一地方,这也发生在 passport.deserializeUser() 回调中,它会为您想要验证的每条路由调用。

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

    编辑:关于在策略回调中创建用户:这并不违法,但是否推荐取决于策略类型。

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

    但是,在您的情况下,通常使用passport-local,您可能应该只使用策略回调来进行身份验证,因为您并不总是可以访问创建新用户可能需要的所有用户信息.

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

    【讨论】:

    • 确实想通过上面的代码 sn-p 的请求 POST 创建一个用户。那不可能吗?我需要与express-session 做一些特别的事情才能使持久登录起作用吗?
    • @Jascination 我编辑了我的答案以解释更多关于创建用户的信息。不过请随意忽略我,这里没有什么是一成不变的=D
    • 感谢您的澄清。最后一件事,如果我不使用策略回调来创建用户,我打算传回 done(err, user) 什么?
    • 您应该在策略回调中查找用户并使用done()“返回”用户数据。见"Strategies"
    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 2015-07-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多