В этой статье я покажу, как получить access token для Graph API. Ранее Microsoft предлагала разные API для разных конечных точек и для разных контекстов — AzureAD, Office 365, Sharepoint Online и т.д. Сейчас эти API считаются устаревшими, и всех их заменит MS Graph.

Важно помнить, что для подключения к AAD использовались две конечные точки — https://graph.windows.net (AAD Graph) и https://graph.microsoft.com (MS Graph). Их же используются Powershell командлеты из модулей AzureAD/AzureADPreview и MSGraph соответственно.

Azure AD Graph перестанет работать 30 июня 2022 года!

Тем не менее, в примере ниже я покажу подключение к обоим API. Для этого существует несколько способов.

Connect-AzAccount -Identity -AccountId <ClientID>
$context = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile.DefaultContext
$graphToken = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate($context.Account, $context.Environment, $context.Tenant.Id.ToString(), $null, [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, $null, "https://graph.microsoft.com").AccessToken
$aadToken = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate($context.Account, $context.Environment, $context.Tenant.Id.ToString(), $null, [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, $null, "https://graph.windows.net").AccessToken

Write-Output "Hi I'm $($context.Account.Id)"

Connect-AzureAD -AadAccessToken $aadToken -AccountId $context.Account.Id -TenantId $context.tenant.id
Connect-MgGraph -AccessToken $graphToken

В примере выше мы подключаемся в Azure с неким аккаунтом. Для более интересной ситуации я использовал подключение с User Managed Identity (UMI) по его ClientID. В простейшем случае это будет аккаунт пользвоателя.

Подключившись, мы устанавливаем контекст и для каждого API получаем по токену. После этого полученные access tokens можно использовать в командлетах Powershell для подключения к AAD и Ms Graph.

Другой способ — использование REST API запросов. На следующем примере я покажу подключение с помощью SPN приложения. используется получение токена в режиме client_credentials flow. Пользователь в конце логинится, используя delegated access права приложения.

function Get-GraphToken {
    Param([string]$ApplicationId, $TenantName, $AppPassword)
 
    $Url = "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token"
 
    $Body = @{
        client_id     = $ApplicationId
        client_secret = $AppPassword
        scope         = "https://graph.microsoft.com/.default"
        grant_type    = 'client_credentials'
    }
 
    $token = (Invoke-WebRequest -Method POST -Body $Body -ContentType 'application/x-www-form-urlencoded' -Uri $Url).Content `
    | ConvertFrom-Json `
    | Select-Object -ExpandProperty access_token
    
    return $token
}

$token = Get-GraphToken -ApplicationId $ApplicationID -TenantName $tenantID -AppPassword $ClientKey 

Connect-AzureAD -TenantId $tenantId -AadAccessToken $token -AccountId user@domain.com

И есть еще один трюк — извлечение токена прямо из запроса к Azure, т.к. приложения можно читать не только через AAD, но и Az, т.к. при этом в ответ от Az включается токен для нужно скоупа (graph.windows.net).

$TenantId = "You tenant here"
$ApplicationId = "Your application id to login here"
$ServicePrincipalKey = ConvertTo-SecureString -String "Put a key of the application here" -AsPlainText -Force
Write-Information "Login to Azure as SP: $ApplicationId"
$AzureADCred = New-Object System.Management.Automation.PSCredential($ApplicationId, $ServicePrincipalKey)
Add-AzAccount -ServicePrincipal -Credential $AzureADCred -TenantId $TenantId
# Get application with Azure because this will fill the tokencache for AzureAD as well (hidden feature).
Write-Information "Get application with Azure: $ObjectIdOfApplicationToChange"
Get-AzADApplication -ObjectId $ObjectIdOfApplicationToChange
$ctx = Get-AzureRmContext
$cache = $ctx.TokenCache
$cacheItems = $cache.ReadItems()
$token = ($cacheItems | where { $_.Resource -eq "https://graph.windows.net/" })
Write-Information "Login to AzureAD with same SP: $ApplicationId"
Connect-AzureAD -AadAccessToken $token.AccessToken -AccountId $ctx.Account.Id -TenantId $ctx.Tenant.Id

Насколько полезен этот пост?

Кликните на звезду, чтобы оценить!

Средний рейтинг 0 / 5. Количество голосов: 0

Еще нет голосов. Будь первым!

Поделиться:
Помечено %1$s , , , , ,

Написано автором Александр Д.