簡體   English   中英

流星-密碼恢復/電子郵件確認動態網址

[英]Meteor - Password recovery / Email confirmation dynamic url

基本上,我在流星上和流星啟動時使用基於帳戶的程序包,我設置了服務器應該用於密碼恢復郵件,電子郵件確認郵件等的模板。

例如,在流星啟動時我的server / startup.js中,我做了很多類似的事情:

  Accounts.urls.verifyEmail = function (token) {
        return Meteor.absoluteUrl(`verify-email/${token}`);
      };

  Accounts.emailTemplates.verifyEmail.html = function (user, url) {
        return EmailService.render.email_verification(user, url);
      };

問題是我的應用托管在多個主機名上,例如company1.domain.comcompany2.domain.comcompany3.domain.com,並且如果客戶端要從company1.domain.com重設密碼,則提供的恢復網址應該是company1.domain.com/recovery。

如果另一個客戶端嘗試在company2.domain.com上進行連接,則恢復URL應為company2.domain.com

根據我的理解, 這並不是真正可以實現的,因為Accounts Package使用的方法是“ Meteor.absoluteUrl()”,該方法返回服務器的ROOT_URL變量服務器為單個變量 )。

在客戶端,我基於window.location.href做很多事情,但是在嘗試重設密碼或確認電子郵件地址時,我似乎無法將該URL發送到服務器。

我正在嘗試找到一種方法,該方法可以根據客戶端從中發出請求的主機來動態生成url ,但是由於該url是在服務器端生成的,因此無法找到一種可行的方法。 我想我可能可以在嘗試重設密碼或創建帳戶並在那里動態設置ROOT_URL變量之前調用流星服務器方法,但這似乎是不安全且冒險的,因為兩個人可以輕松地嘗試在同一時間范圍內重設密碼,可能會搞砸事情,否則人們可能會濫用它。

是否沒有辦法從客戶端告訴服務器我要為當前電子郵件生成的URL必須是客戶端當前的位置? 我希望能夠從基於帳戶的流星程序包中覆蓋某些功能並實現類似以下內容:

 Accounts.urls.verifyEmail = function (token, clientHost) {
        return `${clientHost}/verify-email/${token}`;
      };

  Accounts.emailTemplates.verifyEmail.html = function (user, url) {
        return EmailService.render.email_verification(user, url);
      };

但是我不確定是否有可能,在從基本包中覆蓋“幕后”功能時,我沒有任何實際經驗,我喜歡發生的一切,只是生成的url始終相同。

好的,所以我設法找到一種方法來實現自己想要的功能, 雖然有點破爛 ,但是。

基本上,用戶useraccounts具有一項功能,該功能是將注冊表單中的任何隱藏輸入都添加到用戶配置文件中。 因此,我添加了一個隱藏字段來存儲用戶的當前位置。

AccountsTemplates.addField({
  _id: 'signup_location',
  type: 'hidden',
});

呈現模板后,我用jQuery填充了此隱藏的輸入。

Template.Register.onRendered(() => {
  this.$('#at-field-signup_location').val(window.location.href);
});

然后,當我實際發送emailVerification電子郵件時,可以查詢該值(如果可用)。

  Accounts.urls.verifyEmail = function (token) {
    return Meteor.absoluteUrl(`verify-email/${token}`);
  };

  Accounts.emailTemplates.verifyEmail.html = function (user, url) {
    const signupLocation = user.profile.signup_location;
    if (signupLocation) {
      let newUrl = url.substring(url.indexOf('verify-email'));
      newUrl = `${signupLocation}/${newUrl}`;
      return EmailService.render.email_verification(user, newUrl);
    }

    return EmailService.render.email_verification(user, url);
  };

因此,這可以解決signUp流程,我可以對resetPassword和resendVerificationUrl使用類似的概念,因為signupLocation現在位於用戶配置文件中。

您可能應該在設置中保留每個子域的數組,並在用戶配置文件中保留相應子域的ID,因此,如果將來您的域發生更改,則引用將仍然有效且一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM