Files
stack/ee/agent/internal/authenticator.go

52 lines
1.2 KiB
Go

package internal
import (
"context"
"net/http"
oidcclient "github.com/zitadel/oidc/v2/pkg/client"
"golang.org/x/oauth2/clientcredentials"
"google.golang.org/grpc/metadata"
)
type Authenticator interface {
authenticate(ctx context.Context) (metadata.MD, error)
}
type AuthenticatorFn func(ctx context.Context) (metadata.MD, error)
func (fn AuthenticatorFn) authenticate(ctx context.Context) (metadata.MD, error) {
return fn(ctx)
}
func TokenAuthenticator(token string) AuthenticatorFn {
return func(ctx context.Context) (metadata.MD, error) {
return metadata.New(map[string]string{"token": token}), nil
}
}
func BearerAuthenticator(issuer, clientID, clientSecret string) AuthenticatorFn {
return func(ctx context.Context) (metadata.MD, error) {
discovery, err := oidcclient.Discover(issuer, http.DefaultClient)
if err != nil {
return nil, err
}
config := clientcredentials.Config{
ClientID: "region_" + clientID,
ClientSecret: clientSecret,
TokenURL: discovery.TokenEndpoint,
}
token, err := config.Token(ctx)
if err != nil {
return nil, err
}
return metadata.New(map[string]string{
"bearer": token.AccessToken,
}), nil
}
}