Select Git revision
main.go 1.51 KiB
package main
import (
"encoding/json"
"log"
"net/http"
"golang.org/x/crypto/bcrypt"
)
type User struct {
ID int `json:"id"`
Username string `json:"username"`
Email string `json:"email"`
Password string `json:"-"`
}
var users []User
var lastUserID int
func main() {
http.HandleFunc("/signup", signUp)
http.HandleFunc("/login", login)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func signUp(w http.ResponseWriter, r *http.Request) {
var newUser User
err := json.NewDecoder(r.Body).Decode(&newUser)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(newUser.Password), bcrypt.DefaultCost)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
newUser.Password = string(hashedPassword)
lastUserID++
newUser.ID = lastUserID
users = append(users, newUser)
w.WriteHeader(http.StatusOK)
}
func login(w http.ResponseWriter, r *http.Request) {
var loginData struct {
Username string `json:"username"`
Password string `json:"password"`
}
err := json.NewDecoder(r.Body).Decode(&loginData)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
for _, user := range users {
if user.Username == loginData.Username {
err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(loginData.Password))
if err == nil {
w.WriteHeader(http.StatusOK)
return
}
}
}
http.Error(w, "Invalid username or password", http.StatusUnauthorized)
}