TUTOS.EU

Exemple d'appel d'une API en Powershell - à compléter

Voici un exemple d'appel d'une api où l'authentification est basique.
Le login et mot de passe est codé en base64 et placé dans le header dans le champ Authorization.
Il n'y a pas de paramètres d'envoyés à l'api.

On récupère le résultat dans un objet puis on liste les éléments.

$username = "login"
$password = "Motdepasse"

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))

$Result = Invoke-RestMethod https://url/emplacement_avec_api/users.json -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

$Result | gm #Grâce à ce gm, j'ai pu voir sur mon exemple que mes utilisateurs étaient sous users, mais pour votre objet cela sera différent

$Result.users | gm #Avec cela j'affiche les champs que l'on peut interroger dans users

#Je liste le nom de tous les utilisateurs qui sont dans mon objet users, propriété name
foreach ($UneLigne in $Result.users){
	Write-Host $UneLigne.name
}
Lien vers le fichier : cliquez ici Copier le code

Ici j'ai fait la même interrogation qu'avec powershell avec Postman qu'on récupère sur https://www.postman.com/downloads
On retrouve l'authentification faite avec le login/mot de passe codé en base64 passé dans le header

L'astuce de devoir mettre 'Basic' devant le mot de passe a été trouvée sur
https://www.toolsqa.com/postman/basic-authentication-in-postman/

bon en vrai 'basic' était précisé aussi dans le code powershell si on regarde bien ..

Toujours histoire de, à 'la racine', l'authentification est paramétrée ici en basique, mais en vrai avec l'exemple ci dessus on ne s'en est pas servi car le couple login/mdp a été injecté en base64 dans le header

Autre exemple différent où j'essaye de me connecter à une solution de backup Unitrends.
Leur doc qui indique les paramètres est celle-ci, et la partie où j'ai joué concerne l'authentification dont la doc est ici
 

Là du coup en première étape il faut faire une requête de type Post, dans le body, en json.

Pour cela ce blog jokecamp m'a donné un exemple.

Comme indiqué dans leur doc, cette première étape permet de récupérer un token qui sera a utiliser dans les autres appels.

 

Traduit en powershell cela donne

Clear-Host

$person = @{
    "username"="root"
    "password"="lepassword"
}
$json = $person | ConvertTo-Json

$Result = Invoke-RestMethod http://ipduserveur/api/login -Method Post -Body $json -ContentType 'application/json'
$Result | gm

$tokenautiliser = $Result.auth_token
write-host $tokenautiliser
Lien vers le fichier : cliquez ici Copier le code

Dans l'exemple suivant, on utilise des api de Zendesk.
Des paramètres doivent être envoyées à l'API.
Pour cela, conformément à ce que Zendesk indique dans leur documentation d'utilisation, dans le body on envoie un json qui contient pour l'exemple ici une adresse email à créer (voir $MyIdentity = @{ "identity" = @{ "type" etc )

Clear-Host

$username = "monuser/token"
$password = "letoken"

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))


#Appel d'api pour récupérer des users
$Result = Invoke-RestMethod https://masociete.zendesk.com/api/v2/users.json?page=5078 -Method Get -Headers @{Authorization=("Basic $base64AuthInfo")}


#On liste tous les agents avec un email en @example.com
#https://developer.zendesk.com/api-reference/ticketing/users/user_identities/#make-identity-primary

foreach ($UneLigne in $Result.users | Where-Object {$_.email -match ".*@example.com"}){

    Write-Host $UneLigne.name
    Write-Host "email actuel $($UneLigne.email)"
    $nouvelEmail = $UneLigne.email -replace '\+masociete.fr@example.com','@masociete.fr'
    Write-Host "Nouvel email : $nouvelEmail"

    #On ajoute une nouvelle adresse mail sur la personne
    $MyIdentity = @{ "identity" = @{ "type" = "email"; "value"= "$nouvelEmail"; }}
    $JSON = $MyIdentity | convertto-json
    $CreateIdentities = Invoke-RestMethod https://masociete.zendesk.com/api/v2/users/$($UneLigne.id)/identities.json -Method Post -Body $JSON -ContentType 'application/json' -Headers @{Authorization=("Basic $base64AuthInfo")}

    #On récupère les identity de la personne et on passe l'adresse non primary en primary
    Write-Host "URL de la personne : https://masociete.zendesk.com/api/v2/users/$($UneLigne.id)/identities.json"
    $ResultRechercheidentities = Invoke-RestMethod https://masociete.zendesk.com/api/v2/users/$($UneLigne.id)/identities.json -Method Get -Headers @{Authorization=("Basic $base64AuthInfo")}
    foreach ($UneLigneIdentities in $ResultRechercheidentities.identities){
       Write-Host "$($UneLigneIdentities.id) Type : $($UneLigneIdentities.type) Value : $($UneLigneIdentities.value) Primary : $($UneLigneIdentities.primary)"

        if ($($UneLigneIdentities.primary) -eq $false){
            $ResultRechercheidentities = Invoke-RestMethod https://masociete.zendesk.com/api/v2/users/$($UneLigne.id)/identities/$($UneLigneIdentities.id)/make_primary.json -Method Put -Headers @{Authorization=("Basic $base64AuthInfo")}
            Write-Host "Passage de $($UneLigneIdentities.value) en tant qu'email principal"
        }
    }

    #Maintenant qu'on a ajouter une nouvelle adresse email, on supprime l'ancienne
    foreach ($UneLigneIdentities in $ResultRechercheidentities.identities){
       #Write-Host "$($UneLigneIdentities.id) Type : $($UneLigneIdentities.type) Value : $($UneLigneIdentities.value) Primary : $($UneLigneIdentities.primary)"

        if ($($UneLigneIdentities.primary) -eq $false){
            $ResultRechercheidentities = Invoke-RestMethod https://masociete.zendesk.com/api/v2/users/$($UneLigne.id)/identities/$($UneLigneIdentities.id).json -Method Delete -Headers @{Authorization=("Basic $base64AuthInfo")}
            #Write-Host ""
            Write-Host "Adresse mail $($UneLigneIdentities.value) supprimée"
        }
    }
    Write-Host ""

    #Start-Sleep -Seconds 3

}
Lien vers le fichier : cliquez ici Copier le code

En notes intéressantes, ici on a des paramètres en json que l'on a déjà vu, et on a un tableau pour les paramètres du header

Clear-Host
$username = "login"
$password = "password"
$url = "https://votresite/api/v1/blablabla"

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))

$MonHeader = @{
    "Authorization" = ("Basic {0}" -f $base64AuthInfo);
    "accept" = 'application/json'
}

$BodyenJson = @{
  "champ1" = 478;
  "champ2"= "Plop_OUT";
  "untruefalse"= $true
}| ConvertTo-Json

write-host $BodyenJson 

$Headers = @{
    "Headers" = @{ Authorization = "Basic $base64AuthInfo" }
}

$Result = Invoke-RestMethod $url -Method Post -Headers $MonHeader -ContentType "application/json" -Body $BodyenJson

Write-Host "Code $($Result.code)"
Write-Host "ErrorMessage $($Result.errorMessage)"
Write-Host "InfoMessage $($Result.infoMessage)"
Lien vers le fichier : cliquez ici Copier le code

2