42 votes

Rails Devise: Définir le jeton de réinitialisation du mot de passe et rediriger l'utilisateur

Dans mon application pour certains cas d'utilisation, j'ai créer un nouvel utilisateur (par programme définir le mot de passe) et de leur envoyer un e-mail de confirmation.

Je voudrais être en mesure de modifier leur mot de passe immédiatement après la confirmation (sans avoir à entrer dans le système a généré un qui, je ne veux pas les envoyer)

En effet je voudrais
1) le Système crée un nouveau compte utilisateur avec mot de passe généré.
2) Système d'envoie de mail de confirmation.
3) l'Utilisateur clique sur la confirmation et est redirigé vers saisir son mot de passe (dans les faits, de les envoyer à une adresse URL comme ci-dessous)

<a href="http://localhost:3000/users/password/edit?reset_password_token=v5Q3oQGbsyqAUUxyqLtb">Change my password</a>

Toute aide / pointeurs serait génial.

43voto

Anatortoise House Points 2276

Un moyen simple d'avoir une seule étape pour les utilisateurs de confirmer l'adresse électronique et mot de passe initial à l'aide du lien que vous avez proposé...

Envoyer un e-mail de votre application génère, y compris un reset_password_token, et d'envisager la possession de l'utilisateur de ce jeton de confirmation de la validité de l'adresse e-mail.

En compte du système de génération de code, en supposant que le modèle Utilisateur est mis en place avec :recouvrable et :database_authenticatable Concevoir des modules de...

acct=User.new
acct.password=User.reset_password_token #won't actually be used...  
acct.reset_password_token= User.reset_password_token 
acct.email="user@usercompany.com" #assuming users will identify themselves with this field
#set other acct fields you may need
acct.save

Rendre le dispositif de réinitialisation de mot de passe voir un peu plus clair pour les utilisateurs lors de la configuration initiale de mot de passe. Dans YourApp/vues/concevoir/mots de passe/modifier.html.erb ...

...
<%= "true"==params[:initial] ? "Set your password" : "Reset your password" %>
...  

Dans le mail votre code génère ...

Hi <%=@user.name%>
An account has been generated for you.
Please visit www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @user.reset_password_token %> to set your password.
More custom details to communicate...

Pas besoin de comprendre :confirmable Concevoir module dans votre modèle d'Utilisateur, puisque les comptes créés par votre application ne sera pas obtenir d'accéder sans l'reset_password_token dans l'e-mail.

Concevoir va gérer le soumettre et de clarté de la reset_password_token champ.

Voir devise_gem_folder/lib/concevoir/modèles/recouvrable.rb et database_authenticatable.rb pour plus de détails sur reset_password_token méthode et les amis.

Si vous souhaitez utiliser le Concevoir :confirmable module plutôt que cette approche, voici un legs de la page wiki qui pourraient vous aider: https://github.com/plataformatec/devise/wiki/How-To:-Override-confirmations-so-users-can-pick-their-own-passwords-as-part-of-confirmation-activation

29voto

ClaytonC Points 106

Dans Rails 4.1, la modification suivante de la réponse d'Anatortoise House fonctionne:

 user = User.new
user.password = <some random unguessable string>
raw_token, hashed_token = Devise.token_generator.generate(User, :reset_password_token)
user.reset_password_token = hashed_token
user.reset_password_sent_at = Time.now.utc
user.email = 'user@usercompany.com'
user.save
AccountMailer.set_password_notice(user, raw_token).deliver
 

La vue email contient ce lien:

 www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @raw_token %>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X