Private/Runtime/Select-OpenApiSecurityRequirement.ps1

function Select-OpenApiSecurityRequirement {
    <#
    .SYNOPSIS
        Picks the first security requirement of an operation whose schemes all have credentials in the context.
    .DESCRIPTION
        Returns an object with Mode and Schemes:
          None - the operation needs no credentials (Security = [] or an empty requirement was chosen)
          Selected - Schemes lists { Name, Scheme, Scopes } of the chosen requirement
          Generic - the metadata has no security information; the context's bearer token or credential is used
          Unsatisfied - no requirement can be met with the context's credentials
        Security = $null means the document default: the metadata's DefaultSecurity when present, else each scheme
        in SecuritySchemes on its own, in name order.
    #>

    [CmdletBinding()]
    [OutputType([pscustomobject])]
    param(
        [Parameter(Mandatory)]
        [object]$Operation,

        [Parameter(Mandatory)]
        [pscustomobject]$Context
    )

    $schemes = Get-OpenApiMember -InputObject $Operation -Name 'SecuritySchemes'
    $security = Get-OpenApiMember -InputObject $Operation -Name 'Security'
    if ($null -eq $security) {
        $security = Get-OpenApiMember -InputObject $Operation -Name 'DefaultSecurity'
    }
    if ($null -eq $security) {
        $schemeNames = @(ConvertTo-OpenApiPropertyList -InputObject $schemes | ForEach-Object -Process { $_.Name } | Sort-Object)
        if ($schemeNames.Count -eq 0) {
            return [pscustomobject]@{ Mode = 'Generic'; Schemes = @() }
        }
        $security = foreach ($name in $schemeNames) {
            @{ $name = @() }
        }
    }
    $requirements = @($security)
    if ($requirements.Count -eq 0) {
        return [pscustomobject]@{ Mode = 'None'; Schemes = @() }
    }
    foreach ($requirement in $requirements) {
        $entries = @(ConvertTo-OpenApiPropertyList -InputObject $requirement)
        if ($entries.Count -eq 0) {
            # An empty requirement ({}) makes authentication optional
            return [pscustomobject]@{ Mode = 'None'; Schemes = @() }
        }
        $selected = New-Object System.Collections.Generic.List[object]
        $satisfied = $true
        foreach ($entry in $entries) {
            $scheme = Get-OpenApiMember -InputObject $schemes -Name $entry.Name
            if (-not (Test-OpenApiSchemeCredential -Scheme $scheme -Context $Context)) {
                $satisfied = $false
                break
            }
            $selected.Add([pscustomobject]@{
                    Name   = $entry.Name
                    Scheme = $scheme
                    Scopes = @($entry.Value | Where-Object -FilterScript { $null -ne $_ } | ForEach-Object -Process { [string]$_ })
                })
        }
        if ($satisfied) {
            return [pscustomobject]@{ Mode = 'Selected'; Schemes = $selected.ToArray() }
        }
    }
    return [pscustomobject]@{ Mode = 'Unsatisfied'; Schemes = @() }
}