modules/Definitions/Okta.Connector.psm1

Set-StrictMode -Version Latest

$script:OktaFabricMandatoryScopes = @(
    'okta.logs.read'
    'okta.users.manage'
    'okta.groups.manage'
    'okta.appGrants.read'
    'okta.apiTokens.read'
)

function Register-OktaConnectorDefinitions {
    Register-IntegrationWizardDefinition @{
        Id           = 'okta-connector'
        Platform     = 'Okta'
        Product      = 'ISC'
        CoreSwitch   = 'Connector'
        CliName      = 'okta'
        Title        = 'Okta SaaS connector & Admin API token discovery'
        FolderName   = 'Okta'
        AccessLevels = @('ReadOnly', 'ReadWrite')
        AdminRoles   = @('Okta Super Administrator (Custom service app + API scopes)')
        OutputsHelp  = 'Paste Okta domain, OAuth client ID, JWT header, PEM private key, scopes, and token URL into Agentic Fabric / ISC Connection Settings.'
        Inputs       = @(
            @{ Name = 'OktaDomain'; Source = 'Supply'; Prompt = 'Okta org URL'; Purpose = 'e.g. https://yourOrg.okta.com'; Required = $true }
            @{ Name = 'ClientId'; Source = 'Supply'; Prompt = 'OAuth 2.0 service app Client ID'; Purpose = 'JWT issuer and subject'; Required = $true }
            @{ Name = 'TokenUrl'; Source = 'Supply'; Prompt = 'OAuth 2.0 token URL'; Purpose = 'Usually https://{domain}/oauth2/v1/token'; Required = $false }
            @{ Name = 'Scope'; Source = 'Supply'; Prompt = 'Granted scopes (space-separated)'; Purpose = 'Mandatory Agentic Fabric scopes'; Required = $false; Default = ($script:OktaFabricMandatoryScopes -join ' ') }
            @{ Name = 'JwtHeader'; Source = 'Supply'; Prompt = 'JWT header JSON'; Purpose = 'Algorithm used to sign the client assertion'; Required = $false }
            @{ Name = 'PrivateKey'; Source = 'Supply'; Prompt = 'Private key (PEM)'; Purpose = 'Service app private key; include BEGIN/END lines'; Required = $true; Secret = $true }
            @{ Name = 'PrivateKeyPassword'; Source = 'Supply'; Prompt = 'Private key password (optional)'; Purpose = 'If the PEM key is encrypted'; Required = $false; Secret = $true }
            @{ Name = 'OutputDirectory'; Source = 'Supply'; Prompt = 'Output directory'; Purpose = 'Connection settings file path'; Required = $false }
        )
        CheckInputs  = @(
            @{ Name = 'OktaDomain'; Source = 'Supply'; Prompt = 'Okta org URL'; Purpose = 'Org to verify'; Required = $true }
            @{ Name = 'ClientId'; Source = 'Supply'; Prompt = 'OAuth 2.0 service app Client ID'; Purpose = 'Client ID to verify'; Required = $true }
            @{ Name = 'PrivateKey'; Source = 'Supply'; Prompt = 'Private key (PEM)'; Purpose = 'Key to verify JWT auth'; Required = $true; Secret = $true }
            @{ Name = 'Scope'; Source = 'Supply'; Prompt = 'Granted scopes (space-separated)'; Purpose = 'Scopes to verify'; Required = $false }
            @{ Name = 'OutputDirectory'; Source = 'Supply'; Prompt = 'Output directory'; Purpose = 'Wizard output directory'; Required = $false }
        )
        Steps        = {
            param($ctx)
            @(
                @{
                    Id    = 'okta-service-app'
                    Title = 'Create Okta service app with JWT auth and mandatory scopes'
                    Kind  = 'Ensure'
                    Probe = { param($c) 'Create' }
                    Run   = {
                        param($c)
                        Write-Step 'Okta service application'
                        $domain = [string]$c['OktaDomain']
                        Write-Info "Create an OAuth 2.0 service app in $domain with admin roles and a JWKS key pair."
                        Write-Info "Grant scopes: $($script:OktaFabricMandatoryScopes -join ', ')"
                        Write-Info 'Sign a JWT assertion; Client ID is both Issuer and Subject in Agentic Fabric.'
                    }
                    BuildScript = {
                        param($c)
                        $scopes = if ($c['Scope']) { [string]$c['Scope'] } else { ($script:OktaFabricMandatoryScopes -join ' ') }
                        @"
# Okta SaaS connector — service app checklist for '$($c['OktaDomain'])'
Write-Host 'Required scopes: $scopes'
Write-Host 'Token URL: https://{yourOktaDomain}/oauth2/v1/token'
Write-Host 'Convert JWK private keys to PEM before pasting into ISC.'
"@

                    }
                }
            )
        }
        OnRunComplete = {
            param($ctx)
            $tokenUrl = if ($ctx['TokenUrl']) { $ctx['TokenUrl'] } else { "https://$(([uri]$ctx['OktaDomain']).Host)/oauth2/v1/token" }
            Write-Host ''
            Write-Host 'Okta SaaS connector handoff' -ForegroundColor Cyan
            Write-Host " Okta URL: $($ctx['OktaDomain'])"
            Write-Host " Token URL: $tokenUrl"
            Write-Host " Client ID: $($ctx['ClientId'])"
            Write-Host " Scopes: $(if ($ctx['Scope']) { $ctx['Scope'] } else { ($script:OktaFabricMandatoryScopes -join ' ') })"
            Write-Host ' Private key: [stored in vault]'
            Write-Host ''
        }
    }
}

Export-ModuleMember -Function Register-OktaConnectorDefinitions