CAML-запрос к Sharepoint REST API приводит к недопустимому URI аудитории?

Некоторое время мы успешно использовали Sharepoint REST API для извлечения элементов из списков, но совсем недавно решили интегрировать ADAL.JS, чтобы иметь доступ к другим API Microsoft, таким как Graph, Azure AD и т. Д.

После успешной аутентификации Adal.js автоматически добавляет

Authorization: Bearer eyJ.. для вызовов REST, который отлично работает после небольшого изменения разрешений. Приложение представляет собой Angular SPA, размещенное в Sharepoint, поэтому этот заголовок не нужен, но на самом деле не имеет значения.

ОДНАКО, некоторые из наших вызовов REST требуют, чтобы мы также запросили таксономию, и поскольку это не поддерживается в обычном API REST Sharepoint, мы должны нажать (/ _api / web / lists / GetByTitle ('ListName') / GetItems) с CAML-запросом в качестве полезной нагрузки, т.е. https://mydomain.sharepoint.com/sites/dev/_api/web/lists/GetByTitle('News')/GetItems К сожалению, это не работает, поскольку API просто возвращает Invalid audience Uri '5exx5cef-x7xx-4xxx-axxx-4xxxx2e40'.. Пока что мое единственное решение - изменить фактическую библиотеку Adal.JS, чтобы удалить этот заголовок для эта конкретная конечная точка.

Итак, мои вопросы: выполнял ли кто-нибудь CAML-запросы к API-интерфейсам Sharepoint REST с использованием Adal.JS или сталкивался с аналогичной проблемой и может предоставить какое-либо представление?

Я подозреваю, что это проблема конфигурации, но не знаю, что делать.


person Jonas Eriksson    schedule 23.03.2016    source источник


Ответы (1)


В этом случае вам необходимо принудительно установить для конечной точки https://mydomain.sharepoint.com значение null. В противном случае каждый запрос к mydomain.sharepoint.com будет добавлять заголовок авторизации графа, который проверяется сервером SharePoint. Поскольку приложение зарегистрировано в Azure AD, а не в SharePoint, оно будет считаться недействительной аудиторией.

Вот обходной путь для вашей справки, сообщите мне, работает ли он на вашей стороне.

(function () {
  angular.module('app', [
    'ngRoute',
    'AdalAngular'
  ]).config(config);

  // Configure the routes.
    function config($routeProvider, $httpProvider, adalAuthenticationServiceProvider) {
        $routeProvider
            .when('/', {
                templateUrl: 'views/main.html',
                controller: 'MainController',
                controllerAs: 'main'
            })

            .otherwise({
                redirectTo: '/'
            });

        // Initialize the ADAL provider with your clientID (found in the Azure Management Portal) and the API URL (to enable CORS requests).
        adalAuthenticationServiceProvider.init(
            {
                clientId: clientId,
                // The endpoints here are resources for ADAL to get tokens for.
                endpoints: {
                    'https://graph.microsoft.com': 'https://graph.microsoft.com',
                    'https://mydomain.sharepoint.com': null
                }
            },
            $httpProvider
            );
    };
})();
person Jeffrey Chen    schedule 25.03.2016
comment
Джеффри, спасибо за ответ. К сожалению, это не ответ на мой вопрос. Запросы списков SP и Graph работают нормально. Проблема в том, что я не могу попасть в конечную точку / GetItems с помощью CAML-запроса, который необходим также для запроса таксономии Sharepoint (это невозможно с обычными конечными точками). Итак, ADAL и CAML-запросы, есть предложения? - person Jonas Eriksson; 29.03.2016
comment
@Jonas, в этом случае вам необходимо установить для конечной точки mydomain.sharepoint.com значение null, я обновил свой ответ. - person Jeffrey Chen; 29.03.2016
comment
Ближе! Это удалило заголовок авторизации из других моих запросов SP (круто, нигде не мог найти, как это сделать). Тем не менее, он все еще добавляет его в конечную точку / GetItems, но не могу понять, почему, это запрос POST? Здесь работает удаление заголовка авторизации вручную. Пример работы после вашего комментария (без авторизации): my-own-domain.sharepoint.com/sites/dev/_api/web/lists/ Не работает (заголовок авторизации по-прежнему, ошибка в OP): мой-собственный-домен. sharepoint.com/sites/dev/_api/web/lists/ - person Jonas Eriksson; 29.03.2016
comment
@Jonas, при вызове служб '/ GetItems' попробуйте использовать mydomain.sharepoint.com/sites / dev / api, если использовать '/ GetItems' без имени хоста, он не будет соответствовать конечной точке в config. - person Jeffrey Chen; 29.03.2016
comment
Потрясающе, потрясающе круто. Вы решили это за меня. Поскольку я запрашивал дочерний сайт (я думаю, это слово), мне также пришлось добавить относительный URL-адрес "/sites/dev/": null в качестве новой конечной точки, и вуаля, работает! Спасибо за нулевую часть и любую другую помощь! Вы сделали мою жизнь намного лучше, спасибо! Обозначение как ответ. : D - person Jonas Eriksson; 29.03.2016