views:

66

answers:

2

What is the proper way to structure a RESTful resource for resetting a password?

This resource is meant to be a password resetter for someone who has lost or forgotten their password. It invalidates their old password and e-mails them a password.

The two options that I have are:

POST /reset_password/{user_name}

or...

POST /reset_password
   -Username passed through request body

I'm pretty sure the request should be a POST. I'm less confident that I have selected an appropriate name. And I'm not sure if the user_name should be passed through the URL or the request body.

+2  A: 

UPDATE: (further to comment below)

I would go for something like this:

POST /users/{user_name}/reset_password

You have a collection of users, where the single user is specified by the {user_name}. You would then specify the action to operate on, which in this case is reset_password. It is like saying "Create (POST) a new reset_password action for {user_name}".


Previous answer:

I would go for something like this:

PUT /users/{user_name}/attributes/password
    -- The "current password" and the "new password" passed through the body

You'd have two collections, a users collection, and an attributes collection for each user. The user is specified by the {user_name} and the attribute is specified by password. The PUT operation updates the addressed member of the collection.

Daniel Vassallo
This resource is meant to reset the password for someone who has lost or forgotten their password. I clarified above.
DutrowLLC
Oh, sorry... misunderstood... Updated my answer.
Daniel Vassallo
Its all good, I should have been more clear.
DutrowLLC
Yeah, that looks better than what I had, I'll have to re-factor how I'm structuring some of these resources.
DutrowLLC
+2  A: 

Let's get uber-RESTful for a second. Why not use the DELETE action for the password to trigger a reset? Makes sense, doesn't it? After all, you're effectively discarding the existing password in favor of another one.

That means you'd do:

DELETE /users/{user_name}/password

Now, two big caveats:

  1. HTTP DELETE is supposed to be idempotent (a fancy word for saying "no big deal if you do it multiple times"). If you're doing the standard stuff like sending out a "Password Reset" email, then you're going to run into problems. You could work around this tagging the user/password with a boolean "Is Reset" flag. On every delete, you check this flag; if it's not set then you can reset the password and send your email. (Note that having this flag might have other uses too.)

  2. You can't use HTTP DELETE through a form, so you'll have to make an AJAX call and/or tunnel the DELETE through the POST.

Craig Walker
Interesting idea. However I don't see `DELETE` fitting well in here. You'd be substituting the password with a randomly generated one, I guess, so `DELETE` could be misleading. I prefer the `Create (POST) new reset_password action`, where the noun (resource) you'd be acting on is the "reset_password action". This fits well for sending emails as well, since the action encapsulates all these lower-level details. `POST` is not idempotent.
Daniel Vassallo