第二次调用Accounts.sendVerificationEmail时无法验证电子邮件令牌

时间:2016-03-03 18:22:31

标签: meteor meteor-accounts

我使用Meteor帐户安装了电子邮件地址验证流程。它运行正常,但是当第二次调用Accounts.sendVerificationEmail()时,Account.verifyEmail()方法在新令牌上调用时始终拒绝使用403:Verify email link expired

在再次调用该方法时,第一次调用Accounts.sendVerificationEmail()时在Meteor.users中设置的电子邮件验证令牌不会更改:它仍然是与第一封可用的电子邮件一起发送的链接。

我在Meteor文档或互联网上找不到与此相关的任何信息。在第二次打电话给Accounts.sendVerificationEmail()之前有什么可做的事情(比如清理什么的吗?)。

2 个答案:

答案 0 :(得分:1)

我在实施重新发送链接到我的网站时遇到了同样的问题。我通过删除之前的所有verficationTokens来解决这个问题。

以下是对此问题应用修复的两种方法:

  1. 如果您已经拥有 n 数量的用户无法验证其帐户的活动数据库,则这是首选方法。在调用Meteor.call()方法后,将此代码放在单独的Accounts.sendVerificationEmail()方法中:

    Meteor.users.update({_id: Meteor.userId()}, {'$push': services.email.verificationTokens": {$each: [], $slice: -1}}});
  2. 这将清空所有其他标记,但最新调用Accounts.sendVerificationEmail()方法创建的最后一个标记除外。

    1. 此方法可以更快地实施更新的项目或在新项目中实施meteor-accounts。与步骤1)类似,将此代码放入新的Meteor.call()方法中,并在调用Accounts.sendVerificationEmail()方法后调用它:

      Meteor.users.update({_id: Meteor.userId()}, {'$pop': {"services.email.verificationTokens": -1}});
    2. 这将弹出verificationTokens的第一个条目,因此唯一的条目留下了Accounts.sendVerificationEmail()方法中生成的最新标记。

      希望这有帮助。

答案 1 :(得分:0)

当您使用sendVerificationEmail()时,用户集合中会出现一个新条目:' services.email.verificationTokens'并且你会看到电子邮件。[x]。验证的'是假的。 当你使用verifyEmail()时,发送电子邮件。[x] .verified'转到true,并在' services.email.verificationTokens'消失。因此,如果您尝试再次使用verifyEmail(),则无法通过电子邮件验证并验证令牌被删除。 如果您使用新令牌再次发送sendVerificationEmail(),则新链接允许您使用verifyEmail()而不会显示错误消息。