Private/Authentication/Acronis/Get-AcronisSession.ps1

function Get-AcronisSession {
    [CmdletBinding()]
    param(
        [Parameter()]
        [switch]$Force
    )

    begin {
        try {
            if (!$script:AcronisCredentials -or $script:AcronisCredentials.Account -ne $Account) {
                $script:AcronisCredentials = Get-AcronisCredentials
            }
        }
        catch {
            Write-ModuleLog -Message "Failed to get Acronis credentials" -Level Error -Component 'AcronisSession' -ErrorRecord $_
            throw
        }
    }

    process {
        $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
        $ApiBase = "https://dk01-cloud.acronis.com"
        try {
            Write-ModuleLog -Message "Logging in as $($script:AcronisCredentials.Username)" -Level Verbose -Component 'AcronisSession'
            $loginBody = @{ username = $($script:AcronisCredentials.Username); password = $($script:AcronisCredentials.Password) } | ConvertTo-Json
            $loginJson = Invoke-WebJson -Method 'POST' -Uri "$ApiBase/api/1/login" -Session $session -Body $loginBody -Headers @{ 'X-Acronis-API' = '1'; 'X-Requested-With' = 'XMLHttpRequest' }
            if ($loginJson.redirect_auth_url) {
                Write-ModuleLog -Message "Following redirect: $($loginJson.redirect_auth_url)" -Level Verbose -Component 'AcronisSession'
                $null = Invoke-WebJson -Method 'GET' -Uri ("$ApiBase" + $loginJson.redirect_auth_url) -Session $session
            }

            $authorize = Invoke-WebJson -Method 'GET' -Uri "$ApiBase/bc/authorize:ui" -Session $session
            if ($authorize.redirect_auth_url) {
                Write-ModuleLog -Message "Following authorize redirect: $($authorize.redirect_auth_url)" -Level Verbose -Component 'AcronisSession'
                $null = Invoke-WebJson -Method 'GET' -Uri ("$ApiBase" + $authorize.redirect_auth_url) -Session $session
            }

            $sessCheck = Invoke-WebJson -Method 'GET' -Uri "$ApiBase/bc/api/gateway/session" -Session $session
            if (-not $sessCheck) { throw "Session check failed." }
            Write-ModuleLog -Message "Login and session established." -Level Info -Component 'AcronisSession'
            return $session
        }
        catch {
            Write-Log "Login failed: $($_.Exception.Message)" 'ERROR'
            throw
        }
        
    }
}