// AuthenticateUser authenticates a user against the database.
// It populates the session with a user ID to allow middleware to check future requests
// against the database.
func AuthenticateUser(c web.C, w http.ResponseWriter, r *http.Request) (int, error) {
session, err := store.Get(r, "somename")
if err != nil {
return 500, err
}
err = r.ParseForm()
if err != nil {
return 500, err
}
// Ensure email field is not obnoxiously long.
email := r.PostFormValue("email")
if utf8.RuneCountInString(email) > 255 {
return 400, err
}
user := models.User{Email: email}
password := r.PostFormValue("password")
exists, err := user.Get()
if err != nil {
return 500, err
}
// Re-direct back to the login page if the user does not exist
if !exists {
// Save error in session flash
session.AddFlash(ErrCredentialsIncorrect, "_errors")
err := session.Save(r, w)
if err != nil {
return 500, err
}
http.Redirect(w, r, loginURL, 302)
return 302, err
}
// Leverage the bcrypt package's secure comparison.
err = bcrypt.CompareHashAndPassword(user.PasswordHash, []byte(password))
if err != nil {
// Save error in session flash
session.AddFlash(ErrCredentialsIncorrect, "_errors")
err := session.Save(r, w)
if err != nil {
return 500, err
}
http.Redirect(w, r, loginURL, 302)
return 302, err
}
session.Values["userID"] = user.Id
err = session.Save(r, w)
if err != nil {
return 500, err
}
// Re-direct to the dashboard
http.Redirect(w, r, dashboardURL, 302)
return 302, nil
}