58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package jwks
|
|
|
|
import (
|
|
"errors"
|
|
"leafdev.top/Leaf/api-platform/internal/base/conf"
|
|
"leafdev.top/Leaf/api-platform/internal/base/logger"
|
|
|
|
"github.com/MicahParks/keyfunc/v3"
|
|
"github.com/golang-jwt/jwt/v5"
|
|
)
|
|
|
|
var Jwks keyfunc.Keyfunc
|
|
|
|
var (
|
|
ErrJWKSNotInitialized = errors.New("JWKS is not initialized")
|
|
)
|
|
|
|
type JWKS struct {
|
|
url string
|
|
logger *logger.Logger
|
|
config *conf.Config
|
|
}
|
|
|
|
func NewJWKS(config *conf.Config, logger *logger.Logger) *JWKS {
|
|
return &JWKS{
|
|
url: config.JWKS.Url,
|
|
logger: logger,
|
|
config: config,
|
|
}
|
|
}
|
|
|
|
func (j *JWKS) RefreshJWKS() {
|
|
if j.config.Debug.Enabled {
|
|
return
|
|
}
|
|
|
|
j.logger.Logger.Info("Refreshing JWKS...")
|
|
|
|
var err error
|
|
|
|
Jwks, err = keyfunc.NewDefault([]string{j.url})
|
|
if err != nil {
|
|
j.logger.Logger.Error("Failed to create JWK Set from resource at the given URL.\nError: " + err.Error())
|
|
} else {
|
|
j.logger.Logger.Info("JWKS refreshed.")
|
|
}
|
|
}
|
|
|
|
func (j *JWKS) ParseJWT(jwtB64 string) (*jwt.Token, error) {
|
|
if Jwks.Keyfunc == nil {
|
|
return nil, ErrJWKSNotInitialized
|
|
}
|
|
|
|
token, err := jwt.Parse(jwtB64, Jwks.Keyfunc)
|
|
|
|
return token, err
|
|
}
|