Private/Authentication/Get-WebrootAuthToken.ps1

function Get-WebrootAuthToken {
    #https://unityapi.webrootcloudav.com/Docs/APIDoc/PasswordAuthentication
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$True)]
        [string]$client_id,
        [Parameter(Mandatory=$True)]
        [string]$client_secret,
        [Parameter(Mandatory=$True)]
        [pscredential]$credentials,
        [string]$scope = '*'
    )

    $url = 'https://unityapi.webrootcloudav.com/auth/token'

    $Body = @{
        username    = $credentials.UserName
        password    = $credentials.GetNetworkCredential().Password
        grant_type  = 'password'
        scope       = $scope
    }

    $Auth = "$($client_id):$client_secret"
    $Bytes = [System.Text.Encoding]::ASCII.GetBytes($Auth)
    $Auth =[Convert]::ToBase64String($Bytes)

    try{
        Write-Verbose "Getting auth token."
        $Obj = Invoke-RestMethod -Method Post -Uri $url -Body $Body -ContentType "application/x-www-form-urlencoded" -Headers @{Authorization = "Basic $Auth"}
        $Obj | Add-Member -NotePropertyName 'client_id' -NotePropertyValue $client_id
        $Obj | Add-Member -NotePropertyName 'client_secret' -NotePropertyValue $client_secret
        $Obj | Add-Member -NotePropertyName 'expires' -NotePropertyValue (Get-Date).AddSeconds(295)
        $Obj | Add-Member -NotePropertyName 'Renewable' -NotePropertyValue (Get-Date).AddDays(14).AddSeconds(-5)
        $script:WebrootAuthToken = $Obj | Select-Object * -ExcludeProperty 'expires_in'
        Write-Verbose 'Auth Token saved to $WebrootAuthToken'
    }
    catch{
        Write-Error "ERROR : Please refer to website for Status Codes. https://unityapi.webrootcloudav.com/Docs/APIDoc/Guide#guide-statusCodes `r`n $_"
    }
}