Reposant réinitialisation de mot de passe
Quelle est la bonne façon de structurer une bonne ressource pour la réinitialisation d'un mot de passe?
Cette ressource est destinée à être un mot de passe resetter pour quelqu'un qui a perdu ou oublié leur mot de passe. Il permet d'invalider leur ancien mot de passe, e-mails et leur mot de passe.
Les deux options que j'ai sont:
POST /reset_password/{user_name}
ou...
POST /reset_password
-Username passed through request body
Je suis sûr que la demande devrait être un POST. Je suis moins confiant que j'ai choisi un nom approprié. Et je ne suis pas sûr si le user_name doit être transmis par le biais de l'URL ou le corps de la requête.
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR: (plus de commentaire ci-dessous)
Je voudrais aller quelque chose comme ceci:
Vous avez une collection de l'utilisateur, où le seul utilisateur est spécifié par le
{user_name}
. Vous devez ensuite spécifier l'action à opérer, qui dans ce cas estreset_password
. C'est comme de dire "Créer (POST
) une nouvellereset_password
d'action pour{user_name}
".Réponse précédente:
Je voudrais aller quelque chose comme ceci:
Vous auriez deux collections, les utilisateurs de la collection, et une collection d'attributs pour chaque utilisateur. L'utilisateur est spécifié par le
:user_id
et l'attribut est spécifié parpassword
. LePUT
fonctionnement des mises à jour de la membre de la collection./user/{id}/password/reset
. Cependant, je suis toujours en pensant entre celle-ci et/user/password/reset
./user/password/reset
nécessite de postfirst_name
&email
pour compléter la demande.POST /users/{username}/password/reset
?Les utilisateurs non authentifiés
Nous faire un
PUT
demande sur unapi/v1/account/password
d'extrémité et nécessitent un paramètre correspondant à un compte e-mail pour identifier le compte pour lequel l'utilisateur veut reset (mise à jour) le mot de passe:Remarque: Comme @DougDomeny mentionné dans son commentaire sur le passage de l'e-mail comme une chaîne de requête dans l'url est un risque pour la sécurité. OBTENIR les paramètres ne sont pas exposés lors de l'utilisation de
https
(et vous devriez toujours utiliser un bonhttps
de connexion pour ces demandes), mais il existe d'autres risques de sécurité impliqués. Vous pouvez en lire plus sur ce sujet dans ce billet de blog ici.Passant à l'e-mail dans le corps de la requête serait un plus sûres que les passant comme un param:
Du corps de la requête:
La réponse a un
202
accepté réponse signification:L'utilisateur recevra un e-mail à
[email protected]
et de traitement de la demande de mise à jour dépend des mesures prises avec le lien de l'email.À l'ouverture du lien de cet email direct à une réinitialisation du formulaire de mot de passe sur le front-end de l'application qui utilise le jeton de réinitialisation de mot de passe à partir du lien comme entrée pour un champ caché (le jeton est en partie le lien, comme une chaîne de requête). Un autre champ de saisie permet à l'utilisateur de définir un nouveau mot de passe. Une deuxième entrée pour confirmer le nouveau mot de passe sera utilisé pour la validation sur le front-end (pour éviter les fautes de frappe).
Remarque: Dans le courriel que nous pourrions aussi mentionner que dans le cas où l'utilisateur n'a pas initialiser toute réinitialisation de mot de passe, il/elle peut ignorer la messagerie et de continuer à utiliser l'application normalement avec son mot de passe actuel
Lorsque le formulaire est envoyé avec le nouveau mot de passe et le jeton comme entrées la réinitialisation du mot de passe d'un procédé. Les données du formulaire sera envoyé avec un
PUT
demande à nouveau, mais cette fois, y compris le jeton et nous allons remplacer la ressource mot de passe avec une nouvelle valeur:Du corps de la requête :
La réponse sera un
204
pas de contenu réponseUtilisateurs authentifiés
Pour les utilisateurs authentifiés qui veulent changer leur mot de passe
PUT
demande peut être effectuée immédiatement, sans l'e-mail (le compte pour lequel nous mettons à jour le mot de passe est connu pour le serveur). Dans de tels cas, le formulaire de soumission de deux champs:Du corps de la requête:
Let's get uber-Sommeil pendant une seconde. Pourquoi ne pas utiliser l'action de SUPPRESSION de mot de passe pour déclencher une réinitialisation? De sens, n'est-ce pas? Après tout, vous êtes effectivement à rejeter le mot de passe existant en faveur d'une autre.
Cela signifie que vous feriez:
Maintenant, deux gros bémols:
HTTP SUPPRIMER est censé être idempotent (un bien grand mot pour dire "pas grand-chose si vous le faites plusieurs fois"). Si vous faites de la norme des choses comme l'envoi d'une "Réinitialisation du Mot de passe e-mail, puis vous allez rencontrer des problèmes. Vous pouvez travailler autour de ce marquage de l'utilisateur/mot de passe avec un booléen "Réinitialisation" du pavillon. Sur tous les supprimer, vous vérifiez ce drapeau; si elle n'est pas définie puis vous pouvez réinitialiser le mot de passe et envoyer votre e-mail. (Notez que d'avoir ce drapeau peut avoir d'autres usages aussi.)
Vous ne pouvez pas utiliser HTTP SUPPRIMER par le biais d'un formulaire, de sorte que vous aurez à faire un appel AJAX et/ou le tunnel de la SUPPRIMER par la POSTE.
DELETE
côté bien ici. Vous seriez en substituant le mot de passe généré de façon aléatoire, j'imagine, de sorteDELETE
pourrait être trompeuse. Je préfère leCreate (POST) new reset_password action
, d'où le nom de la (des ressources) vous seriez en agissant sur le "reset_password action". Cela correspond bien, pour l'envoi des e-mails ainsi, étant donné que l'action est un condensé de tous ces éléments de bas niveau.POST
n'est pas idempotent.Souvent vous ne voulez pas supprimer ou de détruire de l'utilisateur mot de passe existant sur la demande initiale, car cela peut avoir été déclenchée (accidentellement ou intentionnellement) par un utilisateur qui n'a pas accès à l'e-mail. Au lieu de cela, la mise à jour d'un jeton de réinitialisation de mot de passe sur l'enregistrement de l'utilisateur et envoyer un lien figurant dans un e-mail. En cliquant sur le lien de confirmer que l'utilisateur a reçu le jeton et souhaite mettre à jour leur mot de passe. Idéalement, ce serait temps aussi bien sensibles.
Le repos de l'action dans ce cas serait un POST: le déclenchement de l'action de création sur le contrôleur PasswordResets. L'action elle-même permettrait de mettre à jour le jeton et l'envoyer un e-mail.
Je suis actuellement à la recherche d'une réponse, pas de sens de lui donner, mais "reset_password" sonne mal à m'en RESTE contexte, car c'est un verbe, pas un nom. Même si vous dites que vous êtes en train de faire une "remise à zéro" nom - à l'aide de cette justification, tous les verbes sont des substantifs.
Aussi, il peut ne pas avoir lieu à une personne à la recherche pour la même réponse que vous pouvez être en mesure d'obtenir le nom d'utilisateur à travers le contexte de sécurité, et ne pas avoir à l'envoyer par le biais de l'url ou le corps, ce qui me rend nerveux.
reset-password
sonne comme un verbe, mais vous pouvez facilement l'inverser (password-reset
) pour en faire un nom. Et si vous avez modélisé votre application en utilisant l'Event Sourcing ou même si vous avez n'importe quel type de l'audit, il est logique que tu avais fait un véritable entité de ce nom, et peut même permettre de prend sur elle pour les utilisateurs ou les administrateurs de l'histoire (évidemment masquant le texte de mot de passe). Ne me rend pas nerveux du tout. Et comme pour la récupération du nom d'utilisateur automatiquement sur le côté serveur - vous pouvez, mais alors, comment gérez-vous les choses comme l'administration et de l'usurpation d'identité?reset-password
gérer pour décrire les effets bien.Je pense que la meilleure idée serait:
Concernant la fourniture de données:
Pour réinitialiser votre mot de passe actuel
Pour créer un nouveau mot de passe (après un reset)
De mettre à jour le mot de passe (pour loggedIn utilisateur)
Il ya quelques considérations à prendre:
Réinitialisations de mot de passe ne sont pas idempotent
Un changement de mot de passe affecte les données utilisées comme informations d'identification pour l'exécuter, ce qui pourrait invalider les futures tentatives si la demande est simplement répété mot à mot, tandis que les informations d'identification stockées ont changé. Par exemple, si un temporaire token est utilisé pour permettre le changement, comme il est d'usage, dans un mot de passe oublié situation, ce jeton doit être expiré lors du changement de mot de passe, ce qui annule toute nouvelle tentative de réplication de la demande. Donc une bonne approche pour un changement de mot de passe semble être un travail mieux adapté pour
POST
quePUT
.IDENTIFIANT ou e-mail dans le chargement des données est probablement redondant
Bien que ce n'est pas contre le REPOS et peut avoir certaines fins particulières, il est souvent inutile de spécifier un ID ou une adresse email pour réinitialiser votre mot de passe. Pensez-y, pourquoi vous fournir l'adresse de courriel comme une partie des données à une demande qui est censé passer par l'authentification d'une manière ou d'une autre? Si l'utilisateur est simplement en train de changer leur mot de passe dont ils ont besoin pour s'authentifier dans le but de le faire (via nom d'utilisateur:mot de passe, e-mail:mot de passe, ou jeton d'accès fournis via les en-têtes). Par conséquent, nous avons accès à leur compte à partir de cette étape. Si ils avaient oublié leur mot de passe, ils auraient été fourni avec un temporaire de token (via email) qu'ils peuvent utiliser expressément que les informations d'identification pour effectuer le changement. Et dans ce cas, l'authentification par jeton doit être suffisante pour identifier leur compte.
Compte tenu de tous les ci-dessus en considération, ici est ce que je crois être le bon régime pour un séjour Reposant changement de mot de passe:
POST
vsPUT
RFC 7231 spécifie qu'une mise à jour partielle peut être obtenue par le chevauchement des données de deux ressources, mais il est douteux si quelque chose comme/v1/account/password
ne font vraiment de place pour une bonne ressource en fait. CommePOST
est la suisse de l'armée-kniff du Web qui peut être utilisée si aucune des autres méthodes sont possibles, compte tenu dePATCH
peut aussi être un choix pour mettre le nouveau mot de passe.Je n'aurais pas quelque chose qui change le mot de passe et de les envoyer en un nouveau si vous décidez d'utiliser le dossier /utilisateurs/{id}/mot de passe de la méthode, et s'en tenir à votre idée que la demande est une ressource qui lui est propre. ie /utilisateur-mot de passe-demande/est la ressource, et permet de METTRE, les infos de l'utilisateur doit être dans le corps.
Je ne voudrais pas changer le mot de passe si, Id envoyer un courriel à l'utilisateur qui contient un lien vers une page qui contient un request_guid, qui pourraient être passés avec une demande de POST /utilisateurs/{id}//mot de passe?request_guid=xxxxx
Qui allait changer le mot de passe, et il ne permet pas à quelqu'un tuyau d'un utilisateur en demandant un changement de mot de passe.
Avec les premiers MIS peut échouer si il y a une demande en suspens.
Nous mettons à Jour connecté Mot de passe utilisateur
METTRE /v1/utilisateurs/mot de passe - identifier l'id de l'utilisateur à l'aide de AccessToken.
Elle n'est pas sécurisée pour l'échange de l'id d'utilisateur. L'API Restful doit identifier l'utilisateur à l'aide de AccessToken reçu en en-tête HTTP.
Exemple au printemps-boot