Public/Invoke-IamAuthenticate.ps1

<#
    .SYNOPSIS
    Authenticate agaist HSDP IAM as configured for the current Salesforce org

    .DESCRIPTION
    Uses the current org configuration to autenticate against the phecc__Access_Token_URL__c URL
    configured in the current configured Salesforce org.

    .INPUTS
    None. You cannot pipe objects to Invoke-IamAuthenticate.

    .OUTPUTS
    Returns as PSCustomObject with the following memebers:
        access_token
        expires_in
        refresh_token
        scope
        token_type

    .EXAMPLE
    PS> $auth = Invoke-IamAuthenticate

    .LINK
    Set-FileConfig

    .NOTES
    Assumes config is initialized for org access.
#>

function Invoke-IamAuthenticate {
    $config = Get-Config
    $sfHsdpConfig = Get-SfHsdpConfig
    $authForToken = [convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$($sfHsdpConfig.phecc__Key__c):$($sfHsdpConfig.phecc__Secret__c)"))
    $Headers = @{
        "api-version"="2"
        "Content-Type"="application/x-www-form-urlencoded; charset=UTF-8"
        "Accept"="application/json"
        "Authorization"="Basic $($authForToken)"
    }
    $Form = @{
        "grant_type"= "password"
        "username"=$config.IamCredentials.GetNetworkCredential().username
        "password"=$config.IamCredentials.GetNetworkCredential().password
        "scope"=($config.scopes -Join " ")
    }
    Invoke-RestMethod -Uri $sfHsdpConfig.phecc__Access_Token_URL__c -Method Post -Body $Form -Headers $Headers
}