Bonjour,

Je tourne en rond depuis plusieurs jours et je ne trouve pas d'issue. Je ne suis pas sûr d'avoir pris la bonne direction.
Je viens vous demander des conseils et de m'aider sur mon code.
Je développe en PHP en utilisant le SDK msgraph-sdk-php. (version 2.17.0)
Je développe une application web et j'aimerais envoyer des tâches dans To Do.
Je pars du principe que l'utilisateur devra valider son consentement la 1ère fois, puis l'objectif serait de ne plus lui demander.
J'aurais récupéré des informations telles que token et token_refresh pour refaire des actions la fois suivante (stockées dans la base de données), du moins c'est ce que je pense.

Pour créer une tâche dans To Do, je dois effectuer 2 actions pour l'utilisateur qui a validé son consentement :
  • Lire les listes de tâches et récupérer l'Id[0] de la tâche.
  • Envoyer la tâche et les informations à cette tâche[0]->id.


Je me suis donc tourné vers la méthode 'OnBehalfOfContext' avec l'idée de faire plusieurs requêtes avec des tokens dans la base de données pour l'utilisateur.

Est-il normal que mon jeton ne soit pas un JWT ?
Pourquoi cela ne fonctionne-t-il pas ?

Je voudrais donc utiliser la classe 'OnBehalfOfContext' pour faire ces requêtes.
$tokenAccess devrait être au format JWT et il n'est pas dans ce format, donc 'OnBehalfOfContext' ne doit pas pouvoir fonctionner correctement.
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
$oboContext = new OnBehalfOfContext(
	$tenantId,
	$clientId,
	$clientSecret,
	$tokenAccess,
);
$graphClient = new GraphServiceClient($oboContext, $scopes);

Test code extract (all in one)
test-event.php
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
 
<?php
	require_once __DIR__ . '/vendor/autoload.php';
 
	use League\OAuth2\Client\Provider\GenericProvider;
	use Microsoft\Kiota\Authentication\Oauth\OnBehalfOfContext;
	use Microsoft\Kiota\Abstractions\ApiException;
	use Microsoft\Graph\GraphServiceClient;
	use Microsoft\Graph\Generated\Models\TodoTask;
	use Microsoft\Graph\Generated\Models\DateTimeTimeZone;
	use Microsoft\Graph\Generated\Models\Importance;
	use Microsoft\Graph\Generated\Models\ItemBody;
	use Microsoft\Graph\Generated\Models\BodyType;
 
	session_start();
	session_regenerate_id();
 
	$tenantId = 'common';
	$clientId = '{clientId}';
	$clientSecret = '{clientSecretId}';
	$redirectUri = 'http://localhost/MS-Graph/test-event.php';
	$scopes = ['Tasks.ReadWrite', 'User.Read', 'offline_access'];
	$oauthClient = new GenericProvider([
		'clientId'                => $clientId,
		'clientSecret'            => $clientSecret,
		'redirectUri'             => $redirectUri,
		'urlAuthorize'            => "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/authorize",
		'urlAccessToken'          => "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token",
		'urlResourceOwnerDetails' => '',
		'scopes'                  => $scopes,
	]);
	if (!isset($_GET['code'])) {
		$authorizationUrl = $oauthClient->getAuthorizationUrl();
		header('Location: ' . $authorizationUrl);
		exit;
	}
	echo "<pre>";
	$authCode = $_GET['code'];
	$accessToken = $oauthClient->getAccessToken('authorization_code', [
		'code' => $authCode
	]);
	$tokenAccess = $accessToken->getToken();
	echo 'Access Token : ' . $tokenAccess . "<br>";
	echo 'Refresh Token : ' . $accessToken->getRefreshToken() . "<br>";
	echo 'Date d\'expiration : ' . date('d/m/Y H:i:s', $accessToken->getExpires()) . "<br>";
	echo 'Déjà expiré ? ' . ($accessToken->hasExpired() ? 'Oui' : 'Non') . "<br>";
	$oboContext = new OnBehalfOfContext(
		$tenantId,
		$clientId,
		$clientSecret,
		$tokenAccess,
	);
	$graphClient = new GraphServiceClient($oboContext, $scopes);
	try {
		$taskLists = $graphClient->me()->todo()->lists()->get()->wait()->getValue();
		foreach ($taskLists as $taskList) {
			echo 'Task List ID: ' . $taskList->getId() . ' - Title: ' . $taskList->getDisplayName() . PHP_EOL;
		}
		$task = new TodoTask();
		$task->setTitle("Nouvelle tâche OnBehalfOf");
        $dueDateTime = new DateTimeTimeZone();
        $dueDateTime->setDateTime('2024-10-25Z');
        $dueDateTime->setTimeZone('Europe/Paris');
        $task->setDueDateTime($dueDateTime);
        $task->setImportance(new Importance('normal'));
        $task->setIsReminderOn(true);
        $reminderDateTime = new DateTimeTimeZone();
        $reminderDateTime->setDateTime('2024-10-25T13:00:00Z');
        $reminderDateTime->setTimeZone('Europe/Paris');
        $task->setReminderDateTime($reminderDateTime);
		$body = new ItemBody();
        $body->setContent('Ceci est une tâche créée avec le flux OnBehalfOf');
        $body->setContentType(new BodyType('text'));
		$task->setBody($body);
		$graphClient->me()->todo()->lists()->byTodoTaskListId($taskLists[0]->getId())->tasks()->post($task)->wait();
		echo "Tâche créée avec succès.";
	} catch (ApiException $e) {
		echo "Echec de la création de la tâche : ".$ex->getError()->getMessage();
	}
?>

Config de l'API MS Graph sur mon O365

Inscription d'application - Vue d'ensemble
Nom : App Registrations Overview.png
Affichages : 109
Taille : 40,2 Ko

Authentification
Nom : Platform_config_Web_uri.png
Affichages : 107
Taille : 16,4 Ko

J'ai essayé avec ou sans la coche
Nom : Platform_config_Web_implicit.png
Affichages : 102
Taille : 20,3 Ko

Certificats et secrets : 1 clé API non expirée

Configuration du jeton : Vide

API Autorisées (Utilisation du mode délégué et non du mode application (j'espère ne pas avoir fait d'erreur) )
Nom : Capture d'écran 2024-10-25 090818.png
Affichages : 111
Taille : 21,3 Ko

Toutes les autres options sont vides.

Si vous avez besoin de compléments d'informations, n'hésitez pas à me demander.

Dites moi si c'est bien la bonne méthode que je mets en place ou pas du tout ?
Si c'est la bonne méthode, qu'est qui pose problème.

J'ai pourtant déjà fait cela avec l'API Google, ToDoist, Trello et je n'ai pas rencontré de difficultés.

Merci pour votre aide.

Xav