0

У меня есть угловая фабрика под названием currentUser для хранения информации о пользователе при входе в мое приложение (включая токен аутентификации). Этот завод вводится в множество контроллеров, и в этих случаях у меня нет проблем при использовании currentUser.getProfile(). Token.

У меня также есть разные фабрики, каждый из которых возвращает объект $ resource для создания вызовов API. На этих фабриках я добавляю currentUser, чтобы я мог добавить токен аутентификации в заголовки запроса. Вот упрощенный пример одного из этих заводов:.

angular 
    .module("common.services") 
    .factory("userAccount", 
      ["$resource", 
      "appSettings", 
      "currentUser", 
      userAccount]) 

function userAccount($resource, appSettings, currentUser) { 
    return { 
     logout: $resource(appSettings.serverPath + "/api/Account/Logout", null, 
      { 
       'logoutUser': { 
        method: 'POST', 
        headers: { 
         'Authorization': 'Bearer ' + currentUser.getProfile().token 
        } 
       } 
      }) 
    } 
} 

Однако currentUser.getProfile() маркер всегда пуст, и я получаю unathorised ошибки, даже если при входе значения в одном моих контроллерах оно не пусто. Что может быть причиной этого?

Edit:. Проблема, кажется, не просто быть с CurrentUser завода, а когда я заменяю currentUser.getProfile() маркер с localStorage.getItem («маркеров») Я, кажется, есть та же самая проблема. Контроллер будет правильно регистрировать локально сохраненный токен, но он не будет добавлен в заголовки запросов API.

ответ

3

Вам нужна logout, чтобы быть функцией, которая возвращает $resource.

Образом, у вас теперь вызов currentUser.getProfile() делается как только служба инициализации, которая, вероятно, прежде чем пользователь даже бревен в

function userAccount($resource, appSettings, currentUser) { 
    return { 
    logout: function() { 
     return $resource(appSettings.serverPath + "/api/Account/Logout", null, { 
     'logoutUser': { 
      method: 'POST', 
      headers: { 
      'Authorization': 'Bearer ' + currentUser.getProfile().token 
      } 
     } 
     }) 
    } 
    } 
} 

Теперь вызова, чтобы получить маркер не будет сделано до тех пор, пока вы не позвоните userAccount.logout()

+0

Спасибо за ответ, похоже, сейчас! – shadowsora

+0

Вы также можете посмотреть, как работают httpInterceptors – charlietfl

0

Не совсем исправление, но, похоже, несколько обходных решений. Один я решил использовать, чтобы добавить маркер аутентификации в качестве общего заголовка HTTP, как это:

$http.defaults.headers.common['Authorization'] = 'Bearer ' + data.access_token; 

Блог пост об этом здесь: http://blog.brunoscopelliti.com/authentication-to-a-restful-web-service-in-an-angularjs-web-app/

Я все еще будет интересно, если кто-то знал, что я раньше делал неправильно?