4 pièce(s) jointe(s)
PHP et le SDK MS Graph (msgraph-sdk-php) -problèmes d'authentification et de récupération de jetons valides
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:
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:
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
Pièce jointe 661102
Authentification
Pièce jointe 661101
J'ai essayé avec ou sans la coche
Pièce jointe 661103
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) )
Pièce jointe 661100
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
PHP : Création de tâches dans Outlook, solutions alternative ?
Bonjour,
visiblement pas grand monde utilise MS Graph PHP ????
Est-ce qu'il y a des solutions alternatives, toujours en PHP ?
Toujours bloqué sur mon projet pour la partie Microsoft. Nickel avec Google API et d'autres, mais je voudrais pouvoir proposé également MS Outlook.
Merci pour votre aide.
Xav