feat: enable JWT auth from a header (#547)

This commit is contained in:
Noah Perks Sloan 2025-04-02 13:14:43 -05:00 committed by GitHub
parent 709d6ac2ad
commit 8865331da2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 13 additions and 1 deletions

View File

@ -107,6 +107,7 @@ type Config struct {
ShowNewVersions bool ShowNewVersions bool
EnableCustomJs bool EnableCustomJs bool
AuthJwtCookieName string AuthJwtCookieName string
AuthJwtHeader string
AuthJwtAud string AuthJwtAud string
AuthJwtDomain string AuthJwtDomain string
AuthJwtCertsURL string AuthJwtCertsURL string

View File

@ -9,6 +9,7 @@ import (
"google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoreflect"
"net/http" "net/http"
"strings"
apiv1 "github.com/OliveTin/OliveTin/gen/grpc/olivetin/api/v1" apiv1 "github.com/OliveTin/OliveTin/gen/grpc/olivetin/api/v1"
@ -53,6 +54,12 @@ func parseRequestMetadata(ctx context.Context, req *http.Request) metadata.MD {
provider := "unknown" provider := "unknown"
sid := "" sid := ""
if cfg.AuthJwtHeader != "" {
// JWTs in the Authorization header are usually prefixed with "Bearer " which is not part of the JWT token.
username, usergroup = parseJwt(strings.TrimPrefix(req.Header.Get(cfg.AuthJwtHeader), "Bearer "))
provider = "jwt-header"
}
if cfg.AuthJwtCookieName != "" { if cfg.AuthJwtCookieName != "" {
username, usergroup = parseJwtCookie(req) username, usergroup = parseJwtCookie(req)
provider = "jwt-cookie" provider = "jwt-cookie"

View File

@ -137,7 +137,11 @@ func parseJwtCookie(request *http.Request) (string, string) {
return "", "" return "", ""
} }
claims, err := getClaimsFromJwtToken(cookie.Value) return parseJwt(cookie.Value)
}
func parseJwt(token string) (string, string) {
claims, err := getClaimsFromJwtToken(token)
if err != nil { if err != nil {
log.Warnf("jwt claim error: %+v", err) log.Warnf("jwt claim error: %+v", err)