Private/Entra/Core/Get-EntraAuthMethodsData.ps1

# PSGuerrilla - Jim Tyler, Microsoft MVP - CC BY 4.0
# https://github.com/jimrtyler/PSGuerrilla | https://creativecommons.org/licenses/by/4.0/
# AI/LLM use: see AI-USAGE.md for required attribution
function Get-EntraAuthMethodsData {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$AccessToken,

        [switch]$Quiet
    )

    $data = @{
        AuthMethodsPolicy     = $null
        MethodConfigurations   = @()
        UserRegistrationDetails = @()
        PasswordResetPolicy    = $null
        AuthorizationPolicy    = $null
        DirectorySettings      = @()
        Errors                 = @{}
    }

    # ── Authentication Methods Policy ─────────────────────────────────────
    if (-not $Quiet) {
        Write-ProgressLine -Phase INFILTRATE -Message 'Collecting authentication methods policy'
    }
    try {
        $data.AuthMethodsPolicy = Invoke-GraphApi -AccessToken $AccessToken `
            -Uri '/policies/authenticationMethodsPolicy'
    } catch {
        $data.Errors['AuthMethodsPolicy'] = $_.Exception.Message
    }

    # ── Authentication Method Configurations ──────────────────────────────
    try {
        $data.MethodConfigurations = @(Invoke-GraphApi -AccessToken $AccessToken `
            -Uri '/policies/authenticationMethodsPolicy/authenticationMethodConfigurations' `
            -Paginate -Quiet:$Quiet)
    } catch {
        $data.Errors['MethodConfigurations'] = $_.Exception.Message
    }

    # ── User Registration Details (MFA status) ────────────────────────────
    if (-not $Quiet) {
        Write-ProgressLine -Phase INFILTRATE -Message 'Collecting MFA registration details'
    }
    try {
        $data.UserRegistrationDetails = @(Invoke-GraphApi -AccessToken $AccessToken `
            -Uri '/reports/authenticationMethods/userRegistrationDetails' `
            -Paginate -Quiet:$Quiet)
    } catch {
        $data.Errors['UserRegistrationDetails'] = $_.Exception.Message
    }

    # ── Authorization Policy (SSPR, user settings) ────────────────────────
    if (-not $Quiet) {
        Write-ProgressLine -Phase INFILTRATE -Message 'Collecting authorization policy'
    }
    try {
        $data.AuthorizationPolicy = Invoke-GraphApi -AccessToken $AccessToken `
            -Uri '/policies/authorizationPolicy'
    } catch {
        $data.Errors['AuthorizationPolicy'] = $_.Exception.Message
    }

    # ── Directory Settings (password protection) ──────────────────────────
    try {
        $data.DirectorySettings = @(Invoke-GraphApi -AccessToken $AccessToken `
            -Uri '/settings' -Paginate -Quiet:$Quiet)
    } catch {
        $data.Errors['DirectorySettings'] = $_.Exception.Message
    }

    if (-not $Quiet) {
        $mfaCount = @($data.UserRegistrationDetails | Where-Object { $_.isMfaRegistered }).Count
        $totalUsers = $data.UserRegistrationDetails.Count
        Write-ProgressLine -Phase INFILTRATE -Message "MFA registered: $mfaCount / $totalUsers users"
    }

    return $data
}