2014-12-03 3 views
0

У меня проблема в моем AngularJS, и я не могу найти легкое решение из нее. Я использую две службы для авторизации пользователя с сервером. Авторизация основана на двух токенах: токена доступа и токена обновления.Угловая инъекционная петля

Теперь у меня есть одна служба (Auth), которая заботится обо всем процессе авторизации и второй службе (Api), которая заботится о связи с сервером.

Способ авторизации заключается в том, что пользователь обращается к данным с помощью своего токена доступа. После того, как токен будет недействителен, он попытается отправить токен обновления и, надеюсь, вернет новый токен доступа.

Проблема в том, что если сервер отвечает 401, а токен недействителен, я хочу просто запустить Auth.authenticate(); на фоне (без переадресаций или чего-то еще), и при успешном продолжении использования нового токена доступа.

К сожалению, поскольку служба Auth использует сервис Api, я не могу добавить службу Auth обратно в службу Api. Есть ли хороший способ сделать то, что я хочу делать с одного глобального места (так что мне не нужно вызывать повторную авторизацию после каждого запроса в контроллере)?

Некоторые архитектурные информация:

Auth Service (injects Api Service) 
| ---- authorisation function (uses Api Service) 

Api Service 
| ---- Different functions to prepare data for request 
| ---- One function to send all requests 
| ---- One function to handle all rejected promisses which includes detection of 401 and should include "silent" re-authorisation (AuthService.authorisation) 

Я действительно надеюсь, что оно не звучит слишком запутанной. Я пробовал перехватчики, но результат тот же - петля инжектора.

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

Спасибо!

ответ

1

У меня была аналогичная проблема, также с моей авторизацией.

Иногда реорганизация является лучшим решением, но я думаю, что в этом случае у вас есть хороший вариант использования для того, чтобы вы могли использовать «циркулярный» доступ, который вы описываете.

Попробуйте следующее:

  1. Вводят $injector в свой API службы вместо вашей службы Авт.
  2. Пользователь $injector.get('AuthService'), чтобы получить экземпляр службы Auth.
+0

Красивая! это именно то, что мне нужно – Tom

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