package client import ( "context" "fmt" "log/slog" "git.faercol.me/faercol/polyculeconnect/polyculeconnect/logger" "github.com/google/uuid" "github.com/zitadel/oidc/v3/pkg/client/rp" "go.uber.org/zap" "go.uber.org/zap/exp/zapslog" ) type BackendOIDCConfig struct { Issuer string ClientID string ClientSecret string RedirectURI string } type Backend struct { ID uuid.UUID Name string Config BackendOIDCConfig } // OIDCClient is an OIDC client which is the client used to access a registered backend type OIDCClient struct { backend *Backend provider rp.RelyingParty ctx context.Context l *zap.SugaredLogger } func New(ctx context.Context, conf *Backend, l *zap.SugaredLogger) (*OIDCClient, error) { options := []rp.Option{ rp.WithLogger(slog.New(zapslog.NewHandler(logger.L.Desugar().Core(), nil))), } pr, err := rp.NewRelyingPartyOIDC(ctx, conf.Config.Issuer, conf.Config.ClientID, conf.Config.ClientSecret, conf.Config.RedirectURI, []string{}, options...) if err != nil { return nil, fmt.Errorf("failed to init relying party provider: %w", err) } return &OIDCClient{ctx: ctx, backend: conf, provider: pr, l: l}, nil } func (c *OIDCClient) AuthorizationEndpoint() string { url := rp.AuthURL(uuid.NewString(), c.provider) return url }