Public/new-IDNauthHeader.ps1

#
# create_IDNauthHeader.ps1
#
function new-IDNauthHeader {
    param(
        [parameter(Mandatory=$true, parametersetname='AccessToken')][string]$accesstoken,
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 client_credentials')]
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 password')]
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 refresh_token')]
        [string]$org,
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 client_credentials')]
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 password')]
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 refresh_token')]
        [parameter(Mandatory=$true, parametersetname='APIv2')]
        [string]$clientID,
        [parameter(Mandatory=$true, parametersetname='APIv2')][string]$clientKey,
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 client_credentials')]
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 password')]
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 refresh_token')]
        [string]$clientsecret,    
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 password')]
        [string]$adminusername,
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 password')]
        [string]$adminpassword,
        [Parameter(Mandatory=$true, ParameterSetName='APIv3 refresh_token')]
        [string]$refreshtoken,
        [Parameter(ParameterSetName='APIv3 client_credentials')]
        [Parameter(ParameterSetName='APIv3 password')]
        [Parameter(ParameterSetName='APIv3 refresh_token')]
        [switch]$headeronly
    )
    $oauthurl="https://$org.api.identitynow.com/oauth/token"
    switch ($PsCmdlet.ParameterSetName){
        AccessToken {return @{Authorization = "Bearer $accesstoken"}}
        APIv2 {
            $bytes =[system.text.encoding]::UTF8.GetBytes("$($clientID):$clientkey")
            $encodedauth = [convert]::ToBase64String($bytes)
            return @{Authorization = "Basic $encodedauth"}
        }
        'APIv3 client_credentials'{
            if ($clientID.length -ne 36){Write-Warning "unexpected size for client ID, proceeding"}
            $bytes =[system.text.encoding]::UTF8.GetBytes("$($clientID):$clientsecret")
            $encodedauth = [convert]::ToBase64String($bytes)
            $Header = @{Authorization = "Basic $encodedauth"}
            Write-Warning "grant type client_credentials will not always have access to admin functions, you may get 403 depending on what api you use"
            $Token = Invoke-RestMethod -Method Post -Uri "$($oauthurl)?grant_type=client_credentials" -Headers $Header
            if ($headeronly){
                return @{Authorization = "Bearer $($token.access_token)"}
            }else{
                return @{Authorization = "Bearer $($token.access_token)"},$token
            }
        }
        'APIv3 password'{
            if ($clientID.length -ne 36){Write-Warning "unexpected size for client ID, proceeding"}
            $bytes =[system.text.encoding]::UTF8.GetBytes("$($clientID):$clientsecret")
            $encodedauth = [convert]::ToBase64String($bytes)
            $Header = @{Authorization = "Basic $encodedauth"}
            $adminusername = $adminusername.ToLower()
            $passwordHash = Get-Hash -Algorithm SHA256 -StringEncoding utf8 -InputObject ($($adminpassword) + (Get-Hash -Algorithm SHA256 -StringEncoding utf8 -InputObject ($adminusername)).HashString.ToLower())
            $adminPWD = $passwordHash.ToString().ToLower()
            $Token = Invoke-RestMethod -Method Post -Uri "$($oauthurl)?grant_type=password&username=$($adminusername)&password=$($adminPWD)" -Headers $Header
            if ($headeronly){
                return @{Authorization = "Bearer $($token.access_token)"}
            }else{
                return @{Authorization = "Bearer $($token.access_token)"},$token
            }
        }
        'APIv3 refresh_token'{
            $Body = @{
            grant_type = 'refresh_token'
            client_id = $clientID
            client_secret = [System.Web.HttpUtility]::UrlEncode($clientSecret)
            refresh_token = $refreshtoken
            }
            $Token = Invoke-RestMethod -Method Post -Uri $oauthurl -Body $body
            if ($headeronly){
                return @{Authorization = "Bearer $($token.access_token)"}
            }else{
                return @{Authorization = "Bearer $($token.access_token)"},$token
            }
        }
    }
}