polycule-connect/polyculeconnect/internal/client/client.go

53 lines
1.3 KiB
Go
Raw Normal View History

package client
import (
"context"
"fmt"
2024-09-22 08:26:27 +00:00
"log/slog"
2024-09-22 08:26:27 +00:00
"git.faercol.me/faercol/polyculeconnect/polyculeconnect/logger"
"github.com/google/uuid"
"github.com/zitadel/oidc/v3/pkg/client/rp"
2024-09-22 08:26:27 +00:00
"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
2024-09-22 08:26:27 +00:00
provider rp.RelyingParty
2024-09-22 08:26:27 +00:00
ctx context.Context
l *zap.SugaredLogger
}
func New(ctx context.Context, conf *Backend, l *zap.SugaredLogger) (*OIDCClient, error) {
2024-09-22 08:26:27 +00:00
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
2024-09-22 08:26:27 +00:00
}
func (c *OIDCClient) AuthorizationEndpoint() string {
url := rp.AuthURL(uuid.NewString(), c.provider)
return url
}