Private/Get-SpotifyToken.ps1

function Get-SpotifyToken {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [string[]] $Scopes,

        [Parameter(Mandatory=$false)]
        [string] $ClientId,

        [Parameter(Mandatory=$false)]
        [string] $RedirectURI,

        [ValidateScript({Test-Path $_})]
        [Parameter(Mandatory=$false)]
        [string] $ConfigFile
    )
    
    Set-StrictMode -Version 1.0
    $ErrorActionPreference = 'Stop'

    $toRemove = $script:TOKENS.Where({$_.expiration -le [datetime]::Now})
    $toRemove.ForEach({$script:TOKENS.Remove($_)})
    
    :OuterLoop foreach ($token in $script:TOKENS) {
        foreach ($scope in $scopes) {
            if ($scope -notin $token.scopes) { continue OuterLoop }
        }
        # if we make it here, token is unexpired and has the right scope(s)
        return $token.token
    }

    # if we make it here, we need a new token
    return (Invoke-AuthorizationPKCEFlow @PSBoundParameters)
}