HelperFunctions/ExtractDatacenter.ps1

Function Get-ApiUrl {
    [cmdletbinding()]
    param(
        [Parameter(
            Mandatory = $true,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$access_token
    )

    Begin {
        function Parse-JWTtoken {

            # Gotten from function here: https://www.michev.info/blog/post/2140/decode-jwt-access-and-id-tokens-via-powershell

            [cmdletbinding()]
            param([Parameter(Mandatory = $true)][string]$token)

            #Validate as per https://tools.ietf.org/html/rfc7519
            #Access and ID tokens are fine, Refresh tokens will not work
            if (!$token.Contains('.') -or !$token.StartsWith('eyJ')) { Write-Error 'Invalid token' -ErrorAction Stop }

            #Header
            $tokenheader = $token.Split('.')[0].Replace('-', '+').Replace('_', '/')
            #Fix padding as needed, keep adding "=" until string length modulus 4 reaches 0
            while ($tokenheader.Length % 4) { Write-Verbose 'Invalid length for a Base-64 char array or string, adding ='; $tokenheader += '=' }
            Write-Verbose 'Base64 encoded (padded) header:'
            Write-Verbose $tokenheader
            #Convert from Base64 encoded string to PSObject all at once
            Write-Verbose 'Decoded header:'
            #[System.Text.Encoding]::ASCII.GetString([system.convert]::FromBase64String($tokenheader)) | ConvertFrom-Json | Format-List | Out-Default

            #Payload
            $tokenPayload = $token.Split('.')[1].Replace('-', '+').Replace('_', '/')
            #Fix padding as needed, keep adding "=" until string length modulus 4 reaches 0
            while ($tokenPayload.Length % 4) { Write-Verbose 'Invalid length for a Base-64 char array or string, adding ='; $tokenPayload += '=' }
            Write-Verbose 'Base64 encoded (padded) payload:'
            Write-Verbose $tokenPayload
            #Convert to Byte array
            $tokenByteArray = [System.Convert]::FromBase64String($tokenPayload)
            #Convert to string array
            $tokenArray = [System.Text.Encoding]::ASCII.GetString($tokenByteArray)
            Write-Verbose 'Decoded array in JSON format:'
            Write-Verbose $tokenArray
            #Convert from JSON to PSObject
            $tokobj = $tokenArray | ConvertFrom-Json
            Write-Verbose 'Decoded Payload:'

            return $tokobj
        }
        function Extract-DomainFromToken {

            [cmdletbinding()]
            param([Parameter(Mandatory = $true)][string]$decodedDomain)

            $domain = $decodedDomain.split('/')[2]

            $apiURL = $domain.replace("auth","api")
            
            return $apiURL

        }
    }

    Process {
        $decodedDomain = Parse-JWTtoken -token $access_token | Select-Object -ExpandProperty iss

        $apiURL = Extract-DomainFromToken -decodedDomain $decodedDomain
    }

    End {
        return $apiURL
    }
}