#1: That moment you realize you have a connection

26 mei
X minuten

Previously on the MS-graph series… in de eerdere introductie van deze nieuwe blogreeks hebben jullie meer kunnen lezen over Christopher zelf en wat hem richting de mooie IT wereld heeft doen bewegen. Het lezen van IT-blogs was ook een van de dingen die hem inspireerde. Daarom neemt hij nu ook jullie graag mee in deze serie, waarin ik (Jildou) vanuit andere invalshoeken de onderwerpen zal benaderen, zodat deze blog voor zowel IT’ers, als niet IT’ers te volgen is!

Voordat we verder gaan nog even kort iets over mijzelf: Mijn naam is Jildou de Boer, ik ben 26 jaar en werk nu iets meer dan twee jaar bij I-share. Na het afstuderen van mijn hbo studie Communicatiemanagement lag er bij I-share een mooie uitdaging op het gebied van marketing. De IT-wereld was toen nog vrij nieuw voor mij, maar nu zijn we hier!

Korte disclaimer voor #1 van deze serie:

  • Powershell en de verschillende modules die we benoemen zijn geïnstalleerd op de machine;
  • Er is een Azure Tenant beschikbaar waarbij er genoeg rechten zijn om op API-permissie te kunnen zetten.

In de volgende paragrafen vertelt Christopher ons meer over hoe we een connectie gaan maken met Azure Active Directory door middel van Powershell. Daarnaast zal ik hem hier en daar aanvullen met wat tips en tricks voor jullie. Lees snel verder om hier meer te weten over te komen!

Anybody got some endpoints?

Als gebruiker van Azure kunnen we heel veel dingen direct configureren in de portal. Van het aanmaken van nieuwe gebruikers tot het volledig “bouwen” van een hele applicatie. Als certified POC'er kun je hierdoor al snel het een en ander in Azure samenstellen waardoor je al snel resultaat zult zien. Voor de kleinere handelingen, als het aanmaken van een account of het maken van een securitygroep is het natuurlijk prima om dit in de portal te configureren. Zodra er meerdere accounts, groepen en ook groepslidmaatschappen bij komen kijken wordt dit al snel een geestdodende klus, maar dat zijn natuurlijk mijn woorden. Ik wilde dit soort taakjes het liefst zo snel mogelijk in Powershell scripts rammen, zodat ik bij nieuwe aanvragen gewoon het script kon starten (en koffie kon gaan drinken) en het resultaat in de Azure portal kon bekijken. Maar de grote vraag is: hoe kan ik ervoor zorgen Azure ‘dingen’ te laten doen aan de hand van mijn scripts? Gelukkig is Google je beste vriend en kwam ik al snel op het spoor van de MS-Graph API!

Tijdens mijn studie heb ik al het een en ander mogen doen met REST-API calls. Vandaar dat mijn voorkeur uitgaat naar het communiceren met de MS-Graph API door middel van REST call. Ik zeg hiermee niet dat het per sé de beste manier is, maar op dit moment voor mij wel de meest optimale.

*Bron naar Microsoft.


Het toffe van Microsoft en Azure is, is dat er een hele grote community is die hier al mee heeft kunnen spelen. Onder het mom van 'beter goed gejat, dan slecht bedacht', kwam ik vele blogs tegen waarin werd uitgelegd hoe er met Powershell een 'connectie' kan worden gemaakt met de MS Graph API. Ik heb hier gekozen voor de authenticatie door middel van client/secret.

Het eerste wat ik hiervoor moest maken was een App registration in Azure, en ja: die heb ik in elkaar geklikt in de Azure portal. Bij het configureren van deze App registration zijn er een aantal dingen die ingesteld moeten worden. Als eerste moeten we het beestje natuurlijk een naam geven en laat dat nou net een van de dingen zijn die ik erg lastig vind. Daarom kies ik hier voor een makkelijke naam.

Om te testen of de 'connectie' ook daadwerkelijk werkt, moet er een extra API-permissie toegevoegd worden, namelijk: User.Read type ''application permissions''.

Als het goed is kunnen er hiermee een aantal gegevens opgehaald worden over een bepaalde gebruiker (ik), dus fingers crossed.

Nu komt het echte werk! We gaan kijken of er met behulp van Powershell een REST call gedaan kan worden, waarbij er wat informatie van mij terug gekregen zou moeten worden. Wat we eerst wel in elkaar moeten hacken is een client/secret op de App registration. Hiermee kunnen we een Bearer token terugkrijgen die meegestuurd moet worden met de API call.

Het aanmaken van een secret op de App registration is gelukkig geen rocket science en wordt goed beschreven in de Microsoft documentatie.

Lazyness isn't a bad thing I guess

Door met behulp van client/secret te communiceren met onze Application Registration en hiervan een token terug te krijgen laten we de magie van Powershell een klein beetje het werk doen. Omdat we dit vaker gaan moeten doen (want tokens zijn niet onbeperkt houdbaar) maak ik hier een kleine functie voor. Hierdoor kunnen we deze functie in al onze latere scripts aanroepen.

Het endpoint dat er wordt gebruikt om de bearer token op te halen vraagt een aantal dingen, namelijk:

  • TenantID;
  • ClientID a.k.a. Application ID;
  • Een secret.

De functie die ik daarvoor heb opgebouwd bestaat uit een aantal stukken. Allereerst hebben we het parameter block waarmee bovenstaande items worden gedefinieerd. Vervolgens gebruiken we deze parameters om een body op te bouwen die we mee moeten sturen met de API-call.

Vervolgens stuurt het script een Header terug die weer gebruikt zal worden om uiteindelijk de daadwerkelijke call richting de Graph API. Lang verhaal, maar als we het script gaan draaien zal het duidelijker worden!

(Het script dat we gebruiken om de Bearer token op te halen)


Function Get-MSGraphHeader {
    [CmdletBinding()]

Param (    
    [Parameter(Mandatory= $false)]
    [ValidateSet("ed1a13e9-b8d4-4c8c-810e-d9cac89075f8")]
    [String]$TenantId= "ed1a13e9-b8d4-4c8c-810e-d9cac89075f8",

    [Parameter(Mandatory= $true)]
    [String]$clientId,

    [Parameter(Mandatory= $true)]
    [String]$clientSecret    
    )

$tokenBody = @{
    Grant_Type = "client_credentials"
    Scope = https://graph.microsoft.com/.default
    Client_Id = $clientId
    Client_Secret = $clientSecret
    }

$insertParams = @{
    Method = "POST"
    Uri = https://login.microsoftonline.com/$Tenantid/oauth2/v2.0/token
    body = $tokenBody
    }

$tokenResponse = Invoke-RestMethod @insertParams

$MSGraphHeaders = @{
    "Authorization" = "Bearer $($tokenResponse.access_token)"
    "Content-type" = "application/json"

Copy to clipboard

Als we de functie runnen in een Powershell terminal, met de client/secret uit onze Application Registration (jullie snappen vast wel dat we die hier niet bij zetten) zouden we de volgende functie en het bijbehorende resultaat moeten zien:

Get-MSGraphHeader –TentantID “<Vul hier jouw tenantID in>” - ClientID “<ID van de application Registration>” - ClientSecret “<Value van de Secret waarde>” 

Resultaat:

Content-type: ''application/json"

Authorization: "Bearer <met waarde van jouw token>" 

Met de header die we terugkrijgen kunnen we nu proberen om een call te doen richting de Graph API. Tijdens mijn vorige opdrachten deden we altijd aan het einde van de sprint een live demo waarbij we onderling altijd het ritueel in ons team hadden om even een minuutje te pakken voor: ‘a little prayer to the demo gods!’ Uiteraard, ging het 9 van de 10 keer alsnog niet vlekkeloos.

Het voordeel van het schrijven van een blog is dan wel weer dat ik het net zo lang kan proberen totdat het goed gaat.

Terug naar waar we mee bezig waren! Vorig jaar volgde ik tijdens Experts Live een sessie over Powershell en REST calls. Hierin gebruikte de spreker een bepaalde stijl bij het opbouwen van zijn call die ik zo cool vond dat ik hem heb overgenomen.

Dit doe ik als volgt:

Na drie keer runnen (iets met de toch niet correcte API permissies en het kopiëren van een verkeerde user ID. Toch niet genoeg tijd voor de demo gods genomen) kreeg ik het ‘eureka’ momentje!


Nice! Het is gelukt om met mijn lokale Powershell sessie data op te halen uit Azure Active Directory via de Graph API endpoint.

Next up on the MS-graph series… The MS-Graph series #2: That moment you realize you added some users. Nu we een connectie hebben gemaakt gaan we doorpakken door met deze connectie gebruikers aan te maken en misschien voegen we daar ook nog een klein beetje automation aan toe. Stay tuned...