mirror of
https://github.com/netbirdio/netbird.git
synced 2025-02-18 11:11:20 +01:00
52 lines
1.5 KiB
Go
52 lines
1.5 KiB
Go
package jwtclaims
|
|
|
|
import (
|
|
"github.com/golang-jwt/jwt"
|
|
"net/http"
|
|
)
|
|
|
|
const (
|
|
TokenUserProperty = "user"
|
|
AccountIDSuffix = "wt_account_id"
|
|
DomainIDSuffix = "wt_account_domain"
|
|
UserIDClaim = "sub"
|
|
)
|
|
|
|
// Extract function type
|
|
type ExtractClaims func(r *http.Request, authAudiance string) AuthorizationClaims
|
|
|
|
// ClaimsExtractor struct that holds the extract function
|
|
type ClaimsExtractor struct {
|
|
ExtractClaimsFromRequestContext ExtractClaims
|
|
}
|
|
|
|
// NewClaimsExtractor returns an extractor, and if provided with a function with ExtractClaims signature,
|
|
// then it will use that logic. Uses ExtractClaimsFromRequestContext by default
|
|
func NewClaimsExtractor(e ExtractClaims) *ClaimsExtractor {
|
|
var extractFunc ExtractClaims
|
|
if extractFunc = e; extractFunc == nil {
|
|
extractFunc = ExtractClaimsFromRequestContext
|
|
}
|
|
|
|
return &ClaimsExtractor{
|
|
ExtractClaimsFromRequestContext: extractFunc,
|
|
}
|
|
}
|
|
|
|
// ExtractClaimsFromRequestContext extracts claims from the request context previously filled by the JWT token (after auth)
|
|
func ExtractClaimsFromRequestContext(r *http.Request, authAudiance string) AuthorizationClaims {
|
|
token := r.Context().Value(TokenUserProperty).(*jwt.Token)
|
|
claims := token.Claims.(jwt.MapClaims)
|
|
jwtClaims := AuthorizationClaims{}
|
|
jwtClaims.UserId = claims[UserIDClaim].(string)
|
|
accountIdClaim, ok := claims[authAudiance+AccountIDSuffix]
|
|
if ok {
|
|
jwtClaims.AccountId = accountIdClaim.(string)
|
|
}
|
|
domainClaim, ok := claims[authAudiance+DomainIDSuffix]
|
|
if ok {
|
|
jwtClaims.Domain = domainClaim.(string)
|
|
}
|
|
return jwtClaims
|
|
}
|