2014-05-19 3 views
2

Я создаю простое приложение AngularJS, которое использует Alfresco как back-end поверх предоставленного REST API.

Во-первых, аутентификация выполняется через соответствующую службу, которая возвращает токен (alf_ticket), и этот токен должен быть отправлен в качестве параметра URL в последующих запросах после успешной аутентификации.

Насколько мне известно, API REST Alfresco не поддерживает получение токена в составе HTTP-заголовков; это был бы лучший вариант, поскольку, поскольку было бы просто решить проблему, настроив, например, $ http defaults, просто упомянуть о некоторых вариантах, о которых я могу думать.

В этом случае, я боюсь, что я могу отправить только alf_ticket маркер в каждом запросе к фоновым в качестве параметра, например:

GET /alfresco/s/api/people/admin/preferences?alf_ticket=TICKET_f79aa9eb2f839cefd1e1c7e4f579379ec06c33ed 

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

До сих пор я думал о следующих подходах:

  1. Использование параметризованной URL-адреса для каждого экземпляра $ ресурса (например /alfresco/s/api/people/admin/preferences:alf_ticket); затем подайте через parameterDefault соответствующую функцию, которая получает токен из текущих данных сеанса.
  2. Нечто похожее на подход, описанный в this blog post, первоначально вдохновленный этим другим Stackoverflow question. Но я считаю, это немного навязчивым, так что, вероятно, я бы с вариантом 1.

В идеале я бы искал глобальную конфигурацию для $resource или $http, подобно тому, как вы можете настроить заголовки по умолчанию ($httpProvider.defaults.headers), но я боюсь, что такая функциональность не предоставляется ни одной из служб ...

ответ

9

Используйте перехватчик $ http.

Создать фабричную функцию, которая перестраивает запрос на любой URL, добавив маркер аутентификации к параметрам, только если он установлен:

app.factory('httpRequestInterceptor', function (Auth) { 
    return { 
    request: function (config) { 
     if (Auth.token) { 
     config.url = URI(config.url).addSearch({'_auth_token':Auth.token}).toString(); 
     } 
     return config; 
    } 
    }; 
}) 

(Обратите внимание, что я использую URI.js добавить параметры, так как я узорной мой ответ после this blog post, где автор использует его, а)

Pass $httpProvider в свой config блок и нажмите на строку имени вашей службы перехватчика в его interceptor массива:

.config(function ($httpProvider) { 
    $httpProvider.interceptors.push('httpRequestInterceptor'); 
}) 

Любые $http запросы (в том числе завернутые $resource) будут перехвачены и изменены, если необходимо, до того, как браузер их выполнит.

Plunker Demo

+0

Отличный ответ, который выглядит более чем подходящим решением. Благодарю. –

Смежные вопросы