在 node.js 中生成密码重置令牌

Posted

技术标签:

【中文标题】在 node.js 中生成密码重置令牌【英文标题】:generate password reset token in node.js 【发布时间】:2012-09-16 16:37:53 【问题描述】:

如何在 node.js 中生成可用于 url 的密码重置令牌?

我只需要生成令牌的方法:

user.reset_password_token = ???;
user.reset_password_expire = expire_date;

编辑 -- 这是解决方案:

user.reset_password_token = require('crypto').randomBytes(32).toString('hex');

【问题讨论】:

你能包含其余的代码吗? :) 我添加了我使用的解决方案。 谢谢,是的,我最终使用了它,我做了 48 字节,我想除了占用更多空间之外,这并不重要,或者你认为 32 就足够了? 【参考方案1】:

我正在使用它来生成我的身份验证令牌:

require('crypto').randomBytes(32, function(ex, buf) 
    var token = buf.toString('hex');
);

Crypto Node.js v0.8.9 Manual & Documentation

【讨论】:

我将如何使用上面的代码?我现在必须将所有内容都移到 randomBytes 回调中吗? user.reset_password_token = require('crypto').randomBytes(32).toString('hex'); 代币实际需要多大?是否需要为 32 或是否可以为较短的 url 为 8。 @chovy 重置令牌实际上是一个密码,因此通常任何适用于存储密码的内容都适用于重置令牌。不过,它们不像密码那么重要,因为令牌应该有额外的限制,例如时间限制和有限的尝试。我认为,如果您的限制足够强,您可以使用 8 个字符。【参考方案2】:
function customToken() 
    var buffreValue = new Buffer(64);
    for (var i = 0; i < buffreValue.length; i++) 
        buffreValue[i] = Math.floor(Math.random() * 256);
    
    var token = buffreValue.toString('base64');
    return token;

var getToken = customToken()

【讨论】:

【参考方案3】:

在这种情况下,首先,您应该在 schema 上创建一个 实例方法,因此,您的代码必须是这样的:

在编写此函数之前,您必须在架构中添加两个字段。

1. passwordResetExpire2.密码重置令牌

功能是:

userSchema.methods.createPasswordResetToken = function () 
      const resetToken = crypto.randomBytes(32).toString('hex');
      this.passwordResetToken = crypto.createHash('sha256').update(resetToken).digest('hex');
      // Please note that you need to specify a time to expire this token. In this example is (10 min)
      this.passwordResetExpire = Date.now() + 10 * 60 * 1000;
      return resetToken;
    ;

【讨论】:

以上是关于在 node.js 中生成密码重置令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.js 中正确实现“忘记/重置密码”功能? (使用一次性令牌)

如何在 Zend Framework 中生成用于重置密码的随机密码或临时 URL?

使用 jwt 结构重置密码

Node.js 密码重置

如何使用 Passport.js 在 Node.js 中重置/更改密码?

Laravel 手动生成重置密码令牌:收到错误“此密码重置令牌无效”