rentease/internal/server/auth.go

81 lines
1.7 KiB
Go

package server
import (
"net/http"
"os"
"time"
"github.com/golang-jwt/jwt/v5"
"github.com/labstack/echo/v4"
)
const (
cookieName = "rentuuid"
routeLogin = "/login"
)
var validityTime = time.Now().Add(time.Hour * 24)
type Claims struct {
jwt.RegisteredClaims
}
func MakeAuthMiddleware(secretKey string) echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
cookie, err := c.Cookie(cookieName)
if err != nil {
return c.Redirect(http.StatusSeeOther, routeLogin)
}
signedToken := cookie.Value
token, err := jwt.Parse(
signedToken,
func(*jwt.Token) (interface{}, error) {
return []byte(secretKey), nil
},
jwt.WithValidMethods([]string{jwt.SigningMethodHS256.Name}),
)
if err != nil {
return c.Redirect(http.StatusSeeOther, routeLogin)
}
if !token.Valid {
return c.Redirect(http.StatusSeeOther, routeLogin)
}
_, err = token.Claims.GetSubject()
if err != nil {
return c.Redirect(http.StatusSeeOther, routeLogin)
}
return next(c)
}
}
}
// TODO: refactor to use a `AuthService`
func writeCookie(c echo.Context, email string) error {
claims := &Claims{
jwt.RegisteredClaims{
Subject: email,
ExpiresAt: jwt.NewNumericDate(validityTime),
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signedToken, err := token.SignedString([]byte(os.Getenv("SECRET_KEY")))
if err != nil {
return err
}
cookie := new(http.Cookie)
cookie.Name = cookieName
cookie.Value = signedToken
cookie.Expires = validityTime
cookie.HttpOnly = true
cookie.Domain = os.Getenv("DOMAIN")
cookie.Secure = true
cookie.SameSite = http.SameSiteStrictMode
c.SetCookie(cookie)
return nil
}