2017-09-06 1 views
1

Notre complément Excel nécessite un jeton OAUTH pour certaines fonctions qui appellent l'API REST SharePoint.Obtenir le jeton Sharepoint dans le complément Excel

Le complément utilise les commandes du ruban et nous n'avons pas de volet de tâches. Nous avons le code suivant pour obtenir le jeton d'autres projets:

var dhi = dhi || {}; 
dhi.adal = (function (mod) { 

    var settings = { 
     clientId: "xxxyyyyzzzz", 
     url: "https://company.sharepoint.com" 
    }; 


    mod.getToken = function() { 

     var dfd = $.Deferred(); 
     //fix origin for IE 
     if (!window.location.origin) { 
      window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); 
     } 

     var configOptions = { 
      clientId: settings.clientId, 
      postLogoutRedirectUri: window.location.origin, 
      cacheLocation: 'localStorage', 
     } 

     window.authContext = new AuthenticationContext(configOptions); 

     var isCallback = authContext.isCallback(window.location.hash); 
     authContext.handleWindowCallback(); 

     var user = authContext.getCachedUser(); 

     if (!user) { 
      authContext.login(); 

     } else { 

      var cachedToken = authContext.getCachedToken(user.profile.aud); 
      if (!cachedToken) { 
       authContext.login(); 
      } else { 


       var url = settings.url; 

       var tok = authContext.acquireToken(url, function (error, token) { 
        console.log(error); 
        if (token != null) { 
         console.log(token); 
         sharedtoken = token; 
         dfd.resolve(token); 
        } else { 
         if (cachedToken != "" && cachedToken != null && cachedToken != undefined) { 
          dfd.resolve(cachedToken); 
         } else { 
          dfd.reject("Unable to obtain token. Please contact [email protected] with the following error : " + error); 
         } 
        } 
       }); 
      } 
     } 
     return dfd.promise(); 
    } 
    return mod; 
})(dhi.adal || {}); 

et dans le fichier functions.js (où les gestionnaires de boutons de ruban sont définis) que nous appelons cette initialisation:

(function() { 
    "use strict"; 
    $(document).ready(function() { 

     dhi.adal.getToken.then(
      function (token) { 
       sharedtoken = token; 
       Office.initialize = function (reason) { 

        // some code here 

       } 
      }, 
      function (error) { 
       app.showNotification("Problem occured", error); 
      }); 
    }); 
})(); 

Nous sommes face à problèmes suivants:

1) Si le jeton est déjà mis en cache, cela fonctionne. Cependant, quand il doit appeler authContext.login(), il se bloque (aucun message nulle part). Nous croyons ne pas savoir où afficher la boîte de dialogue de connexion (dans la toute première version de ce complément, nous avons utilisé un volet de tâches et affiché la page de connexion, cependant, pour plusieurs raisons, nous devons utiliser les commandes.)

2) Nous devons l'appeler avant que le Office.initialize soit appelé, sinon il ne fonctionne pas (j'ai essayé de mettre getToken seulement aux fonctions qui en ont besoin mais sans succès) - aucune idée pourquoi. Cela a un effet secondaire, que nous devons toujours appeler getToken(), également pour les actions de bouton, quand aucun jeton n'est nécessaire

3) J'ai essayé de créer une boîte de dialogue pour obtenir le jeton, mais il y a d'autres problèmes - certains problèmes dans adal.js ...

Alors, je voudrais demander - est-il un moyen simple comment obtenir un jeton SharePoint à partir de active Directory dans Office.jas

S'il y avait un échantillon, il nous aiderait lot.

Répondre

0

Il n'existe pas de méthode intégrée permettant d'obtenir un jeton pour SharePoint. Pour ouvrir une boîte de dialogue d'authentification, vous devez utiliser le Dialog API pour cela. Il existe un exemple de complément PowerPoint qui utilise l'API Dialog pour s'authentifier auprès de Graph: PowerPoint-Add-in-Microsoft-Graph-ASPNET-InsertChart. Les principes et les composants utilisés ici devraient se traduire facilement en Excel et SharePoint.

Pour une bibliothèque d'authentification, je vous recommande de jeter un oeil à microsoft-authentication-library-for-js.

Vous devez également vous assurer que votre fichier de fonctions attribue Office.initialize immédiatement au chargement de la page. Ce n'est pas un appel sortant vers une fonction init, c'est une propriété que vous assignez aussi une fonction init. Office appellera cette méthode automatiquement et si vous n'avez pas affecté une fonction, cela entraînera des erreurs.