85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
|
package providers
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
"github.com/MicahParks/keyfunc/v3"
|
||
|
"github.com/golang-jwt/jwt/v5"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
var refreshRate = 1 * time.Hour
|
||
|
|
||
|
var Jwks keyfunc.Keyfunc
|
||
|
|
||
|
type JwtIDToken struct {
|
||
|
Exp int `json:"exp"`
|
||
|
Iat int `json:"iat"`
|
||
|
AuthTime int `json:"auth_time"`
|
||
|
Jti string `json:"jti"`
|
||
|
Iss string `json:"iss"`
|
||
|
Aud string `json:"aud"`
|
||
|
Sub string `json:"sub"`
|
||
|
Typ string `json:"typ"`
|
||
|
Azp string `json:"azp"`
|
||
|
SessionState string `json:"session_state"`
|
||
|
AtHash string `json:"at_hash"`
|
||
|
Acr string `json:"acr"`
|
||
|
Sid string `json:"sid"`
|
||
|
EmailVerified bool `json:"email_verified"`
|
||
|
Name string `json:"name"`
|
||
|
PreferredUsername string `json:"preferred_username"`
|
||
|
GivenName string `json:"given_name"`
|
||
|
FamilyName string `json:"family_name"`
|
||
|
Email string `json:"email"`
|
||
|
Groups []string `json:"groups"`
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
ErrJWKSNotInitialized = errors.New("JWKS is not initialized")
|
||
|
)
|
||
|
|
||
|
func InitJwksRefresh() {
|
||
|
// 启动一个定时器
|
||
|
go func() {
|
||
|
for {
|
||
|
RefreshJWKS()
|
||
|
time.Sleep(refreshRate)
|
||
|
}
|
||
|
}()
|
||
|
}
|
||
|
|
||
|
func RefreshJWKS() {
|
||
|
Logger.Info("Refreshing JWKS...")
|
||
|
|
||
|
var err error
|
||
|
|
||
|
Jwks, err = keyfunc.NewDefault([]string{Config.JWKS.Url})
|
||
|
if err != nil {
|
||
|
Logger.Error("Failed to create JWK Set from resource at the given URL.\nError: " + err.Error())
|
||
|
}
|
||
|
|
||
|
Logger.Info("JWKS refreshed.")
|
||
|
}
|
||
|
|
||
|
func ParseJWT(jwtB64 string) (*jwt.Token, error) {
|
||
|
//if Jwks.Keyfunc == nil {
|
||
|
// Logger.Error(ErrJWKSNotInitialized.Error())
|
||
|
// return nil, ErrJWKSNotInitialized
|
||
|
//}
|
||
|
|
||
|
token, err := jwt.Parse(jwtB64, Jwks.Keyfunc)
|
||
|
|
||
|
return token, err
|
||
|
}
|
||
|
|
||
|
func GetAuthFromCtx(ctx context.Context) *JwtIDToken {
|
||
|
auth := ctx.Value("auth")
|
||
|
|
||
|
if auth == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return auth.(*JwtIDToken)
|
||
|
}
|