functions/Connect-CloudiQ.ps1

function Connect-CloudiQ {
    <#
    .SYNOPSIS
 
    Connect to CloudiQ and adds API token to your session.
 
    .DESCRIPTION
 
    Connect to CloudiQ by using a client id and secret created in the portal, as well as your username and password.
 
    .PARAMETER ClientId
 
    Client Id from the portal, created under API Management
 
    .PARAMETER ClientSecret
 
    Client Secret from the portal, created under API Management
 
    .INPUTS
 
    .OUTPUTS
 
    No output, adds API token to your current session.
 
    .EXAMPLE
    Connect-CloudiQ -ClientId xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -ClientSecret xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    #>

    [CmdletBinding()]
    param (
        [Parameter()]
        [string]
        $ClientId,
        [Parameter()]
        [string]
        $ClientSecret
    )

    if (Test-Path -Path 'Env:\CloudiQClientId') {
        Set-Variable -Name ClientId -Value $Env:CloudiQClientId
        Set-Variable -Name ClientSecret -Value $Env:CloudiQClientSecret
    }
    
    $apiBaseUrl = 'https://api.crayon.com/api/v1'
    
    $headers = @{}
    # $encodedClientId = [System.Web.HttpUtility]::UrlEncode($clientId)
    # $encodedSecret = [System.Web.HttpUtility]::UrlEncode($clientSecret)
    # $credentials = "$($encodedClientId):$($encodedSecret)"
    $Bytes = [System.Text.Encoding]::UTF8.GetBytes($ClientId + ":" + $ClientSecret)
    $EncodedText =[Convert]::ToBase64String($Bytes)
    
    # Check if username and password is set as environment variables. If not, ask for username and password.
    if (Test-Path -Path 'Env:\CloudiQUsername') {
        Set-Variable -Name Username -Value $Env:CloudiQUsername
        Set-Variable -Name Password -Value (Convertto-SecureString -String $Env:CloudiQPassword -AsPlainText)
    }
    else {
        $username = Read-Host -Prompt "Username"
        $password = Read-Host -Prompt "Password" -AsSecureString
    }

    # Converting from SecureString, the hard way due to limitations in Windows PowerShell
    $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
    $password = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($BSTR)
    $Body = @{
        'username'= $username
        'password'= $password
        'grant_type'="password"
        'scope'="CustomerApi"
    }
    
    $headers.Add("Authorization", "Basic "+$EncodedText)
    $headers.Add("Content-Type", "application/x-www-form-urlencoded")
    
    try {
        $OAuthReq = Invoke-RestMethod -Method Post -Uri $apiBaseUrl/connect/token/ -Body $Body -Headers $headers 
    }
    catch {
        Write-Error $_.Exception.Message
        break
    }
    # Add the authentication token to the variable that will be used by the other functions
    New-Variable -Name CloudIqAccessToken -Value $OAuthReq.accesstoken -Scope Global -Force

    Write-Host "Successfully connected to Cloud-iQ" -ForegroundColor Green
}