keycloakTokenManager.psm1

function Connect-KTM {
    <#
    .SYNOPSIS
    Inititalize Keycloak Token Manager.

    .DESCRIPTION
    Inititalize Keycloak Token Manager.

    .PARAMETER userName
    Specifies the keycloak user name.

    .PARAMETER password
    Specifies the keycloak user password as securestring.

    .PARAMETER realmUri
    Specifies the keycloak realm uri to which you want to connect to.

    .PARAMETER clientName
    Specifies the keycloak client name.

    .PARAMETER clientSecret
    Specifies the keycloak client secret.

    .INPUTS
    None.

    .OUTPUTS
    KeycloakTokenManager object.

    .EXAMPLE
    PS> $securePassword = ConvertTo-SecureString -String "mypassword" -As PlainText -Force
    PS> $ktm = Connect-KTM -realmUri https://keycloak.example.com/realms/myrealm `
                -userName myuser `
                -password $securePassword

    .EXAMPLE
    PS> $securePassword = ConvertTo-SecureString -String "mypassword" -As PlainText -Force
    PS> $ktm = Connect-KTM -realmUri https://keycloak.example.com/realms/myrealm `
                -userName myuser `
                -password $securePassword `
                -clientName myclient

    .EXAMPLE
    PS> $securePassword = ConvertTo-SecureString -String "mypassword" -As PlainText -Force
    PS> $ktm = Connect-KTM -realmUri https://keycloak.example.com/realms/myrealm `
                -userName myuser `
                -password $securePassword `
                -clientName myclient `
                -clientSecret <SUPER_SECRET_STRING>

    .EXAMPLE
    PS> $securePassword = ConvertTo-SecureString -String "mypassword" -As PlainText -Force
    PS> $ktm = Connect-KTM -realmUri https://keycloak.example.com/realms/myrealm `
                -clientName myclient

    .LINK
    https://www.powershellgallery.com/packages/keycloakTokenManager
#>

    [OutputType([KeycloakTokenManager])]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false, HelpMessage = 'username')]
        [string]$userName,
        [Parameter(Mandatory = $false, HelpMessage = 'userpassword as securestring')]
        [securestring]$password,
        [Parameter(Mandatory = $true, HelpMessage = 'Keycloak realm url')]
        [uri]$realmUri,
        [Parameter(Mandatory = $false, HelpMessage = 'Keycloak client name')]
        [string]$clientName,
        [Parameter(Mandatory = $false, HelpMessage = 'Keycloak client secret')]
        [string]$clientSecret
    )

    switch ([string]::IsNullOrEmpty($userName)) {
        $false {
            switch ([string]::IsNullOrEmpty($clientName)) {
                $false {
                    switch ([string]::IsNullOrEmpty($clientSecret)) {
                        $false {
                            [KeycloakTokenManager]::new([string]$userName, [securestring]$password, [uri]$realmUri, [string]$clientName, [string]$clientSecret)
                        }
                        $true {
                            [KeycloakTokenManager]::new([string]$userName, [securestring]$password, [uri]$realmUri, [string]$clientName)
                        }
                    }
                }
                $true {
                    [KeycloakTokenManager]::new([string]$userName, [securestring]$password, [uri]$realmUri)
                }
            }
        }
        $true {
            switch ([string]::IsNullOrEmpty($clientName)) {
                $false {
                    [KeycloakTokenManager]::new([uri]$realmUri, [string]$clientName)
                }
                $true {
                    throw "Keycloak client name is missing or empty"
                }
            }
        }
    }
}

function Get-KTMAccessToken {
    <#
    .SYNOPSIS
    Get Keycloak Access Token.

    .DESCRIPTION
    Get Keycloak Access Token.

    .PARAMETER KeycloakTokenManager
    Specifies the keycloak token manager to be used.
    Use Connect-KTM to get a KeycloakTokenManager instance.

    .PARAMETER userName
    Specifies the keycloak user name for which you want to get the token.
    If you use a different user name than during initialization of Keycloak Token Manager,
    make sure that the initial user has the impersonation realm management role.
    If no user name is specified, the initial user name will be used.

    .INPUTS
    None.

    .OUTPUTS
    System.string.

    .EXAMPLE
    PS> $accessToken = Get-KTMAccessToken -KeycloakTokenManager $ktm

    .EXAMPLE
    PS> $accessToken = Get-KTMAccessToken -KeycloakTokenManager $ktm -userName "otherUserName"

    .LINK
    https://www.powershellgallery.com/packages/keycloakTokenManager
#>

    [OutputType([string])]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false)]
        [KeycloakTokenManager]$userName,
        [Parameter(Mandatory = $true)]
        [KeycloakTokenManager]$KeycloakTokenManager
    )
    switch ([string]::IsNullOrEmpty($userName)) {
        $false {
            $KeycloakTokenManager.getAccessToken($userName)
        }
        Default {
            $KeycloakTokenManager.getAccessToken()
        }
    }
}

function Get-KTMHeader {
    <#
    .SYNOPSIS
    Get HTTP request header with authorization.

    .DESCRIPTION
    Get HTTP request header with authorization.

    .PARAMETER KeycloakTokenManager
    Specifies the keycloak token manager to be used.
    Use Connect-KTM to get a KeycloakTokenManager instance.

    .PARAMETER userName
    Specifies the keycloak user name for which you want to get the request header.
    If you use a different user name than during initialization of Keycloak Token Manager,
    make sure that the initial user has the impersonation realm management role.
    If no user name is specified, the initial user name will be used.

    .INPUTS
    None.

    .OUTPUTS
    System.Collections.Generic.Dictionary[[String], [String]].

    .EXAMPLE
    PS> $header = Get-KTMHeader -KeycloakTokenManager $ktm

    .EXAMPLE
    PS> $accessToken = Get-KTMHeader -KeycloakTokenManager $ktm -userName "otherUserName"

    .LINK
    https://www.powershellgallery.com/packages/keycloakTokenManager
#>

    [OutputType([System.Collections.Generic.Dictionary[[String], [String]]])]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false)]
        [KeycloakTokenManager]$userName,
        [Parameter(Mandatory = $true)]
        [KeycloakTokenManager]$KeycloakTokenManager
    )
    switch ([string]::IsNullOrEmpty($userName)) {
        $false {
            $KeycloakTokenManager.getHeader($userName)
        }
        Default {
            $KeycloakTokenManager.getHeader()
        }
    }
}

function Close-KTM {
    <#
    .SYNOPSIS
    Logout given keycloak user session.

    .DESCRIPTION
    Logout given keycloak user session.

    .PARAMETER KeycloakTokenManager
    Specifies the keycloak token manager to be used.
    Use Connect-KTM to get a KeycloakTokenManager instance.

    .PARAMETER userName
    Specifies the keycloak user name for which you want to close the session and logout.
    If you use a different user name than during initialization of Keycloak Token Manager,
    make sure that the initial user has the impersonation realm management role.
    If no user name is specified, the initial user name will be used.

    .INPUTS
    None.

    .OUTPUTS
    System.bool.

    .EXAMPLE
    PS> $result = Close-KTM -KeycloakTokenManager $ktm

    .EXAMPLE
    PS> $result = Close-KTM -KeycloakTokenManager $ktm -userName "otherUserName"

    .LINK
    https://www.powershellgallery.com/packages/keycloakTokenManager
#>

    [OutputType([bool])]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false)]
        [KeycloakTokenManager]$userName,
        [Parameter(Mandatory = $true)]
        [KeycloakTokenManager]$KeycloakTokenManager
    )
    switch ([string]::IsNullOrEmpty($userName)) {
        $false {
            $KeycloakTokenManager.logout($userName)
        }
        Default {
            $KeycloakTokenManager.logout()
        }
    }
}

function Disconnect-KTM {
    <#
    .SYNOPSIS
    Disposes keycloak token manager object and logsout all associated user sessions.

    .DESCRIPTION
    Disposes keycloak token manager object and logsout all associated user sessions.

    .PARAMETER KeycloakTokenManager
    Specifies the keycloak token manager to be used.
    Use Connect-KTM to get a KeycloakTokenManager instance.

    .INPUTS
    None.

    .EXAMPLE
    PS> Disconnect-KTM -KeycloakTokenManager $ktm

    .LINK
    https://www.powershellgallery.com/packages/keycloakTokenManager
#>

    [OutputType([void])]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [KeycloakTokenManager]$KeycloakTokenManager
    )
    $KeycloakTokenManager.dispose()
}

Export-ModuleMember -Function Connect-KTM
Export-ModuleMember -Function Get-KTMAccessToken
Export-ModuleMember -Function Get-KTMHeader
Export-ModuleMember -Function Close-KTM
Export-ModuleMember -Function Disconnect-KTM