aboutsummaryrefslogtreecommitdiffhomepage
path: root/backend/auth/jwt.go
blob: aa35de610fb1741f4da4e0a0622dcd94d63351b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package auth

import (
	"time"

	"github.com/golang-jwt/jwt/v5"
	echojwt "github.com/labstack/echo-jwt/v4"
	"github.com/labstack/echo/v4"

	"github.com/nsfisis/iosdc-2024-albatross-backend/db"
)

type JWTClaims struct {
	UserID          int     `json:"user_id"`
	Username        string  `json:"username"`
	DisplayUsername string  `json:"display_username"`
	IconPath        *string `json:"icon_path"`
	IsAdmin         bool    `json:"is_admin"`
	jwt.RegisteredClaims
}

func NewJWT(user *db.User) (string, error) {
	var iconPath *string
	if user.IconPath.Valid {
		iconPath = &user.IconPath.String
	}
	claims := &JWTClaims{
		UserID:          int(user.UserID),
		Username:        user.Username,
		DisplayUsername: user.DisplayUsername,
		IconPath:        iconPath,
		IsAdmin:         user.IsAdmin,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * 24)),
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString([]byte("TODO"))
}

func NewJWTMiddleware() echo.MiddlewareFunc {
	return echojwt.WithConfig(echojwt.Config{
		NewClaimsFunc: func(c echo.Context) jwt.Claims {
			return new(JWTClaims)
		},
		SigningKey: []byte("TODO"),
	})
}

func GetJWTClaimsFromEchoContext(c echo.Context) *JWTClaims {
	user := c.Get("user").(*jwt.Token)
	claims := user.Claims.(*JWTClaims)
	return claims
}