Public/Invoke-SfAuthenticate.ps1

<#
    .SYNOPSIS
    Authenticate to Salesforce using the current org configuration

    .DESCRIPTION
    Authenticate to salesforce using the current org configuration

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

    .OUTPUTS
    Returns as PSCustomObject with the following members:
        access_token
        id
        instance_url
        issued_at
        signature
        token_type

    .EXAMPLE
    PS> $sfAcessToken = (Invoke-SfAuthenticate).access_token

    .LINK
    Set-Config

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

function Invoke-SfAuthenticate {

    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param()

    begin {
        Write-Verbose "[$($MyInvocation.MyCommand.Name)] Function started"
    }

    end {
        Write-Verbose "[$($MyInvocation.MyCommand.Name)] Complete"
    }

    process {
        Write-Debug "[$($MyInvocation.MyCommand.Name)] PSBoundParameters: $($PSBoundParameters | Out-String)"

        $config = Get-Config
        $body = @{
            grant_type    = "password"
            client_id     = $config.SfOauth.GetNetworkCredential().username
            client_secret = $config.SfOauth.GetNetworkCredential().password
            username      = $config.SfCredentials.GetNetworkCredential().username
            password      = $config.SfCredentials.GetNetworkCredential().password + $config.SfSecurityToken
        }
        $loginUrl = "https://$(&{If($config.Sandbox){"test"} Else {"login"}}).salesforce.com/services/oauth2/token"
        Write-Debug ($Body | ConvertTo-Json)
        Invoke-RestMethod -Uri $loginUrl -Method POST -Body $body -TimeoutSec 30
    }
}