mirror of
https://github.com/hanzo-fi/stack.git
synced 2026-10-30 20:34:43 +00:00
52 lines
1.2 KiB
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
|
|
}
|
|
}
|