Files
GinTutorial/controllers/auth_controller.go

103 lines
1.9 KiB
Go

package controllers
import (
"GinTutorial/global"
"GinTutorial/models"
"GinTutorial/utils"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
)
func Register(ctx *gin.Context) {
var user models.User
if err := ctx.ShouldBindJSON(&user); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
hashPassword, err := utils.HashPassword(user.Password)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"error": err.Error(),
})
}
user.Password = hashPassword
if err := global.Db.AutoMigrate(&user); err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"error": err.Error(),
})
return
}
if err := global.Db.Create(&user).Error; err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"error": err.Error(),
})
return
}
token, err := utils.GenerateJWT(strconv.Itoa(int(user.ID)))
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"error": err.Error(),
})
return
}
ctx.JSON(http.StatusOK, gin.H{
"token": token,
})
}
func Login(ctx *gin.Context) {
var InputUser struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
if err := ctx.ShouldBindJSON(&InputUser); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
var user models.User
if err := global.Db.Where("username = ?", InputUser.Username).First(&user).Error; err != nil {
ctx.JSON(http.StatusUnauthorized, gin.H{
"error": "Invalid username or password",
})
return
}
if !utils.CheckPassword(InputUser.Password, user.Password) {
ctx.JSON(http.StatusUnauthorized, gin.H{
"error": "Invalid username or password",
})
return
}
token, err := utils.GenerateJWT(strconv.Itoa(int(user.ID)))
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"error": err.Error(),
})
return
}
ctx.JSON(http.StatusOK, gin.H{
"token": token,
})
}