Private/Get-iPilotOAuthToken.ps1

Function Get-iPilotOAuthToken {
    <#
        .Synopsis
        Returns iPilot OAuth token.

        .Description
        Helper function for iPilot module to retrieve OAuth access token.

        .Parameter iPilotAuthUri
        URL of iPilot API

        .Parameter APIVersion
        Version of iPilot API

        .Parameter Credential
        Credentials for iPilot API

        .Example
        # Get avilable numbers with the status set to Ported using API Version v1 in the contoso.com iPilot domain
        Get-iPilotOAuthToken -Credential (Get-Credential)
    #>

    Param (
        [System.String]
            $ApiUrl = "https://api.nuwave.com",   
        [System.String]
            $ApiVersion = "v1",    
        [System.String] [Parameter(Mandatory = $true)] 
            $ApiKey,    
        [System.Management.Automation.PSCredential] [Parameter(Mandatory = $true)] 
            $Credential,
        [Switch]
            $RefreshToken
    )

    # Force refresh OAuth Token
    if ($RefreshToken.IsPresent) {
        $iPilotOAuthToken = $null
    }

    # Verbose Switch
    if($Verbose.IsPresent) {
        $PreviousVerbosePreference = $VerbosePreference
        $VerbosePreference = "continue"
    }

    #region Get OAuth Token
    $now = Get-Date
    if ($iPilotOAuthToken.OAuthTokenExpirationDateTime -ge ($now.ToUniversalTime()) -and $iPilotOAuthToken.Username -eq $Credential.UserName) {
        Write-Verbose "iPilot OAuth Token has not expired"
        return $iPilotOAuthToken
    } else {
        Write-Verbose "iPilot OAuth Token has expired or is not valid for $($Credential.UserName)"

        # Build request
        $iPilotAuthUri = "$ApiUrl/$ApiVersion/oauth2/authorize"
        $Username = $Credential.UserName
        $Password = $Credential.GetNetworkCredential().Password
        $GetiPilotAuthInvokeParams = @{
            Uri = $iPilotAuthUri
            Method = "Post"
            ContentType = "application/x-www-form-urlencoded"
            Headers = @{
                "x-api-key"      = $ApiKey
            }
            Body = "username=$Username&password=$Password"
        } 

        # Make REST call to get OAuth Token
        Try {
            $global:iPilotOAuthToken = Invoke-RestMethod @GetiPilotAuthInvokeParams -ErrorAction Stop
            Write-Verbose "$global:iPilotOAuthToken"
        } Catch {
            Write-Error "Failed to authenticate $($Credential.UserName). Error: $($_)."
            break
        }

        # Verify OAuth Token has expiration date
        if (!($iPilotOAuthToken.expires_at)) {
            throw "Failed to get OAuth Token from $iPilotAuthUri using $($Credential.UserName)"
        }

        # Format Expiration Date & Time
        $iPilotOAuthTokenExpirationDateTime = (Get-Date 1970/1/1).AddSeconds($iPilotOAuthToken.expires_at)

        # Append formatted expiration date
        $iPilotOAuthToken | Add-Member -MemberType NoteProperty -Name OAuthTokenExpirationDateTime -Value $iPilotOAuthTokenExpirationDateTime
        
        # Append username
        $iPilotOAuthToken | Add-Member -MemberType NoteProperty -Name Username -Value $Credential.UserName

        # Verbose Switch
        if($Verbose.IsPresent) {
            $VerbosePreference = $PreviousVerbosePreference
        }

        # Return token
        return $iPilotOAuthToken
    }
}