mirror of
https://github.com/storytold/irsa-manager.git
synced 2026-10-17 00:23:52 +00:00
abstract oidc factory
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
package oidc
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
awsclient "github.com/kkb0318/irsa-manager/internal/client"
|
||||
"github.com/kkb0318/irsa-manager/internal/selfhosted"
|
||||
)
|
||||
|
||||
type AwsS3IdPFactory struct {
|
||||
region string
|
||||
bucketName string
|
||||
awsConfig *awsclient.AwsConfig
|
||||
jwk *selfhosted.JWK
|
||||
jwksFileName string
|
||||
}
|
||||
|
||||
func NewAwsS3IdpFactory(ctx context.Context, region, bucketName string, jwk *selfhosted.JWK, jwksFileName string) (*AwsS3IdPFactory, error) {
|
||||
awsConfig, err := awsclient.NewAwsClient(ctx, region)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &AwsS3IdPFactory{
|
||||
region,
|
||||
bucketName,
|
||||
awsConfig,
|
||||
jwk,
|
||||
jwksFileName,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (f *AwsS3IdPFactory) IssuerMeta() selfhosted.OIDCIssuerMeta {
|
||||
return NewS3IssuerMeta(f.region, f.bucketName)
|
||||
}
|
||||
|
||||
func (f *AwsS3IdPFactory) IdP(i selfhosted.OIDCIssuerMeta) (selfhosted.OIDCIdP, error) {
|
||||
return NewAwsIdP(f.awsConfig, i)
|
||||
}
|
||||
|
||||
func (f *AwsS3IdPFactory) IdPDiscovery() selfhosted.OIDCIdPDiscovery {
|
||||
return NewS3IdPDiscovery(f.awsConfig, f.bucketName)
|
||||
}
|
||||
@@ -8,17 +8,17 @@ import (
|
||||
)
|
||||
|
||||
type AwsIdP struct {
|
||||
iamClient *client.AwsIamClient
|
||||
discovery selfhosted.OIDCIdPDiscovery
|
||||
iamClient *client.AwsIamClient
|
||||
issuerMeta selfhosted.OIDCIssuerMeta
|
||||
}
|
||||
|
||||
func NewAwsIdP(awsConfig *client.AwsConfig, discovery selfhosted.OIDCIdPDiscovery) (*AwsIdP, error) {
|
||||
func NewAwsIdP(awsConfig *client.AwsConfig, issuerMeta selfhosted.OIDCIssuerMeta) (*AwsIdP, error) {
|
||||
iamClient := awsConfig.IamCient()
|
||||
return &AwsIdP{iamClient, discovery}, nil
|
||||
return &AwsIdP{iamClient, issuerMeta}, nil
|
||||
}
|
||||
|
||||
func (a *AwsIdP) Create(ctx context.Context) (string, error) {
|
||||
arn, err := a.iamClient.CreateOIDCProvider(ctx, a.discovery.Endpoint())
|
||||
arn, err := a.iamClient.CreateOIDCProvider(ctx, a.issuerMeta.IssuerUrl())
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
@@ -16,14 +16,14 @@ type S3IdPDiscovery struct {
|
||||
|
||||
// NewS3IdPDiscovery initializes a new instance of S3IdPCreator with the specified AWS region and bucket name.
|
||||
// This function attempts to create an AWS client configured for the specified region.
|
||||
func NewS3IdPDiscovery(awsConfig *client.AwsConfig, bucketName string) (*S3IdPDiscovery, error) {
|
||||
func NewS3IdPDiscovery(awsConfig *client.AwsConfig, bucketName string) *S3IdPDiscovery {
|
||||
s3Client := awsConfig.S3Cient(bucketName)
|
||||
return &S3IdPDiscovery{s3Client}, nil
|
||||
return &S3IdPDiscovery{s3Client}
|
||||
}
|
||||
|
||||
// CreateStorage creates an S3 bucket
|
||||
func (s *S3IdPDiscovery) CreateStorage() error {
|
||||
err := s.s3Client.CreateBucket(context.TODO())
|
||||
func (s *S3IdPDiscovery) CreateStorage(ctx context.Context) error {
|
||||
err := s.s3Client.CreateBucket(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to create bucket, %w", err)
|
||||
}
|
||||
@@ -60,8 +60,3 @@ func (s *S3IdPDiscovery) Upload(ctx context.Context, o selfhosted.OIDCIdPDiscove
|
||||
return nil
|
||||
}
|
||||
|
||||
// Endpoint constructs the URL path for the OIDC issuer based on the provided AWS region and bucket name.
|
||||
// This utility function generates the expected host path for accessing the OIDC configuration stored in an S3 bucket.
|
||||
func (p *S3IdPDiscovery) Endpoint() string {
|
||||
return fmt.Sprintf("s3-%s.amazonaws.com/%s", p.s3Client.Region(), p.s3Client.BucketName())
|
||||
}
|
||||
|
||||
@@ -8,9 +8,9 @@ import (
|
||||
)
|
||||
|
||||
type IdPDiscoveryContents struct {
|
||||
jwk *selfhosted.JWK
|
||||
issuerHostPath string
|
||||
jwksFileName string
|
||||
jwk *selfhosted.JWK
|
||||
issuerMeta selfhosted.OIDCIssuerMeta
|
||||
jwksFileName string
|
||||
}
|
||||
|
||||
type oidcDiscoveryConfiguration struct {
|
||||
@@ -23,10 +23,14 @@ type oidcDiscoveryConfiguration struct {
|
||||
ClaimsSupported []string `json:"claims_supported"`
|
||||
}
|
||||
|
||||
func NewIdPDiscoveryContents(jwk *selfhosted.JWK, issuerMeta selfhosted.OIDCIssuerMeta, jwksFileName string) *IdPDiscoveryContents {
|
||||
return &IdPDiscoveryContents{jwk, issuerMeta, jwksFileName}
|
||||
}
|
||||
|
||||
func (p *IdPDiscoveryContents) Discovery() ([]byte, error) {
|
||||
oidcConfig := oidcDiscoveryConfiguration{
|
||||
Issuer: fmt.Sprintf("https://%s/", p.issuerHostPath),
|
||||
JWKSURI: fmt.Sprintf("https://%s/%s", p.issuerHostPath, p.jwksFileName),
|
||||
Issuer: fmt.Sprintf("%s/", p.issuerMeta.IssuerUrl()),
|
||||
JWKSURI: fmt.Sprintf("%s/%s", p.issuerMeta.IssuerUrl(), p.jwksFileName),
|
||||
AuthorizationEndpoint: "urn:kubernetes:programmatic_authorization",
|
||||
ResponseTypesSupported: []string{"id_token"},
|
||||
SubjectTypesSupported: []string{"public"},
|
||||
@@ -51,7 +55,3 @@ func (p *IdPDiscoveryContents) JWK() ([]byte, error) {
|
||||
func (p *IdPDiscoveryContents) JWKsFileName() string {
|
||||
return p.jwksFileName
|
||||
}
|
||||
|
||||
func NewIdPDiscoveryContents(jwk *selfhosted.JWK, issuerHostPath, jwksFileName string) *IdPDiscoveryContents {
|
||||
return &IdPDiscoveryContents{jwk, issuerHostPath, jwksFileName}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package oidc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type IssuerMeta interface {
|
||||
IssuerHostPath() string
|
||||
IssuerUrl() string
|
||||
}
|
||||
|
||||
type S3IssuerMeta struct {
|
||||
region string
|
||||
bucketName string
|
||||
}
|
||||
|
||||
func NewS3IssuerMeta(region, bucketName string) *S3IssuerMeta {
|
||||
return &S3IssuerMeta{region, bucketName}
|
||||
}
|
||||
|
||||
func (i *S3IssuerMeta) IssuerHostPath() string {
|
||||
return fmt.Sprintf("s3-%s.amazonaws.com/%s", i.region, i.bucketName)
|
||||
}
|
||||
|
||||
// IssuerUrl constructs the URL path for the OIDC issuer based on the provided AWS region and bucket name.
|
||||
// This utility function generates the expected host path for accessing the OIDC configuration stored in an S3 bucket.
|
||||
func (i *S3IssuerMeta) IssuerUrl() string {
|
||||
return fmt.Sprintf("https://%s", i.
|
||||
IssuerHostPath())
|
||||
}
|
||||
Reference in New Issue
Block a user