Private/OrbitAPI/New-OrbitSession.ps1

<#
 
Logs in against the Orbit API and caches the resulting session to $Script:settings.sessionFile.
 
Both the "SIMPLE" and "SALTED" login types are supported. "SALTED" first asks the server for
its login parameters (CreateLoginParameters), then builds the password hash the server expects:
Protect-OrbitPassword transform -> optionally append the server's userSalt -> hash -> hash again
with the server's loginSalt appended.
 
#>

function New-OrbitSession {
    [CmdletBinding()]
    param()

    if ( $null -eq $Script:credential ) {
        throw "No credentials available. Call Connect-AptecoOrbit first."
    }

    $plainPassword = $Script:credential.GetNetworkCredential().Password

    switch ( $Script:settings.loginType ) {

        "SIMPLE" {

            $body = @{
                "UserLogin" = $Script:credential.UserName
                "Password"  = $plainPassword
            }

            $endpointKey = "CreateSessionSimple"

        }

        "SALTED" {

            $loginParametersEndpoint = Get-OrbitEndpointDefinition -Key "CreateLoginParameters"
            $loginParametersUri = Resolve-OrbitUrl -Endpoint $loginParametersEndpoint

            $loginDetails = Invoke-RestMethod -Uri $loginParametersUri -Method $loginParametersEndpoint.method -ContentType "application/x-www-form-urlencoded" -Body @{ "userName" = $Script:credential.UserName }

            $passwordStep1 = Protect-OrbitPassword -Password $plainPassword

            if ( $loginDetails.saltPassword -eq $true -and "" -ne $loginDetails.userSalt ) {
                $passwordStep1 += $loginDetails.userSalt
            }

            $passwordStep2 = Get-OrbitStringHash -InputString $passwordStep1 -HashName $loginDetails.hashAlgorithm
            $passwordStep3 = Get-OrbitStringHash -InputString $passwordStep2 -HashName $loginDetails.hashAlgorithm -Salt $loginDetails.loginSalt

            $body = @{
                "Username"     = $Script:credential.UserName
                "LoginSalt"    = $loginDetails.loginSalt
                "PasswordHash" = $passwordStep3
            }

            $endpointKey = "CreateSessionSalted"

        }

        default {
            throw "Login type '$( $Script:settings.loginType )' is not supported. Use 'SIMPLE' or 'SALTED'."
        }

    }

    $endpoint = Get-OrbitEndpointDefinition -Key $endpointKey
    $uri = Resolve-OrbitUrl -Endpoint $endpoint

    $login = Invoke-RestMethod -Uri $uri -Method $endpoint.method -ContentType "application/x-www-form-urlencoded" -Body $body

    $Script:sessionId = $login.sessionId
    $Script:sessionToken = if ( $Script:settings.encryptToken -eq $true ) {
        Convert-PlaintextToSecure -String $login.accessToken
    } else {
        $login.accessToken
    }
    $Script:sessionExpires = [datetime]::Now.AddMinutes( $Script:settings.ttl )

    $session = [PSCustomObject]@{
        sessionId   = $Script:sessionId
        accessToken = $Script:sessionToken
        expires     = $Script:sessionExpires.ToString("o")
        encrypted   = $Script:settings.encryptToken
    }

    $session | ConvertTo-Json | Set-Content -Encoding UTF8 -Path $Script:settings.sessionFile

}