在 Meteor 中正确使用 onResetPasswordLink、onEnrollmentLink 和 onEmailVerificationLink 方法

2024-01-05

我想知道是否有人愿意提供一个meteorpad或代码示例,以在Meteor(使用iron:router)中正确使用上面列出的方法之一。我正在努力了解这些方法到底如何与我的应用程序交互,而且这些方法似乎足够新,以至于没有太多关于如何正确使用它们的良好文档。谢谢!

http://docs.meteor.com/#/full/Accounts-onResetPasswordLink http://docs.meteor.com/#/full/Accounts-onResetPasswordLink


好的,所以我将在这里发布我最终学习和所做的事情,以便其他人可以将其用作参考。我也会尽力解释正在发生的事情。

从其他评论中可以看出,传递给 Accounts.on****Link 回调的“done”函数是让我绊倒的主要部分。该函数只做一件事 - 重新启用自动登录。值得注意的是,“done”函数/autoLogin 是核心“accounts”包之一的一部分,无法修改。 “autoLogin”用于一种特定情况:用户 A 尝试在用户 B 当前登录的计算机上重置其密码。如果用户 A 在提交新密码之前退出重置密码流程,则用户 B 将保持登录状态如果用户 A 完成重置密码流程,则用户 B 会注销,用户 A 会登录。

用于处理 account-ui 包中“完成”的模式,以及我最终所做的,将“完成”分配给一个变量,然后可以将该变量传递给模板事件处理函数,并在重置密码逻辑完成后运行。此变量分配需要在 Accounts.on****Link 回调中完成,但回调可以放置在任何顶级客户端代码中(只需确保正确分配变量的范围)。我只是将其放在 reset_password_template.js 文件的开头(到目前为止我只是为了重置密码而这样做,但模式应该类似):

客户端/reset_password_template.js:

// set done as a variable to pass
var doneCallback;

Accounts.onResetPasswordLink(function(token, done) {
  Session.set('resetPasswordToken', token);  // pull token and place in a session variable, so it can be accessed later 
  doneCallback = done;  // Assigning to variable
});

使用这些 on****Link 回调的另一个挑战是了解您的应用程序如何“知道”回调已被触发,以及应用程序需要执行哪些操作。由于iron:router 与Meteor 紧密集成,因此很容易忘记它是一个单独的包。重要的是要记住这些回调是为了独立于iron:router而编写的。这意味着当单击发送到您的电子邮件的链接时,您的应用程序会在根级别(“/”)加载。

***旁注 - StackOverflow 上还有一些其他答案,提供了与 Iron:router 集成的方法,并为每个链接加载特定路由。对我来说,这些模式的问题是它们看起来有点老套,不符合“流星”方式。更重要的是,如果 Meteor 核心团队决定改变这些注册链接的路径,这些路由就会中断。我尝试调用 Router.go('path');在 on****Link 回调中,但由于某种原因,这在 Chrome 和 Safari 中不起作用。我希望有一种方法来处理每个电子邮件链接的特定路由,从而消除不断设置和清除会话变量的需要,但我想不出一个有效的解决方案。

无论如何,正如 @stubailo 在他的回答中所描述的,您的应用程序已加载(在根级别),并且回调被触发。一旦回调被触发,您就设置了会话变量。您可以使用此会话变量使用以下模式在根级别加载适当的模板:

client/home.html(或您的登陆页面模板)

{{#unless resetPasswordToken}}
  {{> home_template}}
{{else}}
  {{> reset_password_template}}
{{/unless}}

这样,您需要在 reset_password_template.js 文件和 home.js 中注意一些事项:

客户端/home.js

// checks if the 'resetPasswordToken' session variable is set and returns helper to home template
Template.home.helpers({
  resetPasswordToken: function() {
    return Session.get('resetPasswordToken');
  }
});

客户端/reset_password_template.js

// if you have links in your template that navigate to other parts of your app, you need to reset your session variable before navigating away, you also need to call the doneCallback to re-enable autoLogin
Template.reset_password_template.rendered = function() {
  var sessionReset = function() {
    Session.set('resetPasswordToken', '');
    if (doneCallback) {
      doneCallback();
    }    
  }

  $("#link-1").click(function() {
    sessionReset();
  });

  $('#link2').click(function() {
    sessionReset();
  });
}

Template.reset_password_template.events({
  'submit #reset-password-form': function(e) {
    e.preventDefault();

    var new_password = $(e.target).find('#new-password').val(), confirm_password = $(e.target).find('#confirm-password').val();

    // Validate passwords
    if (isNotEmpty(new_password) && areValidPasswords(new_password, confirm_password)) {
      Accounts.resetPassword(Session.get('resetPasswordToken'), new_password, function(error) {
        if (error) {
          if (error.message === 'Token expired [403]') {
            Session.set('alert', 'Sorry, this link has expired.');
          } else {
            Session.set('alert', 'Sorry, there was a problem resetting your password.');          
          }
        } else {
          Session.set('alert', 'Your password has been changed.');  // This doesn't show. Display on next page
          Session.set('resetPasswordToken', '');
          // Call done before navigating away from here
          if (doneCallback) {
            doneCallback();
          }
          Router.go('web-app');
        }
      });
    }

    return false;
  }
});

希望这对尝试构建自己的自定义身份验证表单的其他人有所帮助。其他答案中提到的包对于许多情况都很有用,但有时您需要通过包无法提供的额外自定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Meteor 中正确使用 onResetPasswordLink、onEnrollmentLink 和 onEmailVerificationLink 方法 的相关文章

  • Meteor.http.call 不允许 Access-Control-Allow-Origin

    当我尝试使用 Meteor 调用外部服务器进行 JSON 查询时Meteor http call GET 方法我收到错误消息 Access Control Allow Origin不允许 如何允许我的 Meteor 应用程序向其他服务器发出
  • 文件正在被分配一个 //# sourceMappingURL 但已经有一个

    我只是注意到 Firefox 控制台为我的项目中的每个 js coffee 文件 甚至是包 输出以下错误 file is being assigned a sourceMappingURL but already has one Chrom
  • Meteor - 自动发起客户端登录

    我有一个 Meteor 应用程序 我使用 nginx 和内部 SSO 服务进行身份验证 我能够成功地完成此操作 并在服务器 Meteor onConnection 方法上的 nginx 设置 http 标头中检索用户详细信息 此时 我不确定
  • Meteor RESTful 身份验证。是否可以?

    我四处搜寻 但找不到这个问题的满意答案 我有一个流星网站 用户可以在其中登录并创建内容 我还想创建一个能够与网站交互的手机应用程序 并且我希望用户登录手机应用程序并访问网站上的相同内容 很正常 我创建了一个基本的 REST API 用于使用
  • 发现 Meteor - mrt 添加引导程序 - 安装错误

    我刚刚开始发现流星教程 当我尝试 mrt add bootstrap 我收到以下错误 usr local lib node modules meteorite lib project js 225 throw Package named p
  • 如何在meteor.js中更新Mongodb集合?

    我有一个集合 当用户按下按钮时我需要更新它 我只需要将一个变量更改为另一个变量 在控制台中 这行代码有效 db users update username Jack age 13 username Jack 但是当我输入这段代码时 Temp
  • Meteor 公共文件夹不工作

    我是 Meteor 的新手 我试图了解如何提供静态内容 图像 JS 等 我按照文档创建了正确的文件夹结构 它并没有真正涉及 但使对此内容的请求只是故障转移到服务主应用程序页面 例如 将图像放入 app root public image p
  • 编写/转换 Meteor 同步函数

    这已经困扰我一段时间了 所以我想我应该对其进行快速的质量检查 如果有一个普通的nodeJS模块或其他东西 并且它在服务器端有一个异步功能 我如何使其同步 例如我如何转换nodejsfs stat异步函数转为同步函数 例如我有 服务器端js
  • 更新 Meteor 中的嵌套数组

    这是我的架构 id FJwSEMdDriddXLKXh name t number 5 owners id 1 name Name address Address type Type gender Gender notes 单击后 我将在所
  • Accounts.onCreateUser 在创建新用户时添加额外属性,好的做法吗?

    我正在创建新用户Accounts createUser http docs meteor com full accounts createuser如果你不做任何花哨的事情 它就会正常工作 但我想向新用户添加一些文档中未列出的其他字段 这是我
  • Meteor 发布错误 - 发布函数返回非游标数组

    我有这个出版物 Meteor publish temsInThisCompetition function id var teams return Competitions find id fetch map function doc fo
  • Mongo按动态字段排序

    所以我传入了一个动态变量 它是我想要排序的字段的名称 假设下面的 sortVariable 可能等于 price createdAt name 等 这不起作用 我该怎么做 function findStuff sortVariable va
  • meteorjs 中的 imagemagick (在流星路由器和光纤的帮助下)

    我无法在meteorjs 中使用imagemagick 我正在开发一个小型 svg gt png 转换器 其中包含一个 REST API 来提供转换后的图像 我用meteor router实现了其余的api imagemagick 转换有效
  • 如何在 Ubuntu VirtualBox 中运行 Meteor 应用程序并使用 Windows 主机上的编辑器进行编辑?

    我希望在运行 Ubuntu 的 virtualbox 来宾中运行一个用于开发目的的流星服务器 该项目将位于主机上的一个文件夹内 该文件夹将共享给来宾 该文件夹本身位于 Dropbox 文件夹内 这样我可以在多个虚拟机和工作站之间共享开发 但
  • 纤维/未来实际上有什么作用?

    下面这行代码的作用是什么 Npm require fibers future 我在网上查找示例 发现了一些这样的示例 Future Npm require fibers future var accessToken new Future 什
  • Meteor:将所有用户发布到客户端

    为什么这不起作用 在客户端和服务器上 AllUsers new Meteor Collection allUsers 仅在服务器上 Meteor publish allUsers function return Meteor users f
  • 4 级订阅嵌套在流星中

    我正在使用流星 这是我的架构 每个都是一个单独的集合 课程有很多讲座 讲座有很多问题 问题有很多答案 我想要一页可以显示给定课程的讲座 问题和答案 我可以毫无问题地显示课程的讲座 但在显示更多嵌套项目时遇到问题 我理想地希望拥有 讲座有 c
  • 流星内存不足

    我正在使用流星来制作报废引擎 我必须执行一个 HTTP GET 请求 这会向我发送一个 xml 但这个 xml 大于 400 ko 我得到一个异常 内存不足 result Meteor http get http SomeUrl com 致
  • mongodb 获取最后插入的文档

    此 Meteor 代码尝试查找集合中的最后一个文档 find userId this userId sort createdAt 1 limit 1 但由于所有文档都是按时间顺序排列的 我想删除createdAt字段 所以一旦被 删除 是否
  • 如何正确配置meteor以与节点文件上传模块“multer”一起使用

    我刚从流星开始 我找到并添加了 multer 包 meteor add pfafman multer 现在 我想知道如何配置meteor的服务器端来使用 在我的普通节点应用程序中 我像这样使用它 app use multer dest up

随机推荐

  • Winsock 使用系统代理设置

    我有一个简单的winsock 程序 我想通过系统代理传递我的连接 我看到一些帖子解释了如何捕获系统代理然后发送如下字符串 CONNECT 127 0 0 1 8080 HTTP 1 0 r n 等等 但它并不总是有效 另一方面 当使用 Wi
  • 等待时显示正在加载的内容/图像

    我有一个 ASP 页面 可以进行一些后端处理 它调用一个存储过程 如果该过程完成 该存储过程将返回一个状态值 整个处理时间可持续大约 10 30 秒 具体取决于输入数据量 在这段时间里 我想显示一个正在加载的图像或文本会比仅仅显示一个空白页
  • 从 Python 中使用“子进程”调用 Java 应用程序并读取 Java 应用程序输出

    读取从 Python 调用的 Java 应用程序的输出 即通过 System out println 的最好方法是什么 subprocess Popen java MyClass shell True 无需写入和读取文件 使用 Jython
  • 在 Azure 上部署的 .Net Core 3.1 Web 应用程序显示错误 HTTP 错误 500.35 - ANCM 同一进程中的多个进程内应用程序

    我已经将一个 Web 应用程序部署到我们的 Azure 中 使用最新的 net core 3 1 堆栈 该应用程序分为 3 个虚拟应用程序 在同一 Web 应用程序部署下运行 这似乎是导致问题的原因 我可以访问主应用程序位于根目录http
  • 在 Android Studio 中添加生成的 R.java 文件的文档

    在我的 Gradle 脚本中 我创建了一个 Javadoc 任务 它为我的 java 文件和自动生成的 R java 生成文档 以便为我的 XML 资源创建链接 我正在使用 Doclava 甚至 attrworks 正如预期的那样 http
  • 将 Web 配置 *elements* 替换为 msdeploy 参数

    我们使用 msdeploy 如果您愿意 也可以使用 web 部署 来打包和部署 Web 应用程序 通过声明参数包时间 我们可以在部署时提供值 以替换连接字符串等 我们当前面临的问题是替换 Web 配置中 applicationSetting
  • 没有选中属性的复选框

    我一直在动态地将复选框添加到表中的每一行 datatables net 但是 当我选中这些框时 html 不会显示任何已选中的属性 这不允许我只关注已选中复选框的行 如果我设置带有选中属性的复选框 那么是的 选中属性是可见的 这里的代码显示
  • DocumentPaginator 可以与任何 Visual 一起使用吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 打印任何视觉效果都很容易 打印大于一页的纸张很困难 我被困住了 这些文档很少 我已经尽力了 我想知道是否有人有一个扩展 DocumentP
  • nvd3.js - 折线图中更大的点

    我正在搜索如何使用 nvd3 js 在折线图中显示更大的点 但我没有找到任何东西 有人可以帮我吗 我希望这些点能够在图表线上轻松可见 Thanks 查看简单折线图中生成的输出后 您可以添加此 CSS 以使所有点可见 nvd3 nv grou
  • move:文件名或扩展名太长

    我在 bat 文件中编写了一个小脚本 用于在计算机上创建文件夹的备份 rmdir Folder Backup Old S Q move Folder Backup Folder Backup Old mkdir Folder Backup
  • 如果我有超过 26 个选项,如何使用 C++ getopt_long()?

    这是一个相当假设的问题 但假设我有 3 个以同一字母开头的长参数 parse or p prune or r pivot or i 最终我会开始用完有意义的单个字母 而且 很难在其中分配一些有意义的东西GNU getopt long htt
  • 无法加载资源 404(未找到)- 文件位置错误?

    我正在构建一个 Angular 2 应用程序 我刚刚升级到 Net Core RC2 升级之前 我的网页可以正常显示 但现在我的 Chrome 开发工具控制台中出现错误 Failed to load resource the server
  • PATCH 方法是否应该返回响应正文中资源的所有字段?

    PATCH 方法是否应该返回响应正文中资源的所有字段 或者它应该只返回更新的字段 我正在阅读this https www rfc editor org rfc rfc7386 例如 如果它只返回更新的字段 则用户可以知道服务器中哪些字段被更
  • 有哪些技术可以为 Python 3 创建独立的可执行文件?

    以外CX 冻结 http cx freeze sourceforge net 当前是否有其他维护的工具套件可以为 Python 3k 生成独立的可执行文件 是否还有其他技术可以最大限度地减少 Windows 下的预安装要求 目前似乎没有其他
  • 自定义 d3 月或年刻度格式

    所以我在d3中制作了一个图表并使用默认的x轴格式 d3 axisBottom x 输出如下图 如何手动创建和自定义此格式 特别是 我想使用简短的月份名称 例如 Oct 这样 October 就不会掩盖下一年的标签 Use tickForma
  • jQuery attr href,为什么它不起作用?

    我认为以下代码行应该可以正常工作 1 attr href Home Right 但为什么当我将它与另一个 jQuery 脚本集成时它不起作用 window bind load function 1 click function 1 remo
  • 以可变帧速率逐帧创建 Motion JPEG

    我正在分析我手头问题的多种解决方案 我正在从设备接收图像 我需要从中制作视频文件 然而 图像到达时它们之间有一定的随机延迟 我正在寻找对其进行编码的最佳方法 我必须逐帧创建此视频 并且在每一帧之后我必须使用新帧创建一个新视频文件 替换旧视频
  • 从 R 调用并行 fortran MPI 子例程

    我想在 R 可以调用的子例程中编写一些并行 Fortran 代码 我想从 R 读取数据并将其发送到并行 Fortran MPI 然而 我注意到 当我将以下程序作为子例程运行时 即将 子例程 替换为 程序 代码不再编译 当它是程序时 它会编译
  • 仅具有局部变量的实例方法的线程安全

    一般来说 同时调用使用局部变量的实例方法是否只影响线程安全 这是一个简短的例子 多个线程会调用a public class A public boolean a File file throws Exception boolean t tr
  • 在 Meteor 中正确使用 onResetPasswordLink、onEnrollmentLink 和 onEmailVerificationLink 方法

    我想知道是否有人愿意提供一个meteorpad或代码示例 以在Meteor 使用iron router 中正确使用上面列出的方法之一 我正在努力了解这些方法到底如何与我的应用程序交互 而且这些方法似乎足够新 以至于没有太多关于如何正确使用它