One concern I have is with the trust you place on the token. This token can be stolen, even if there is a TTL on it. A couple things you can do, authenticate with every request or map the token to the IP and port (aka the connection). This way it cannot be stolen. If that becomes too hard then just require the credentials with every request.
When authenticating the user make sure to salt your passwords int he DB. Please look up how to properly store passwords in a DB.
Do not have the password passed to you. The password should instead be used to encrypt a digest.
Another thing to consider is message authentication. Your approach does not implement MAC (message authentication). With MAC you ensure the message was not tampered with. While I agree that tampering with an SSL message is hard you never know when your client might be using non-SSL and then having a network appliance do the SSL for them. So the message might be visible for part of the way there.
So with all that taken into account this is what I recommend.
- Do not pass the password in the request.
- Implement a hashed digest that uses strong encryption like SHA-256.
- To create the digest hash the following: username, pw, some parts of the request if not all of it, and a NONCE (a number used once).
- The client can generate the NONCE them self, if they do it should be based on time, like a timestamp, so that you can verify that its a recent NONCE. Or you can send them a NONCE that you generate yourself in a 401 Authentication Required error code. Maybe the NONCE can be the token from your original post.
- For every request, the server will hash the same and verify that the digest value is the same.
What you will find is that other web services follow something similar to this but with different names. The points are this, don't pass the password in the message, use a digest for message and user authentication, use a NONCE so that the digest cannot be stolen and reused.