package handlers import ( "encoding/json" "net/http" "server/database" "server/helper" ) type loginRequest struct { Email string Password string } func Login(writer http.ResponseWriter, request *http.Request) { if request.Method != "POST" { helper.WriteErrorJson("expected POST method", writer, http.StatusBadRequest) return } var login_request loginRequest err := json.NewDecoder(request.Body).Decode(&login_request) if err != nil { helper.WriteErrorJson(err.Error(), writer, http.StatusBadRequest) return } user, err := database.MaybeGetUser(login_request.Email) if err != nil { helper.WriteInternalErrorJson(err, writer) return } if user == nil { helper.WriteErrorJson("incorrect email or password", writer, http.StatusForbidden) return } hash, err := helper.GenerateHash(login_request.Password, user.Password_salt) if err != nil { helper.WriteInternalErrorJson(err, writer) return } if hash != user.Password_hash { helper.WriteErrorJson("incorrect email or password", writer, http.StatusForbidden) return } // Login is successful, issue a valid jwt. err = helper.IssueToken(user.Uid, writer) if err != nil { helper.WriteInternalErrorJson(err, writer) return } }