Skip to content
Snippets Groups Projects
Select Git revision
  • 3680ec2c5204bef0fbc471ec09cd37bd5185cc45
  • main default protected
2 results

main.go

Blame
  • 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)
    }