mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-21 13:55:43 +00:00
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
// 🚀 Fiber is an Express inspired web framework written in Go with 💖
|
|
// 📌 API Documentation: https://fiber.wiki
|
|
// 📝 Github Repository: https://github.com/gofiber/fiber
|
|
// Special thanks to Echo: https://github.com/labstack/echo/blob/master/middleware/jwt.go
|
|
|
|
package jwtware
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/golang-jwt/jwt/v5"
|
|
)
|
|
|
|
var (
|
|
defaultTokenLookup = "header:" + fiber.HeaderAuthorization
|
|
)
|
|
|
|
// New ...
|
|
func New(config ...Config) fiber.Handler {
|
|
cfg := makeCfg(config)
|
|
|
|
extractors := cfg.getExtractors()
|
|
|
|
// Return middleware handler
|
|
return func(c *fiber.Ctx) error {
|
|
// Filter request to skip middleware
|
|
if cfg.Filter != nil && cfg.Filter(c) {
|
|
return c.Next()
|
|
}
|
|
var auth string
|
|
var err error
|
|
|
|
for _, extractor := range extractors {
|
|
auth, err = extractor(c)
|
|
if auth != "" && err == nil {
|
|
break
|
|
}
|
|
}
|
|
if err != nil {
|
|
return cfg.ErrorHandler(c, err)
|
|
}
|
|
var token *jwt.Token
|
|
|
|
if _, ok := cfg.Claims.(jwt.MapClaims); ok {
|
|
token, err = jwt.Parse(auth, cfg.KeyFunc)
|
|
} else {
|
|
t := reflect.ValueOf(cfg.Claims).Type().Elem()
|
|
claims := reflect.New(t).Interface().(jwt.Claims)
|
|
token, err = jwt.ParseWithClaims(auth, claims, cfg.KeyFunc)
|
|
}
|
|
if err == nil && token.Valid {
|
|
// Store user information from token into context.
|
|
c.Locals(cfg.ContextKey, token)
|
|
return cfg.SuccessHandler(c)
|
|
}
|
|
return cfg.ErrorHandler(c, err)
|
|
}
|
|
}
|