Spaces:
Runtime error
Runtime error
| package controllers | |
| import ( | |
| "net/http" | |
| "os" | |
| "time" | |
| "uptime/backend/database" | |
| "uptime/backend/models" | |
| "github.com/gin-gonic/gin" | |
| "github.com/golang-jwt/jwt/v5" | |
| "golang.org/x/crypto/bcrypt" | |
| ) | |
| func Login(c *gin.Context) { | |
| var body struct { | |
| Username string `json:"username"` | |
| Password string `json:"password"` | |
| } | |
| if err := c.BindJSON(&body); err != nil { | |
| c.JSON(http.StatusBadRequest, gin.H{"error": "Failed to read body"}) | |
| return | |
| } | |
| var user models.User | |
| database.DB.First(&user, "username = ?", body.Username) | |
| if user.ID == 0 { | |
| c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid username or password"}) | |
| return | |
| } | |
| err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(body.Password)) | |
| if err != nil { | |
| c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid username or password"}) | |
| return | |
| } | |
| token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ | |
| "sub": user.ID, | |
| "exp": time.Now().Add(time.Hour * 24 * 30).Unix(), | |
| }) | |
| tokenString, err := token.SignedString([]byte(os.Getenv("SECRET"))) | |
| if err != nil { | |
| c.JSON(http.StatusBadRequest, gin.H{"error": "Failed to create token"}) | |
| return | |
| } | |
| c.SetSameSite(http.SameSiteLaxMode) | |
| c.SetCookie("Authorization", tokenString, 3600*24*30, "/", "", false, true) | |
| c.JSON(http.StatusOK, gin.H{}) | |
| } |