Skip to content

Commit 057c3ce

Browse files
authored
Merge pull request #6 from KunalKumar-1/middleware-auth
auth: implementing Auth middleware & protecting the important routes
2 parents 5057772 + c5d73d4 commit 057c3ce

File tree

2 files changed

+84
-10
lines changed

2 files changed

+84
-10
lines changed

cmd/api/middleware.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package main
2+
3+
import (
4+
"net/http"
5+
"strings"
6+
7+
"github.com/gin-gonic/gin"
8+
"github.com/golang-jwt/jwt/v4"
9+
)
10+
11+
func (app *application) AuthMiddleware() gin.HandlerFunc {
12+
return func(c *gin.Context) {
13+
authHeader := c.GetHeader("Authorization")
14+
if authHeader == "" {
15+
c.JSON(http.StatusUnauthorized, gin.H{"error": "Auth header is required"})
16+
c.Abort()
17+
return
18+
}
19+
20+
tokenString := strings.TrimPrefix(authHeader, "Bearer ")
21+
if tokenString == authHeader {
22+
c.JSON(http.StatusUnauthorized, gin.H{"error": "Bearer token is required"})
23+
c.Abort()
24+
return
25+
}
26+
27+
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
28+
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
29+
return nil, jwt.ErrSignatureInvalid
30+
}
31+
return []byte(app.jwtSecret), nil
32+
})
33+
34+
if err != nil || !token.Valid {
35+
c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid token"})
36+
c.Abort()
37+
return
38+
}
39+
40+
claims, ok := token.Claims.(jwt.MapClaims)
41+
if !ok {
42+
c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid token"})
43+
c.Abort()
44+
return
45+
}
46+
47+
userIdVal, exists := claims["UserId"]
48+
if !exists {
49+
c.JSON(http.StatusUnauthorized, gin.H{"error": "UserId not found in token"})
50+
c.Abort()
51+
return
52+
}
53+
54+
userIdFloat, ok := userIdVal.(float64)
55+
if !ok {
56+
c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid userId type in token"})
57+
c.Abort()
58+
return
59+
}
60+
user, err := app.models.Users.Get(int(userIdFloat))
61+
if err != nil {
62+
c.JSON(http.StatusUnauthorized, gin.H{"error": "unauthorized access!"})
63+
c.Abort()
64+
return
65+
}
66+
67+
c.Set("user", user)
68+
c.Next()
69+
}
70+
}

cmd/api/routes.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,22 @@ func (app *application) routes() http.Handler {
1111

1212
v1 := r.Group("/api/v1")
1313
{
14-
v1.POST("/events", app.createEvent) // create event
15-
v1.GET("/events", app.getAllEvent) // get all events
16-
v1.GET("/events/:id", app.getEvent) // get event by id
17-
v1.PUT("/events/:id", app.updateEvent) // update event by id
18-
v1.DELETE("/events/:id", app.deleteEvent) //delete the event by id
19-
v1.POST("/events/:id/attendees/:userId", app.addAttendeeToEvent) // get attendee to event
20-
v1.GET("/events/:id/attendees/", app.getAttendeesForEvent) // add attendee to event
21-
v1.DELETE("/events/:id/attendees/:userId", app.deleteAttendeeFromEvent) //delete attendee from event
22-
v1.GET("/attendees/:id/events", app.getEventsByAttendee) //get attendees for event
23-
v1.POST("/auth/register", app.registerUser) // register user
14+
v1.GET("/events", app.getAllEvent) // get all events
15+
v1.GET("/events/:id", app.getEvent) // get event by id
16+
v1.GET("/events/:id/attendees/", app.getAttendeesForEvent) // add attendee to event
17+
v1.GET("/attendees/:id/events", app.getEventsByAttendee) // get attendees for event
18+
v1.POST("/auth/register", app.registerUser) // register user
2419
v1.POST("/auth/login", app.login)
20+
}
2521

22+
auth := v1.Group("/")
23+
auth.Use(app.AuthMiddleware())
24+
{
25+
auth.POST("/events", app.createEvent) // create event
26+
auth.PUT("/events/:id", app.updateEvent) // update event by id
27+
auth.DELETE("/events/:id", app.deleteEvent) // delete the event by id
28+
auth.POST("/events/:id/attendees/:userId", app.addAttendeeToEvent) // get attendee to event
29+
auth.DELETE("/events/:id/attendees/:userId", app.deleteAttendeeFromEvent) // delete attendee from event
2630
}
2731

2832
return r

0 commit comments

Comments
 (0)