PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Utilisation des API Microsoft Graph
Utilisation des API Microsoft Graph
Débuté par ROMULUS001, 20 jan. 2021 11:02 - 5 réponses
Membre enregistré
352 messages
Popularité : +12 (18 votes)
Posté le 20 janvier 2021 - 11:02
Bonjour,
Je débute dans l'utilisation des API Microsoft Graph, je rencontre beaucoup de difficultés à les utiliser.

J'avais lu cet article très bien fait:
https://developer.microsoft.com/en-us/graph/blogs/30daysmsgraph-day-13-postman-to-make-microsoft-graph-calls/

Où je faisais mes premiers tests sur Postman, j'arrivais à générer un access token, mais à l'utiliser lors d'appels de fonctions, me disant que mon token n'a pas les droits, alors que j'avais déjà défini des droits (dans mon cas, je veux récupérer mon calendrier).

J'ai alors voulu voir comment traduire le code en wlangage, là aussi, je rencontre des difficultés quant à la génération du token.

Voici mon code :
OAuth2Params est OAuth2Paramètres
OAuth2Params..ClientID = gf_CLientID
OAuth2Params..ClientSecret = gf_ClientSecret
OAuth2Params..URLAuth = ChaîneConstruit("https://login.microsoftonline.com/%1/oauth2/v2.0/authorize",gf_TenantID)
OAuth2Params..URLToken = ChaîneConstruit("https://login.microsoftonline.com/%1/oauth2/v2.0/token",gf_TenantID)

OAuth2Params..ParamètresSupplémentaires = "force_reapprove=false"
OAuth2Params..Scope = "offline_access User.Read"
MonToken est un AuthToken = AuthIdentifie(OAuth2Params)

MonToken = AuthIdentifie(OAuth2Params)


Concernant mes ID :




A l'exécution, je rencontre cette erreur :




Pourriez-vous m'aider à avancer?
Je n'arrive pas à trouver de la documentation claire et précise sur le code à mettre en place.

Merci
Membre enregistré
352 messages
Popularité : +12 (18 votes)
Posté le 20 janvier 2021 - 11:34
J'ai vu qu'il était possible de faire des appels REST, j'ai mis le code suivant :

MaRequete est une restRequête
MaRequete..Header["Content-Type"]="application/x-www-form-urlencoded"
MaRequete..Header["Host"]="login.microsoftonline.com"

MaRequete..Méthode=httpPost
MaRequete..URL=ChaîneConstruit("https://login.microsoftonline.com/%1/oauth2/v2.0/token",gf_TenantID)

ContenuBody est un JSON
ContenuBody.grant_type = "client_credentials"
ContenuBody.client_id = gf_CLientID
ContenuBody.scope = "https://graph.microsoft.com/.default"
ContenuBody.client_secret = gf_ClientSecret

MaRequete..Contenu=ContenuBody.VersChaîne()

MaReponseRequete est une restRéponse
MaReponseRequete=RESTEnvoie(MaRequete)


Au niveau de la réponse, j'ai ceci :
{
"error":"invalid_request",
"error_description":"AADSTS900144: The request body must contain the following parameter: 'grant_type'.\r\nTrace ID: 8b83d56b-a7c3-440c-9cd9-bbf231c9a600\r\nCorrelation ID: dcf611a2-8a5e-4d70-a3c2-2fa40262ae42\r\nTimestamp: 2021-01-20 10:22:10Z",
"error_codes":
[
900144
],
"timestamp":"2021-01-20 10:22:10Z",
"trace_id":"8b83d56b-a7c3-440c-9cd9-bbf231c9a600",
"correlation_id":"dcf611a2-8a5e-4d70-a3c2-2fa40262ae42",
"error_uri":"https:\/\/login.microsoftonline.com\/error?code=900144"
}


Je n'arrive pas à comprendre le message d'erreur, j'ai bien spécifié le grant_type dans le contenu de ma requête.









Membre enregistré
352 messages
Popularité : +12 (18 votes)
Posté le 20 janvier 2021 - 11:53
Je m'auto-réponds, j'arrive à générer un access token, l'erreur provenait du contenu de la requête, il faut utiliser la syntaxe suivante :
ContenuBody est une chaîne
ContenuBody="grant_type=client_credentials&client_id=[%gf_CLientID%]&client_secret=[%gf_ClientSecret%]&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default"

MaRequete..Contenu=ContenuBody


Je retombe par contre sur la problématique de tout à l'heure, c'est de consommer des fonctions à l'aide du token, où mon token n'aurait pas les autorisations pour pouvoir faire appel
Membre enregistré
22 messages
Popularité : +7 (7 votes)
Posté le 26 février 2021 - 16:18
Hello,

Procedure Authentification_SharePoint():booléen

OAuth2Params is an OAuth2Parameters

// Paramètre de l'application
//ID de l'application
OAuth2Params..ClientID = "6ba7c357-977c-4dbe-a5eb-83e562099e57"
//Mot de passe
OAuth2Params..ClientSecret = "XXXXXXX Your Secret XXXXXXXXXXXXXXX"

OAuth2Params..AuthURL = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize"
OAuth2Params..TokenURL = "https://login.microsoftonline.com/common/oauth2/v2.0/token"


OAuth2Params..RedirectionURL= "https://smart.lemo.com/WD240AWP/WD240Awp.exe/OAUTH2_RETOUR"


//On ajoute les permissions
OAuth2Params..Scope = "Sites.ReadWrite.All"
//OAuth2Params..Scope = "Files.ReadWrite.All"


// On récupère le jeton d'authentification qui nous permettra de d'interagir avec office 365 (SharePoint)
gnMontoken = AuthIdentify(OAuth2Params)

IF gnMontoken <> Null THEN
IF ErrorOccurred THEN
Error("Une erreur s'est produite lors de la tentative de connexion a SharePoint " + CR + ErrorInfo())
RESULT False
END
RESULT True
END


Et ensuite on peut interroger Graph, sharepoint ... etc.


//code de connexion avec appel webservice
cMyReauestHTTPsend is a httpRequest
cMaRequêteHTTPreponse is a httpRequest
vAnswer is Variant
SPSiteID is string

// - Retourne les valeurs identifiants d'un utilisateur ----------------------------------
cMyReauestHTTPsend..URL = "https://graph.microsoft.com/v1.0/me"
cMyReauestHTTPsend..Content = URLEncode("api-version=1.6")
cMyReauestHTTPsend..Method = httpGet
cMyReauestHTTPsend..AuthToken = gnMontoken
cMyReauestHTTPsend..ContentType = "application/json"
cMyReauestHTTPsend..Header["Authorization"] = "Bearer "+gnMontoken..Value

cMaRequêteHTTPreponse = HTTPSend(cMyReauestHTTPsend)

vResponse = JSONToVariant(cMaRequêteHTTPreponse..Content)


--
Bernard Vésy
Membre enregistré
307 messages
Posté le 10 juin 2024 - 16:31
Bonjour,
Je relance le sujet car je ne parviens pas à me connecter avec la procédure de Bernard (merci à toi pour ce partage).

Je dois me connecter à un sharepoint via graph. J'ai un exemple en powershell mais je dois oublier des choses car j'ai une erreur "Erreur en associant la socket au port 80 sur la machine. La socket a renvoyé l'erreur système suivante : <10013>"

Voici l'exemple powershell qui fontionne.

#credentials
$clientSecret = "***"
$clientId = "****"

$tenantPrefix = "uns"
$siteUrl = "https://uns.sharepoint.com/teams/Team_540"

# Authenticate to Microsoft
$tenantName = $tenantPrefix +".onmicrosoft.com";
$tenantDomain = $tenantPrefix +".sharepoint.com";
$sitePath = $siteUrl.Split("/")[3] + '/' + $siteUrl.Split("/")[4]
$ReqTokenBody = @{
Grant_Type = "client_credentials"
Scope = "https://graph.microsoft.com/.default"
client_Id = $clientId
Client_Secret = $clientSecret
}
$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody
$AccessToken = $TokenResponse.access_token

#get file content
$apiUrl = 'https://graph.microsoft.com/v1.0/sites/uns.sharepoint.com,49d44ef-aef0-4cf5-a5a7-2cde05392f8e,549836f5-7e7c-4b04-b650-2557d0309cbb/drives/b!b4zBSfCu9UylpyzeBTkvjvU2mFR8f9AwnLuWUGp7K1Z3Rp57MW3BECT7/root:/Contacts.csv:/content'
$result = Invoke-RestMethod -Method Get -Headers @{Authorization = "Bearer $AccessToken" } -Uri $apiUrl


J'ai adapté la procédure connexion sharepoint de Bernard en remplaçant

OAuth2Params..ClientID = "***"
//Mot de passe
OAuth2Params..ClientSecret = "***"

OAuth2Params..AuthURL = "https://login.microsoftonline.com/uns.onmicrosoft.com/oauth2/v2.0/authorize"
OAuth2Params..TokenURL = "https://login.microsoftonline.com/uns.onmicrosoft.com/oauth2/v2.0/token"


//On ajoute les permissions
OAuth2Params..Scope = "https://graph.microsoft.com/.default"

je ne sais pas quoi mettre en
OAuth2Params..RedirectionURL= "https://smart.lemo.com/WD240AWP/WD240Awp.exe/OAUTH2_RETOUR"

ni ce qui doit manquer pour me connecter
Merci pour votre aide

--
Pascal
Membre enregistré
50 messages
Posté le 21 juin 2024 - 20:34
Bonjour
Je vais apporter aussi ma petite pierre à l'édifice. J'ai une procédure similaire à celle de Bernard

La première chose à faire est de créer une application dans Microsoft Entra et lui donner des autorisations Graph en mode "application". Cela évite d'avoir un écran de login/mot de passe. Le hic ici est que la secret key n'est valable que 720 jours max. Mais on peut quand même adapter (https://www.alitajran.com/renew-client-secret/)

Une fois cela fait on code dans Windev

GetToken = ma procédure pour générer un token

ReqToken est une restRequête
ReqToken..Méthode = httpPost
ReqToken..URL = "https://login.microsoftonline.com/"+O365_TENANT_ID+"/oauth2/v2.0/token"
ReqToken..ContentType = "application/x-www-form-urlencoded"
ReqToken..Contenu = URLEncode("grant_type=client_credentials&client_id="+ClientID+"&client_secret="+ClientSecret+"&scope="+"https://graph.microsoft.com/.default")

réponseHTTP est une restRéponse
réponseHTTP = RESTEnvoie(ReqToken)
SI ErreurDétectée ALORS
RENVOYER Faux
FIN

MonTokenParam est un OAuth2Paramètres
MonTokenParam.ClientID = ClientID
MonTokenParam.ClientSecret = ClientSecret
MonTokenParam.URLAuth = "https://login.microsoftonline.com/"+O365_TENANT_ID+"/oauth2/v2.0/authorize"
MonTokenParam.URLToken = "https://login.microsoftonline.com/"+O365_TENANT_ID+"/oauth2/v2.0/token"
MonTokenParam.URLRedirection = "http://localhost:9000/"
MonTokenParam.Scope = "https://graph.microsoft.com/.default"

SI réponseHTTP..CodeEtat = 200 ALORS
jsonReceived est un Variant = JSONVersVariant(réponseHTTP..Contenu)
wMonToken est un AuthToken(MonTokenParam,réponseHTTP..Contenu)
gTokenO365 <= wMonToken
RENVOYER True;
ELSE
RENVOYER False;
END


O365_TENANT_ID = constant avec l'ID du Tenant 0365
ClientID = constant avec l'ID de l'app créée dans Entra
ClientSecret = secret key générée lors de la création de l'app (bien prendre note car ne sera pas représentée)
gTokenO365 est une variable globale dans mon cas


Procédure pour récupérer tous les fichiers dans une bibliothèque SharePoint

j est un JSON
vData est un Variant
//RECUPERER LE TOKEN D'ACCES
GetToken()

IdDriveNomBiblio est une chaîne = "IdDeMaBibliothèque" //disponible dans sharepoint
maRequete est une httpRequête
maReponse est une httpRéponse

maRequete.Méthode = httpGet
maRequete.ContentType = "application/json"
maRequete.AuthToken = gTokenO365
maRequete.Entête["Authorization"] = "Bearer "+gTokenO365..Valeur
tabFile est un tableau de * par 4 chaîne

TraiterDossier("",True,"")
//ROOT OF LIBRARY

PROCEDURE INTERNE TraiterDossier(LOCAL pId est une chaîne, pRoot est un booléen, pdossier est une chaîne)
IF pRoot THEN
maRequete.URL="https://graph.microsoft.com/v1.0/drives/[%IdDriveNomBiblio%]/root/children"
ELSE
maRequete.URL="https://graph.microsoft.com/v1.0/drives/[%IdDriveNomBiblio%]/items/[%pId%]/children"
///drives/{drive-id}/items/{item-id}/children
END
emptyJson est un JSON
maRequete.Contenu = emptyJson
maReponse = maRequete.Envoie()

j = maReponse.Contenu
vData = JSONVersVariant(j)

//vData contient ici les dossiers de la bibliothèque
//il faut boucler sur les dossiers pour aller chercher les enfants et ainsi de suite
FOR EACH obj OF vData.value

IF obj["folder"]<>Null THEN
// trace(obj.name)
TraiterDossier(obj.id,False,pdossier+"/"+obj.name)
ELSE IF obj["file"]<>Null THEN
// Trace(tab+tab+obj.name)
tabFile.AjouteLigne(obj.name,pdossier,obj.webUrl,obj.id)
END
END
FIN


En espérant que cela puisse aider :)