Можете ли вы использовать Microsoft Graph API в JavaScript для получения элементов списка? - PullRequest
1 голос
/ 25 мая 2019

Я использую примеры для MSAL и преобразовываю их в MS Graph для чтения SharePoint, но когда дело доходит до чтения элементов списка, кажется, у меня возникают проблемы с разрешениями.

Чтобы убедиться, что у меня есть своисинтаксис правильный, я использую Graph Explorer с моей учетной записью AD, и я могу прочитать элементы списка и подтвердить правильность URI.Я также могу читать и получать массив списков.Но как только я пытаюсь получить элементы списка для списка, ничего не возвращается.

Базовый код здесь https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa

Вот код, который я преобразовал из примера.Если вы обновите переменные и зарегистрируетесь в Azure, вы сможете запустить свой сайт SPO.

<code><!DOCTYPE html>
<html>
<head>
    <title>Quickstart for MSAL JS</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.4/bluebird.min.js"></script>
    <script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.0/js/msal.js"></script>
</head>
<body>
    <h2>Welcome to MSAL.js Quickstart</h2><br />
    <h4 id="WelcomeMessage"></h4>
    <button id="SignIn" onclick="signIn()">Sign In</button><br /><br />
    <button id="btnAllLists" onclick="GetWithEndPoint()">Get All Lists</button><br /><br />
    <button id="btnListItems" onclick="GetWithEndPoint()">Get List Items</button><br /><br />
    <button id="btnListItemsAllFields" onclick="GetWithEndPoint()">Get List Items All Fields</button><br /><br />
    <pre id="json">
var config = {portalname: "yourportalname", sitename: "yoursitename", listid: "guidofalist"} var msalConfig = {auth: {clientId: "azureclientguid", полномочия: "https://login.microsoftonline.com/yourportal.onmicrosoft.com"}, кеш: {cacheLocation: "localStorage", storeAuthStateInCookie: true}}; var graphConfig = {graphMeEndpoint: "https://graph.microsoft.com/v1.0/me", spShowAllListsEp:" * https://graph.microsoft.com/v1.0/sites/" + config.portalname + ".sharepoint.com: / sites /" + config.sitename + ": / lists", spShowListItemsEp: "https://graph.microsoft.com/v1.0/sites/" + config.portalname +" .sharepoint.com: / sites / "+ config.sitename +": / lists / "+ config.listid +" / items ", spShowListItemsAllFieldsEp: "https://graph.microsoft.com/v1.0/sites/" + config.portalname +" .sharepoint.com: / sites / "+ config.sitename +": / lists / "+ config.listid +" / items? expand = fields ",};/ это можно использовать для запроса входа в систему или токена, однако в более сложных ситуациях это может иметь различные параметры var requestObj = {scopes: ["user.read"]}; var myMSALObj = new Msal.UserAgentApplication (msalConfig); // ЗарегистрироватьсяОбратные вызовы для перенаправления потока myMSALObj.handleRedirectCallbaск (authRedirectCallBack);function callMSGraph (theUrl, accessToken, callback) {var xmlHttp = new XMLHttpRequest ();xmlHttp.onreadystatechange = function () {if (this.readyState == 4 && this.status == 200) обратный вызов (JSON.parse (this.responseText));} xmlHttp.open ("GET", theUrl, true);// true для асинхронного xmlHttp.setRequestHeader («Авторизация», «Носитель» + accessToken);xmlHttp.send ();} function signIn () {myMSALObj.loginPopup (requestObj) .then (function (loginResponse) {// Успешный вход в систему showWelcomeMessage (); acquTokenPopupAndCallMSGraph ();}). catch (function (error) {console.log (error);});} function acquTokenPopupAndCallMSGraph () {// Всегда начинаем с acquTokenSilent для получения токена вошедшего в систему пользователя из кеша myMSALObj.acquireTokenSilent (requestObj) .then (function (tokenResponse) {callMSGraph (graphConfig.graphMeEndbackenAPRecICAPECACAPAPRECENKENE) token}). catch (function (error) {console.log (error); // При сбое acquTokenSilent (ТОЛЬКО из-за согласия, взаимодействия или входа в систему требуется только) // Вызов acquTokenPopup (всплывающее окно) if (requireInteraction (error.errorCode)){myMSALObj.acquireTokenPopup (requestObj) .then (function (tokenResponse) {callMSGraph (graphConfig.graphMeEndpoint, tokenResponse.accessToken, graphAPICallback);}). catch (function (error) {console.log (error);});}});} function graphAPICallback (data) {document.getElementById ("json"). innerHTML = JSON.stringify (data, null, 2);}function showWelcomeMessage () {var divWelcome = document.getElementById ('WelcomeMessage');divWelcome.innerHTML = 'Добро пожаловать' + myMSALObj.getAccount (). userName + "в Microsoft Graph API";var loginbutton = document.getElementById ('SignIn');loginbutton.innerHTML = 'Выйти';loginbutton.setAttribute ('onclick', 'signOut ();');var btn1 = document.getElementById ('btnAllLists');btn1.setAttribute ('onclick', "GetWithEndPoint ('" + graphConfig.spShowAllListsEp + "');");var btn2 = document.getElementById ('btnListItems');btn2.setAttribute ('onclick', "GetWithEndPoint ('" + graphConfig.spShowListItemsEp + "');");var btn3 = document.getElementById ('btnListItemsAllFields');btn3.setAttribute ('onclick', "GetWithEndPoint ('" + graphConfig.spShowListItemsAllFieldsEp + "');");} // Эту функцию можно удалить, если вам не требуется поддерживать функцию IE acquTokenRedirectAndCallMSGraph () {// Всегда начинать с acquTokenSilent для получения токена вошедшего в систему пользователя из кэша myMSALObj.acquireTokenSilent (requestObj) .then (функция (tokenResponse)) {callMSGraph (graphConfig.graphMeEndpoint, tokenResponse.accessToken, graphAPICallback);}). catch (function (error) {console.log (error); // При сбое acquTokenSilent (из-за согласия, взаимодействия или входа требуется ТОЛЬКО) //Вызоветь acquTokenRedirect if (requiredInteraction (error.errorCode)) {myMSALObj.acquireTokenRedirect (requestObj);}});} function authRedirectCallBack (ошибка, ответ) {if (ошибка) {console.log (ошибка);} else {if (response.tokenType === "access_token") {callMSGraph (graphConfig.graphEndpoint, response.accessToken, graphAPICallback);} else {console.log ("тип токена:" + response.tokenType);}}} Функция requireInteraction (errorCode) {if (! errorCode ||! errorCode.length) {return false;} return errorCode === "accept_required" ||errorCode === "взаимодействие_required" ||errorCode === "login_required";} function signOut () {myMSALObj.logout ();} // Проверка переменных в браузере var ua = window.navigator.userAgent;var msie = ua.indexOf ('MSIE');var msie11 = ua.indexOf ('Trident /');var msedge = ua.indexOf ('Edge /');var isIE = msie> 0 ||msie11> 0;var isEdge = msedge> 0;// Если вы поддерживаете IE, мы рекомендуем вам войти в систему с помощью API перенаправления // Если вы, как разработчик, тестируете в режиме Edge InPrivate, добавьте «isEdge» к проверке if //, чтобы изменить это на опыт по умолчаниюиспользовать внешний браузер var loginType = isIE?«REDIRECT»: «POPUP»;if (loginType === 'POPUP') {if (myMSALObj.getAccount ()) {// избежать дублирования кода при загрузке страницы в случае iframe и всплывающего окна.showWelcomeMessage ();acquireTokenPopupAndCallMSGraph ();}} else if (loginType === 'REDIRECT') {document.getElementById ("SignIn"). onclick = function () {myMSALObj.loginRedirect (requestObj);};if (myMSALObj.getAccount () &&! myMSALObj.isCallback (window.location.hash)) {// избежать дублирования кода при загрузке страницы в случае iframe и всплывающего окна.showWelcomeMessage ();acquireTokenRedirectAndCallMSGraph ();}} else {console.error ('Пожалуйста, укажите правильный тип входа в систему');} function GetWithEndPoint (endpointString) { myMSALObj.acquireTokenSilent (requestObj) .then (function (tokenResponse) { callMSGraph (endpointString, tokenResponse.accessToken, graphAPICallback); }). catch (function (error) { console.log (ошибка); if (requiredInteraction (error.errorCode)) { myMSALObj.acquireTokenPopup (requestObj) .then (function (tokenResponse) { callMSGraph (endpointString, tokenResponse.accessToken, graphAPICallback); }). catch (function (error) { console.log (ошибка); }); } }); }

Нажатие любой кнопки, которая возвращает элементы списка, приводит к появлению этого сообщения, которое, как я понимаю, означает разрешение.

    {
      "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(microsoft.graph.list)('myid')/items",
      "value": []
    }

Я ожидаю, что я получу те же результаты в Graph Explorer. Но это означает, что у меня нет разрешения. Я пробовал несколько разных списков, и результаты всегда одинаковы. Я могу получить список всех списков. Но попытка получить элементы из списка не удалась.

Разве мы не можем использовать Graph API с JS для получения элементов списка?

Вот делегированные разрешения Azure от Azure, которые, как мне кажется, должны быть всем, что мне нужно для получения элементов списка. azure site permissions azure file permissions

1 Ответ

1 голос
/ 26 мая 2019

Но это означает, что у меня нет разрешения

Это верно, пустые результаты обычно указывают на то, что одно из следующих разрешений (делегированные разрешения в вашем случае) отсутствует для Get Items конечная точка :

  • Sites.Read.All - читать элементы во всех семействах сайтов
  • Sites.ReadWrite.All - редактировать или удалять элементы во всех семействах сайтов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...