Passport本地临时密码(首次登录时更改)

时间:2016-04-15 13:20:35

标签: express passport.js passport-local

出于安全原因,我们会创建用户并向他们发送临时生成的密码。在第一次登录时,用户应该在继续导航受保护的页面之前更改密码。

我使用运行本地护照模块的快递/节点网站。注册,登录用户所有工作。但是,我在第一次登录时更改了密码的最佳做法是丢失了。

我的想法是做以下事情:

data-toggle="tab"

正如您所看到的,我在数据库中设置了一个简单的布尔值(tinyInt 0-1)(默认为1)。之后我会设置一个post方法,在成功更改后,布尔值将设置为0.

这是正确的方式(' a'不是':p)?安全性怎么样?

2 个答案:

答案 0 :(得分:4)

肯定是 正确的方法。我认为它非常适合您的需求。我个人喜欢数据库字段的使用如何直接反映其背后的业务逻辑。

备选方案,虽然我很喜欢你的解决方案,但可能是:

1

向数据库添加lastLogin日期字段,默认为NULL。这将在用户登录时存储日期时间戳。如果用户以前曾登录过,您可以将其用作隐式检查。我个人更喜欢为其目的使用明确的列(就像您使用firstLogin列一样),因为应用程序的列和业务逻辑的目的非常明确。

<强> 2

另一种替代方案是在用户上次更新密码时存储,即lastPasswordChange默认为NULL新用户。与上述相同的推理。如果您希望用户每隔n天更改一次密码,则非常有用。

安全发言我会说这是坚实的。只要您的firstLogin字段默认为1,新用户就无法在首次登录时跳过密码更改。

但是,当用户更新其密码时,请务必更新同一查询中的firstLogin字段执行事务内的两个查询。这样,您始终可以确保密码 firstLogin字段都已更改。如果由于某种原因查询失败,您将有一个用户已经更改了密码,并被要求/被迫再次更改密码,或者有一个随机生成密码而没有被要求更改密码的用户。 在同一查询中执行此操作将确保两者同时更新或两者都不更新。在事务内部执行此操作会使您在任一查询失败时选择失败/回滚事务。

另一方面,您的代码可以这样编写(无论是您的方式都是正确的,这只是偏好和视觉问题):

/* POST login page. */
router.post('/login', function(req, res, next) {
    passport.authenticate('local', { 
        successRedirect: '/dashboard/users',
        failureRedirect: 'pages/login'
    }, function(err, user, info) {
        if(err) {
            console.log('')
            return res.render('pages/login', {title: 'Login', error: err.message});
        }

        if(!user) {
            return res.render('pages/login', {title: 'Login', error: info.message});
        }
        return req.logIn(user, function(err) {
            if(err) {
                return res.render('pages/login', {title: 'Login', error: err.message});
            } 

            // Using if/else if/else makes no difference since if the first if is executed
            // in both cases nothing else will execute due to if/else or the return.
            // In case the above statement resolves to `false` the effect wills till be the same

            if (user.firstLogin) { 
                return res.redirect('/change-password'); // <- First login
            }
            // The else is not necessary due to the return in the line above.
            return res.redirect('/dashboard/users');
        });
    })(req, res, next);
});

如果您想对这两个问题提供更具体的答案,我需要一个更具体的问题。

答案 1 :(得分:1)

移动&#34;首次登录&#34;这可能是一件好事。逻辑到一个单独的中间件,它为所有&#34;登录的路由&#34;执行。

根据您的建议,用户可以在重定向后离开/更改密码?

相关问题