add basic jwt auth
This commit is contained in:
144
controllers/userController.go
Normal file
144
controllers/userController.go
Normal file
@@ -0,0 +1,144 @@
|
||||
package controllers
|
||||
|
||||
import(
|
||||
"os"
|
||||
"time"
|
||||
"net/http"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"example.com/gin/test/models"
|
||||
)
|
||||
|
||||
|
||||
type UserController struct {
|
||||
DB *gorm.DB
|
||||
}
|
||||
|
||||
func NewUserController(db *gorm.DB) UserController {
|
||||
return UserController{
|
||||
DB: db,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func (uc *UserController) Signup(c *gin.Context) {
|
||||
//Get the email/passwd off req body
|
||||
var body struct {
|
||||
Email string
|
||||
Password string
|
||||
}
|
||||
|
||||
err := c.Bind(&body)
|
||||
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Failed to read body",
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
//hash pw
|
||||
hash, err := bcrypt.GenerateFromPassword([]byte(body.Password), 10)
|
||||
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Failed to hash password",
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
//create user
|
||||
user := models.User{Email: body.Email, Password: string(hash)}
|
||||
result := uc.DB.Create(&user)
|
||||
|
||||
if result.Error != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Failed to create user",
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
//respond
|
||||
c.JSON(http.StatusOK, gin.H{})
|
||||
}
|
||||
|
||||
|
||||
func (uc *UserController) Login(c *gin.Context) {
|
||||
//Get the email/passwd off req body
|
||||
var body struct {
|
||||
Email string
|
||||
Password string
|
||||
}
|
||||
|
||||
err := c.Bind(&body)
|
||||
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Failed to read body",
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
//lookup requested user
|
||||
var user models.User
|
||||
result := uc.DB.First(&user, "email = ?", body.Email)
|
||||
|
||||
if result.Error != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Invalid email or password",
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// compare sent with saved pass
|
||||
err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(body.Password))
|
||||
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Invalid email or password",
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
//generate jwt token
|
||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
||||
"sub": user.ID,
|
||||
"exp": time.Now().Add(time.Hour * 24).Unix(),
|
||||
})
|
||||
|
||||
// Sign and get the complete encoded token as a string using the secret
|
||||
tokenString, err := token.SignedString([]byte(os.Getenv("SECRET")))
|
||||
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Failed to create token",
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// send it back
|
||||
c.SetSameSite(http.SameSiteLaxMode)
|
||||
c.SetCookie("Authorization", tokenString, 3600 * 24, "", "", false, true)
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{})
|
||||
}
|
||||
|
||||
func (uc *UserController) Validate(c *gin.Context) {
|
||||
user, _ := c.Get("user")
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": user,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user