Перейти к публикации
  • Сейчас на странице   Всего пользователей: 0   (0 пользователей, 0 гостей)

Rooster

Программирование, т. 7

  

536 пользователей проголосовало

У вас нет прав на голосование в этом опросе, или на просмотр результатов опроса. Пожалуйста, войдите или зарегистрируйтесь для голосования в опросе.

Рекомендованные сообщения

(изменено)

Сделал вот так (аж обосрался со своего говнокодинга):

//Перед созданием компоненты AuthPopup регаю интерсептор
beforeCreate() {
      let _this = this;
      Vue.http.interceptors.push(function (request, next) {
        if (AuthService.isAuth()) {
          request.headers.set('authorization', AuthService.isAuth());
        }
        next(function (response) {
          if ([403, 401].includes(response.status)) {
            return Promise.resolve(new Promise(resolve => {
              //Вот это чую говнокодище, ибо резолв запоминаю во внутренний стейт компоненты,
              //но справедливости ради, она единственная на странице
              _this.resolve = resolve;
              _this.showPopup = true;
              
              //По факту этот промис НЕ делает resolve или reject и эта хуйня работает, хотя я думал что всё нахуй наебнётся
            }).then(() => {
              return Vue.http(request)
            }));
          }
        });
      });
    }

А потом когда вызов логин попапа произошёл, я ввёл юзера и пароль, нажал кнопку Login, срабатывает вот эта хуйня:

//Это мой сервис, внутри просто пуляется на /api/v1/login реквест и функция () в success кейсе отрабатывает
AuthService.login(user, () => {
  _this.showPopup = false;
  if(_this.resolve){
    //И вот тут срабатывает ёбаное волшебство
    //Резолвится промис, который продолжает цепочку, на которой был обрыв. 
    //В жизни не думал что это сработает, ибо последние мои знания JS застряли на уровне 2012 года
    _this.resolve();
    _this.resolve = null;
  }
  _this.$emit('login');
})

Изменено пользователем DIMAN123456789
Hed-kun понравилось это

Поделиться сообщением


Ссылка на сообщение

И они еще говорят что ангуляр хуйня, при этом педалят на промисах  :avtorklif:


Я не человек, Я - Кантона. (с)

Miraxes#2986

753357.png

Поделиться сообщением


Ссылка на сообщение
(изменено)

И они еще говорят что ангуляр хуйня, при этом педалят на промисах  :avtorklif:

Как тебе ангуляр бы помог в решении этой задачи? Тут даже не в vue дело, задача будет решаться похожим образом на любом фреймвёрке. Замени Vue.http.interceptors.push на интерсептор в Angular-е, получишь что-то типа:

 

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

  constructor(public auth: AuthService, public login: LoginService) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (AuthService.isAuth()) {
       request.setHeaders({
          Authorization: AuthService.isAuth()
      });
    }
    //И тут у тебя будет тот же самый, блять, код...
  }
}

Ради интереса попробовал загуглить, решали ли такую задачу на ангуляре, там, блять, такие поносные решения через rxJs с ретраями и wait() :lolpalm: Не, если ты покажешь хорошее решение, я с удовольствием на него посмотрю, ибо я ща накачиваюсь полезной инфой из мира JS с удовольствием :buba:

 

Адд: справедливости ради, rxJx есть и под vue обёртка, так что всякие сабжекты, обсерваблы и сабскрипшены можно и на него навернуть.


Изменено пользователем DIMAN123456789

Поделиться сообщением


Ссылка на сообщение

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


Я не человек, Я - Кантона. (с)

Miraxes#2986

753357.png

Поделиться сообщением


Ссылка на сообщение
(изменено)

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

Куда повесить? На все get/post/put/delete запросы в системе? Ну вот как бы ты решал эту задачку, распиши. Я ж деревянный в клиентской архитектуре, мало опыта. Я подумал, что выгоднее всего сделать single point of truth и обрабатывать все разлогины в одном месте, чтобы никогда не забыть про этот кейс нигде. Я рли не понимаю, как эту задачу можно решить лучше в терминах фронтэнда. Просто на джавке регаешь web-filter с минимальным ордером, он смотрит залогинен пользователь или нет, если чо стреляет AuthenticationException/NoPermissionException, который отлавливается хэндлингом и он возвращает респонз с 403/401 ошибкой и в зависимости от контент тайпа запроса либо html, может json вернуть и т.д.


Изменено пользователем DIMAN123456789

Поделиться сообщением


Ссылка на сообщение

ну как ты и написал, надо делать как в кровавом энтерпрайзе, то есть нормально, ловить эту хуйню на точке обработки любых запросов


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение
(изменено)

Ну ты в интерсепторе создаешь какой-то сабжект типа userTokenExpired$, ебенишь его с помощью userTokenExpired$.next(true) (вот сюда можно ебануть рефреш токен если надо, не ебу как у тебя это работает) , на ебучей странице где ты хочешь юзера релогинить делаешь userTokenExpired$.subscribe(hueta => { релогин тут ебенишь })

 

Если тебе везде и всегда надо ебашить повторный запрос на токен, то еще проще --- выносишь эту ебалу в отдельный сервис и он у тебя ждет 401/403 и делает запрос еще один, все.


Изменено пользователем Cantona.Eric

Я не человек, Я - Кантона. (с)

Miraxes#2986

753357.png

Поделиться сообщением


Ссылка на сообщение
(изменено)

Ну ты в интерсепторе создаешь какой-то сабжект типа userTokenExpired$, ебенишь его с помощью userTokenExpired$.next(true) (вот сюда можно ебануть рефреш токен если надо, не ебу как у тебя это работает) , на ебучей странице где ты хочешь юзера релогинить делаешь userTokenExpired$.subscribe(hueta => { релогин тут ебенишь })

 

Если тебе везде и всегда надо ебашить повторный запрос на токен, то еще проще --- выносишь эту ебалу в отдельный сервис и он у тебя ждет 401/403 и делает запрос еще один, все.

Ты же понимаешь, что я не хочу об этом думать? Чтобы на каждой новой странице добавлять поносную проверку. Причём дело то не только в страницах. Я могу попасть на страницу, словить разлогин, сделать фильтрацию в табличке или сортировку или пагинацию и у меня должно произойти открытие попапа для релогина пользователя, а не должен он смотреть каменными глазами, почему ничего не происходит, а кнопочки тыкаются. Я полностью изолировал логику внутри одной компоненты.

 

Условно хоть ща могу запаблишить на гитхаб и люди смогу использовать в своём проекте, ничего, нигде не меняя и не вставляя. Нужно чуть допилить передачу рестов для логина и список параметров/галочек (типа "запомнить меня" и прочее).


Изменено пользователем DIMAN123456789

Поделиться сообщением


Ссылка на сообщение

 

Ну ты в интерсепторе создаешь какой-то сабжект типа userTokenExpired$, ебенишь его с помощью userTokenExpired$.next(true) (вот сюда можно ебануть рефреш токен если надо, не ебу как у тебя это работает) , на ебучей странице где ты хочешь юзера релогинить делаешь userTokenExpired$.subscribe(hueta => { релогин тут ебенишь })

 

Если тебе везде и всегда надо ебашить повторный запрос на токен, то еще проще --- выносишь эту ебалу в отдельный сервис и он у тебя ждет 401/403 и делает запрос еще один, все.

Ты же понимаешь, что я не хочу об этом думать? Чтобы на каждой новой странице добавлять поносную проверку. Причём дело то не только в страницах. Я могу попасть на страницу, словить разлогин, сделать фильтрацию в табличке или сортировку или пагинацию и у меня должно произойти открытие попапа для релогина пользователя, а не должен он смотреть каменными глазами, почему ничего не происходит, а кнопочки тыкаются. Я полностью изолировал логику внутри одной компоненты. Условно хоть ща могу запаблишить на гитхаб и люди смогу использовать в своём проекте, чуть допилить передачу рестов для логина и список параметров/галочек (типа запомнить и прочее).

 


Я не человек, Я - Кантона. (с)

Miraxes#2986

753357.png

Поделиться сообщением


Ссылка на сообщение
(изменено)

 

 

Ну ты в интерсепторе создаешь какой-то сабжект типа userTokenExpired$, ебенишь его с помощью userTokenExpired$.next(true) (вот сюда можно ебануть рефреш токен если надо, не ебу как у тебя это работает) , на ебучей странице где ты хочешь юзера релогинить делаешь userTokenExpired$.subscribe(hueta => { релогин тут ебенишь })

 

Если тебе везде и всегда надо ебашить повторный запрос на токен, то еще проще --- выносишь эту ебалу в отдельный сервис и он у тебя ждет 401/403 и делает запрос еще один, все.

Ты же понимаешь, что я не хочу об этом думать? Чтобы на каждой новой странице добавлять поносную проверку. Причём дело то не только в страницах. Я могу попасть на страницу, словить разлогин, сделать фильтрацию в табличке или сортировку или пагинацию и у меня должно произойти открытие попапа для релогина пользователя, а не должен он смотреть каменными глазами, почему ничего не происходит, а кнопочки тыкаются. Я полностью изолировал логику внутри одной компоненты. Условно хоть ща могу запаблишить на гитхаб и люди смогу использовать в своём проекте, чуть допилить передачу рестов для логина и список параметров/галочек (типа запомнить и прочее).

 

 

С повторным токеном работает, пока прошлый токен жив. Если токен протух, то ты сосёшь писос. Проблема в том, что по сути у тебя попап, это асинхронная ебала, которая ждёт действия от пользователя, а рефреш токена можно изолировать внутри next() не выходя наружу.

 

Ладно, забей. Возможно я не понимаю о чём ты говоришь, потому что не хватает знаний.


Изменено пользователем DIMAN123456789

Поделиться сообщением


Ссылка на сообщение

Диман, у Вас же вроде большая контора очень, не с кем проконсультироваться/попросить запилить?


Ну и кто теперь самый умный?

Поделиться сообщением


Ссылка на сообщение

да у него в конторе директор на директоре и директором погоняет

Поделиться сообщением


Ссылка на сообщение

Диман, у Вас же вроде большая контора очень, не с кем проконсультироваться/попросить запилить?

Это не связано с основной работой :trollface:

Поделиться сообщением


Ссылка на сообщение

 

Диман, у Вас же вроде большая контора очень, не с кем проконсультироваться/попросить запилить?

Это не связано с основной работой :trollface:

 

Даже если так, какая разница.


Ну и кто теперь самый умный?

Поделиться сообщением


Ссылка на сообщение

Не надо писать писать какую-то логику в интерцепторах. Просто потому, что ты будешь при каждом вызове vue.http, ты будешь каждый раз вызывать функцию интерцептора. Даже внутри твоего интерцептора. Что случится, если запрос на реферш токена внутри интерцептора вернет ошибку, смекаешь? Тебе нужно следить сколько раз вызвана эта функция рефреша что бы не послать случайно тонну запросов. Плюс, ты пытаешься зарегать интерцептор во время создания компонета, это что вообще такое, как компонет логина логически связан с интерцептором, который ты лепишь туда?  Тебе уже посоветовали выше юзать аксиос и вынести всю логику работы с бекендом в отдельный сервис который будет следить за этим и корректно обрабатывать такие ситуации и уже его дергать из логин сервиса и всех остальных сервисов что ты юзаешь. Ты пытаешься наебенить костыль, рили. 

Поделиться сообщением


Ссылка на сообщение
(изменено)

Не надо писать писать какую-то логику в интерцепторах. Просто потому, что ты будешь при каждом вызове vue.http, ты будешь каждый раз вызывать функцию интерцептора. Даже внутри твоего интерцептора. Что случится, если запрос на реферш токена внутри интерцептора вернет ошибку, смекаешь? Тебе нужно следить сколько раз вызвана эта функция рефреша что бы не послать случайно тонну запросов. Плюс, ты пытаешься зарегать интерцептор во время создания компонета, это что вообще такое, как компонет логина логически связан с интерцептором, который ты лепишь туда?  Тебе уже посоветовали выше юзать аксиос и вынести всю логику работы с бекендом в отдельный сервис который будет следить за этим и корректно обрабатывать такие ситуации и уже его дергать из логин сервиса и всех остальных сервисов что ты юзаешь. Ты пытаешься наебенить костыль, рили. 

Да это я офк перепишу. Вынесу всё как надо, я про сам подход с промисами и отложенными resolve, в голове как-то так это должно быть:

post-33804-0-36624600-1510824325_thumb.png

В целом у меня и так вся логика общения с бэком через отдельные сервисы, во вьюхах нет никаких обращений в бэк. Для тестов просто сделал, чтобы удобнее было стаббировать. Правда самих тестов ещё нет :trollface:


Изменено пользователем DIMAN123456789

Поделиться сообщением


Ссылка на сообщение

Пиздос, вот это адовый говнокод конечно

Es6 чтоли не завезли? От let _this = this; в 2017 чуть глаза не вытекли  :palevo: 


Бля пиздос посмотрел на второй кусок кода, у меня чуть мозг не взорвался  :palevo:  :palevo:  :palevo:  :palevo:  :palevo:  :palevo:  :palevo:  :palevo:

Hed-kun понравилось это

userbar-53933.png

http://codepen.io/suez/ - they see me bydlocoding, they hatin.

Поделиться сообщением


Ссылка на сообщение
(изменено)

Пиздос, вот это адовый говнокод конечно

Es6 чтоли не завезли? От let _this = this; в 2017 чуть глаза не вытекли  :palevo: 

Бля пиздос посмотрел на второй кусок кода, у меня чуть мозг не взорвался  :palevo:  :palevo:  :palevo:  :palevo:  :palevo:  :palevo:  :palevo:  :palevo:

Ну, блять, эт тебе не формочки на реакте шлёпать, а серьёзный бизнес-кейс :buba:

 

На деле я так и не услышал внятного ответа как верно сделать, кроме как от @@aftermth, но у него скорее к архитектуре вопрос, а не к самому решению.


Изменено пользователем DIMAN123456789

Поделиться сообщением


Ссылка на сообщение

 

Не надо писать писать какую-то логику в интерцепторах. Просто потому, что ты будешь при каждом вызове vue.http, ты будешь каждый раз вызывать функцию интерцептора. Даже внутри твоего интерцептора. Что случится, если запрос на реферш токена внутри интерцептора вернет ошибку, смекаешь? Тебе нужно следить сколько раз вызвана эта функция рефреша что бы не послать случайно тонну запросов. Плюс, ты пытаешься зарегать интерцептор во время создания компонета, это что вообще такое, как компонет логина логически связан с интерцептором, который ты лепишь туда?  Тебе уже посоветовали выше юзать аксиос и вынести всю логику работы с бекендом в отдельный сервис который будет следить за этим и корректно обрабатывать такие ситуации и уже его дергать из логин сервиса и всех остальных сервисов что ты юзаешь. Ты пытаешься наебенить костыль, рили. 

Да это я офк перепишу. Вынесу всё как надо, я про сам подход с промисами и отложенными resolve, в голове как-то так это должно быть:

attachicon.gifapp.png

В целом у меня и так вся логика общения с бэком через отдельные сервисы, во вьюхах нет никаких обращений в бэк. Для тестов просто сделал, чтобы удобнее было стаббировать. Правда самих тестов ещё нет :trollface:

 

А как ты узнаешь из компонента логина, что юзер заново получил токен и можно повторить реквест?

Поделиться сообщением


Ссылка на сообщение

 

 

Не надо писать писать какую-то логику в интерцепторах. Просто потому, что ты будешь при каждом вызове vue.http, ты будешь каждый раз вызывать функцию интерцептора. Даже внутри твоего интерцептора. Что случится, если запрос на реферш токена внутри интерцептора вернет ошибку, смекаешь? Тебе нужно следить сколько раз вызвана эта функция рефреша что бы не послать случайно тонну запросов. Плюс, ты пытаешься зарегать интерцептор во время создания компонета, это что вообще такое, как компонет логина логически связан с интерцептором, который ты лепишь туда?  Тебе уже посоветовали выше юзать аксиос и вынести всю логику работы с бекендом в отдельный сервис который будет следить за этим и корректно обрабатывать такие ситуации и уже его дергать из логин сервиса и всех остальных сервисов что ты юзаешь. Ты пытаешься наебенить костыль, рили. 

Да это я офк перепишу. Вынесу всё как надо, я про сам подход с промисами и отложенными resolve, в голове как-то так это должно быть:

attachicon.gifapp.png

В целом у меня и так вся логика общения с бэком через отдельные сервисы, во вьюхах нет никаких обращений в бэк. Для тестов просто сделал, чтобы удобнее было стаббировать. Правда самих тестов ещё нет :trollface:

 

А как ты узнаешь из компонента логина, что юзер заново получил токен и можно повторить реквест?

 

Так я вызываю resolve() после того, как пришёл респонз с сервера об успешном логине. Метод AuthService.login(...) выполняет авторизацию и в саксесс колбеке вызывается resolve() из интерсептора. Условно если пользователь проебался с логином или ушёл со страницы, то ничо не произойдёт.

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...