Forget about everyauth. This library is an overkill, imho. Implementing authentication is quite simple actually, follow the schema:
- User passes
username
and password
to the server;
- Server gets
username
and password
and checks in DB whether there is a user with that password
. If there is no user, just respond with an error;
- We have a user, now use built-in session mechanism of Express. Call
req.session.regenerate
and in the callback do req.session.userID = user.id
. Express will automatically send the cookie to the user;
- Create a middleware (has to fire before any other request handler), which basically searches the database for
req.session.userID
. If it finds one, then store it in req
, i.e. req.user = user
;
- In a view you simply check whether
req.user
variable is set. If it is, then we are authenticated. And you're done!
ad 1+2) To make authentication safe, you should use some cryptography (and/or HTTPS). For example, the password should be held in DB in two parts: salt
and hash
. salt
is generated randomly (at the time of registration) and hash = hash_it(pwd, salt)
, where hash_it
is some hashing algorithm (for example: MD5 or SHA256).
Now client side authentication can be made in several steps (only if you can use JavaScript):
- Server sends random
new_salt
to the login page (or generate one in JavaScript, there is no need to hide generating algorithm);
- User sends AJAX request
give me salt for user X
and server responds with the salt
stored in DB (the salt
is public);
- On response hash
pwd
with salt
and then hash the result again with new_salt
, store it in variable hpwd
;
- Client sends
username
, hpwd
and new_salt
to the server;
- Server gets
pwd
from DB for username
, hashes pwd
with new_salt
and compares the result to hpwd
(note: you do not store new_salt
).
This method is nice, since every time you log in a random (from the external point of view) data flows through net, even though the username
and the password
is the same.
This is important, because password
leak is a serious thing. Not because someone can break your app's account (that's a minor damage, unless you're a bank - but then you wouldn't ask such questions :D ). Mostly because people tend to use the same passwords for multiple sites, including bank accounts.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…