IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

PHP et le SDK MS Graph (msgraph-sdk-php) -problèmes d'authentification et de récupération de jetons valides


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre expérimenté
    Homme Profil pro
    Architecte progiciel et développeur informatique
    Inscrit en
    Février 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte progiciel et développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 260
    Par défaut 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 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 : 103
Taille : 40,2 Ko

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

    J'ai essayé avec ou sans la coche
    Nom : Platform_config_Web_implicit.png
Affichages : 96
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 : 103
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

  2. #2
    Membre expérimenté
    Homme Profil pro
    Architecte progiciel et développeur informatique
    Inscrit en
    Février 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte progiciel et développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 260
    Par défaut 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

  3. #3
    Membre expérimenté
    Homme Profil pro
    Architecte progiciel et développeur informatique
    Inscrit en
    Février 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte progiciel et développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 260
    Par défaut
    Bonjour,

    J'ai continué mes investigations, et je viens de comprendre quelque chose.

    Quand je choisis un compte utilisateur pour le consentement qui fait parti de mon domaine, cela fonctionne, j'ai bien un token valide (JWT).
    Quand je choisis un compte MS personnel ou externe, j'ai un token invalide.

    J'ai aperçu sur la configuration dans l'admin Entra de mon application sur les propriétés ce message.

    Nom : App vérifiée.png
Affichages : 63
Taille : 19,0 Ko

    Je suis actuellement sur un développement test en local PHP, pour avoir accès à des comptes externes ou personnels, est-ce que je dois faire valider mon application MS Entra ?
    Est-ce que cela peut être le problème ?

    Comment je peux faire, ce ne sont que des tests ?
    Est-ce que je ne peux pas autoriser des mails spécifiques qui seraient ajouter justement pour des tests avant de devoir valider l'application. Cela se fait côté Google API.

    J'attend vos retours d'informations, si ça me permettrait d'avancer un peu sur le sujet.
    Merci

    Xav

Discussions similaires

  1. php, SqlServer et authentification windows
    Par pifouxx dans le forum Langage
    Réponses: 4
    Dernier message: 05/12/2023, 02h37
  2. Écrivez un code de haute qualité avec Microsoft Graph PHP SDK v2
    Par Anthony dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 10/11/2023, 13h27
  3. Facebook PHP SDK/Graph API
    Par smfrd8 dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 13/02/2014, 23h35
  4. Réponses: 12
    Dernier message: 18/07/2006, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo