9
votes

Utilisation des méthodes ONRESETPASSWordLink, ONENRollmentLink et OnemailVerifiMINKLink correctement dans Meteor

Je me demandais si quelqu'un serait assez gentil de fournir un exemple de météorpad ou de code d'utilisation de l'une des méthodes énumérées correctement dans Meteor (avec le routeur de fer). J'ai du mal à comprendre comment ces méthodes interagissent exactement avec mon application, et il semble que ces méthodes sont suffisamment nouvelles qu'il n'y a pas beaucoup de bonne documentation sur la manière de les utiliser correctement. Merci!

http://docs.meteor.com/#/full/Accounts-OronresetPasswordLink < / a>


0 commentaires

4 Réponses :


1
votes

par la documentation:

Vous pouvez construire votre propre interface utilisateur à l'aide des fonctions ci-dessous ou utilisez le package Comptes-UI pour inclure une interface utilisateur clé-clé pour une connexion basée sur le mot de passe.

Par conséquent, ces rappels sont pour rouler votre propre solution personnalisée. Cependant, je vous recommanderais d'utiliser l'un des packages suivants ci-dessous, avec Saisie de comptes Être ma solution préférée:


3 commentaires

Merci puce. J'essaie en fait de rouler ma propre solution personnalisée dans notre application. Tout fonctionne à l'exception de ces rappels. J'aimerais comprendre comment ces travaux parce que la façon dont je le fais, semble maintenant un peu "pirate". Je suis sous l'impression que ces rappels aideront à nettoyer ce code. Si je le découvre, je vais essayer de poster ici pour tout le monde.


@BGMASTER - OK, ça sonne bien. Les emails sont-ils envoyés? Sinon, je serais sûr de l'obtenir d'abord. Après cela, j'ajouterais les rappels à l'intérieur d'un fichier Client-côté selon les documents, puis ajoutez console.log déclarations pour voir lorsqu'ils tirent lorsqu'ils tirent. Les documents de rappel sont définitivement légers sur des exemples IMHO, mais les descriptions de base ont un sens, je pense donc que la clé consiste à obtenir les courriels envoyés à de nouvelles dépannements.


Alors oui, les courriels étaient envoyés. J'ai cliqué sur les liens et tout semblait fonctionner, mais j'ai été confondu sur le rappel "fait" et comment il fonctionnait. En regardant à travers le code @stubailo fourni ci-dessus a beaucoup aidé beaucoup. D'après ce que je comprends, "Terminé" permet simplement à l'application d'aller de l'avant avec la journalisation. J'espérais pouvoir exécuter une redirection par «fait» ou faire une autre action.



6
votes

J'ai écrit cette méthode, j'espère que je peux donner un bon exemple de la façon de l'utiliser.

Il est censé être conjointement avec comptes.SendResetPasswordSemail et comptes.ResetPassword (Http://docs.meteor.com/#/full/accounts_sendressetPasswordPasswordSemail et http: // docs.meteor.com/#/full/accounts_resetpassword ).

Fondamentalement, disons que vous souhaitez implémenter votre propre système d'interface utilisateur de comptes au lieu d'utiliser le package ui ou similaire. Si vous souhaitez avoir un système de réinitialisation du mot de passe, vous avez besoin de trois choses:

  1. Un moyen d'envoyer un email avec un lien de réinitialisation de mot de passe
  2. Un moyen de savoir quand l'utilisateur a cliqué sur le lien de réinitialisation
  3. une méthode pour réinitialiser réellement le mot de passe

    Voici comment le débit devrait fonctionner:

    1. L'utilisateur clique sur un lien de votre page indiquant "Réinitialiser le mot de passe"
    2. Vous découvrez quel utilisateur qui est (éventuellement en les saisissant de leur adresse e-mail) et appelez comptes.sendResetPasswordSemail
    3. L'utilisateur clique sur le lien de réinitialisation du mot de passe dans l'e-mail qu'ils vient de recevoir
    4. Votre application est chargée et enregistre un rappel avec comptes.EnresetpasswordLink
    5. Le rappel est appelé car l'URL a un fragment spécial avec le jeton de réinitialisation de mot de passe
    6. Ce rappel peut afficher un élément UI spécial qui demande à l'utilisateur de saisir son nouveau mot de passe
    7. l'application appelle comptes.ResetPassword avec le jeton et le nouveau mot de passe
    8. Maintenant, l'utilisateur est connecté et ils ont un nouveau mot de passe

      Ceci est un peu compliqué car c'est le flux le plus avancé et le plus personnalisé possible. Si vous ne voulez pas gâcher avec tous ces rappels et méthodes, je vous recommanderais d'utiliser l'un des packages UI de comptes existants, par exemple comptes-ui ou Https://atmosphèrejs.com/ian/accounts-u-bootstrap-3

      Pour un exemple de code, jetez un coup d'œil au code de l'emballage comptes-ui : Httptps://github.com/meteor/meteor/blob/devel/packages/accounts-u-unstyled/login_buttons_dialogs.js


2 commentaires

J'ai donc parcouru le code des comptes-UI et cela a contribué. Je vous suis apprécié de vous lier à cela. Je me luttais avec la fonction "fait" étant transmis au rappel. On dirait que cela ne fait que réacmer l'autologin? Je ne sais pas exactement ce que cela fait, mais cela doit-il être appelé à partir de votre flux d'interface utilisateur (après avoir soumis votre formulaire de changement de mot de passe et exécutant des comptes .ResetPassword)? Je veux rediriger mon application à un nouvel itinéraire, mais si je le fais, appelez "fait" plus tard semble être de plus en plus difficile.


"Autologin" est un processus qui arrive chaque fois que vous ouvrez une application météore dans un nouvel onglet - il ressemble au stockage local pour une connexion existante. Pour le flux de mot de passe de réinitialisation, nous ne voulons pas utiliser la connexion existante car vous pourriez vous retrouver dans une situation dans laquelle vous réinitialisez le mot de passe pour le compte A est connecté au compte B, ce qui pourrait être déroutant. Le rappel terminé est important au cas où l'utilisateur souhaite annuler le flux de réinitialisation du mot de passe et vous souhaitez continuer avec le processus d'autologin normal.



15
votes

OK, alors je vais publier ce que j'ai fini par apprendre et que je fais ici afin que d'autres puissent l'utiliser comme référence. Je ferai de mon mieux pour expliquer ce qui se passe aussi.

Comme on peut le voir dans les autres commentaires, la fonction "Terminée" transmise à la page Comptes.In **** Link Callback était la partie principale qui m'a trébuché. Cette fonction ne fait qu'une chose - réactive l'autologin. Il convient de noter que la fonction «fait» / autologin est une partie de l'un des packages «comptes» principaux et ne peut pas être modifié. "Autologin" est utilisé dans une situation particulière: l'utilisateur a essentiel de réinitialiser son PW sur un ordinateur sur un ordinateur où l'utilisateur B est actuellement connecté. Si l'utilisateur A quitte le flux de mot de passe de réinitialisation avant de soumettre un nouveau mot de passe, l'utilisateur B restera connecté IN. Si l'utilisateur a complète le flux de mot de passe de réinitialisation, l'utilisateur B est déconnecté et l'utilisateur A est connecté. p>

Le motif utilisé pour gérer "Terminé" dans le paquet Comptes-UI et ce que j'ai terminé En faisant, attribue «Terminé» à une variable qui peut ensuite être transmise à la fonction de votre gestionnaire d'événements de votre modèle et exécuté une fois que votre logique de mot de passe de réinitialisation est terminée. Cette affectation de variable doit être effectuée dans les comptes.on **** Link Rappel, mais le rappel peut être placé dans n'importe quel code côté client de niveau supérieur (assurez-vous simplement d'affecter correctement la portée des variables). Je viens de le mettre au début de mon fichier de réinitialisation_password_template.js (je n'ai fait que cela pour réinitialiser les mots de passe jusqu'à présent, mais le motif doit être similaire): p>

Client / réinitialiser_password_template.js: p >

// 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;
  }
});


2 commentaires

Wow, bonne réponse! Avez-vous des idées sur la manière dont cela pourrait être mieux documenté? Les documents sont difficiles à raisonner car il existe tellement de méthodes de comptes différents et qu'il pourrait ne pas être clair comment les utiliser ensemble.


Oui, je comprends complètement votre préoccupation avec les documents et les différentes méthodes. Les deux choses principales que je clarifieriez sont 1) Comment fonctionne exactement la fonction terminée, et si elle doit être transmise à un template.mytemplate.vents gestionnaire (peut-être fournir un exemple de code), et 2) que lorsque les liens sont cliqués, L'application se charge au niveau de la racine.



0
votes

Cela fait un an depuis cette question mais je viens de trouver le même problème. Après votre solution, ce que j'ai trouvé, c'est que vous pouvez utiliser la variable code> de la section code> dans le routeur et le crochet code> onafteraction code> pour obtenir la même chose, mais à l'aide des itinéraires:

Accounts.onResetPasswordLink(function(token, done){
  Session.set('resetPasswordToken', token);
  doneResetPassword = done;
});


0 commentaires