11package auth
22
33import (
4+ "net/url"
45 "strings"
56
67 "github.com/gofiber/fiber/v2"
8+ "github.com/golang-jwt/jwt/v4"
79 "github.com/limanmys/render-engine/internal/liman"
10+ "github.com/limanmys/render-engine/pkg/helpers"
811 "github.com/limanmys/render-engine/pkg/logger"
912)
1013
@@ -13,8 +16,33 @@ func New() fiber.Handler {
1316 return authorization
1417}
1518
19+ type Cookie struct {
20+ Token string `cookie:"token"`
21+ }
22+
1623// authorization Middleware auths users before requests
1724func authorization (c * fiber.Ctx ) error {
25+ cookie := new (Cookie )
26+ c .CookieParser (cookie )
27+
28+ if len (cookie .Token ) > 0 {
29+ decoded , err := url .QueryUnescape (cookie .Token )
30+ if err != nil {
31+ logger .FiberError (fiber .StatusUnauthorized , "invalid authorization token (cookie), " + err .Error ())
32+ }
33+
34+ if len (decoded ) < 1 {
35+ return logger .FiberError (fiber .StatusUnauthorized , "authorization token is missing" )
36+ }
37+
38+ code , err := helpers .LaravelAesDecrypt ("token" , decoded )
39+ if err != nil {
40+ return logger .FiberError (fiber .StatusUnauthorized , "invalid authorization token (cookie), " + err .Error ())
41+ }
42+
43+ return jwtValidation (c , code )
44+ }
45+
1846 if len (c .FormValue ("token" )) > 0 {
1947 user , err := liman .AuthWithToken (
2048 strings .Trim (c .FormValue ("token" ), "" ),
@@ -56,3 +84,23 @@ func authorization(c *fiber.Ctx) error {
5684
5785 return logger .FiberError (fiber .StatusUnauthorized , "authorization token is missing" )
5886}
87+
88+ func jwtValidation (c * fiber.Ctx , code string ) error {
89+ token , err := jwt .Parse (code , func (token * jwt.Token ) (interface {}, error ) {
90+ if _ , ok := token .Method .(* jwt.SigningMethodHMAC ); ! ok {
91+ return nil , logger .FiberError (fiber .StatusUnauthorized , "invalid authorization token" )
92+ }
93+ return []byte (helpers .Env ("JWT_SECRET" , "" )), nil
94+ })
95+
96+ if err != nil {
97+ return logger .FiberError (fiber .StatusUnauthorized , "invalid authorization token" )
98+ }
99+
100+ if claims , ok := token .Claims .(jwt.MapClaims ); ok && token .Valid {
101+ c .Locals ("user_id" , claims ["sub" ])
102+ return c .Next ()
103+ } else {
104+ return logger .FiberError (fiber .StatusUnauthorized , "invalid authorization token" )
105+ }
106+ }
0 commit comments