Added JWT Auth

Wrote my own JWT auth middleware, since I could not get the go-chi middleware to accept a JWKS instead of a certificate.
This commit is contained in:
Annika Merris 2024-02-10 17:18:22 -05:00
parent ac18b94a86
commit b5ea01729b
12 changed files with 336 additions and 132 deletions

33
main.go
View file

@ -9,18 +9,17 @@ import (
"os"
"time"
"forgejo.merr.is/annika/isl-api/Controllers"
"forgejo.merr.is/annika/isl-api/Routes"
"forgejo.merr.is/annika/isl-api/Services"
"forgejo.merr.is/annika/isl-api/controllers"
"forgejo.merr.is/annika/isl-api/middlewares"
"forgejo.merr.is/annika/isl-api/routes"
"forgejo.merr.is/annika/isl-api/services"
"forgejo.merr.is/annika/isl-api/sql/powerItem"
"github.com/go-chi/chi/v5"
"github.com/go-chi/cors"
"github.com/go-chi/httplog/v2"
"github.com/jackc/pgx/v4/pgxpool"
"github.com/lestrrat-go/jwx/v2/jwk"
"github.com/lestrrat-go/jwx/v2/jwt"
"github.com/lmittmann/tint"
"github.com/moosetheory/jwtauth/v5"
"github.com/spf13/viper"
)
@ -81,22 +80,14 @@ type dependencies struct {
context context.Context
jwkContext context.Context
powerItemQuerier *powerItem.DBQuerier
powerItemService *Services.PowerItemService
powerItemController *Controllers.PowerItemController
powerItemService *services.PowerItemService
powerItemController *controllers.PowerItemController
jwkCache *jwk.Cache
}
func (d *dependencies) initializeDependencies() error {
logger.Info("Initializing dependencies")
var err error
d.jwkContext = context.Background()
d.jwkCache = jwk.NewCache(d.jwkContext)
d.jwkCache.Register(conf.JWKSURI, jwk.WithMinRefreshInterval(15*time.Minute))
_, err = d.jwkCache.Refresh(d.jwkContext, conf.JWKSURI)
if err != nil {
logger.Error("Error setting up JWK cache", "error", err)
return err
}
d.router = chi.NewRouter()
@ -119,17 +110,15 @@ func (d *dependencies) initializeDependencies() error {
return err
}
d.powerItemQuerier = powerItem.NewQuerier(d.postgresConnection)
d.powerItemService = Services.NewPowerItemService(d.powerItemQuerier)
d.powerItemController = Controllers.NewPowerItemController(d.powerItemService)
d.powerItemService = services.NewPowerItemService(d.powerItemQuerier)
d.powerItemController = controllers.NewPowerItemController(d.powerItemService)
jwkSet, err := d.jwkCache.Get(d.jwkContext, conf.JWKSURI)
tokenAuth, err := middlewares.New(conf.JWKSURI, d.context)
if err != nil {
logger.Error("Error getting JWKS", "error", err)
return err
logger.Error("Error setting up JWT authentication middleware", "error", err)
}
tokenAuth := jwtauth.New("HS256", nil, nil, jwkSet, jwt.WithAcceptableSkew(30*time.Second))
d.router.Mount("/powerItems", Routes.SetupPowerItemRoutes(*d.powerItemController, tokenAuth))
d.router.Mount("/powerItems", routes.SetupPowerItemRoutes(*d.powerItemController, tokenAuth))
logger.Info("Finished initializing dependencies")
return nil
}