вызов API в CanAcitvate - угловой - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь работать с охранниками Auth в угловых. У меня есть httpcall, который устанавливает значение true / false на основе ответа от HTTP-вызова. Проблемы заключаются в следующем: 1) httpClients возвращает наблюдаемое 2) подписка httpClient должна произойти до вызова метода Authorized, таким образом hasSessionFlag уже установлен.

ДВОЙНОЙ СЕРВИС .TS

hasSession() {
    return this.http.get<{}>('API CALL', {
      withCredentials: true,
      observe: 'response'
    }).subscribe((res=>{
      if(res.status === 200) {
        this.hasSessionFlag = true;
      } else {
        this.hasSessionFlag = false
      }
    }));
  }

//Check if all the logical conditions of the user sessions pass*
  isAuthorized(): boolean {
      if (this.hasSessionFlag) {
        this.authService.login();
      } else {
        this.dualLoginRedirect();
      }
  }

  canActivate(): boolean {
    return this.isAuthorized();
  }

ROUTER.TS

   {
      canActivate: [DualLogonService],
      path: 'test',
      component: TestPageComponent
    }

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Что касается вашего последнего кода, я думаю, это то, что вы хотите сделать:

Если API возвращает статус 200, тогда вы хотите вызвать "this.authService.login();", иначе "this.dualLoginRedirect();"

[Согласно вашему коду на момент написания этого ответа - ваш метод isAuthorized() не возвращает логическое значение, а возвращает неопределенное.Он должен возвращать логическое или наблюдаемое логическое или обещание.Я предполагаю, что в случае статуса 200, он вернет true в противном случае он вернет false].При таком допущении вы можете использовать только метод canActive(), подобный следующему:

canActive(): Observable<boolean> {
    return this.http.get<{}>('API CALL', {
              withCredentials: true,
              observe: 'response'
            })
            .pipe(
              map(res => {
                if(res.status === 200) {
                  //OR DO here whaterevr you want to do
                  this.authService.login();
                  //return true will render the associated component
                  //i.e. pass the guard
                  return true;
                } else {
                  this.dualLoginRedirect();
                  //return false will fail the guard.
                  return false;
                }
              })
            );
  }

Ваша служба охраны автоматически подпишет на возвращаемую наблюдаемую метод canActivate().

Также обратите внимание, что в этом подходе нет членов класса, которые объявлены.Хотя, если это нужно вашим охранникам, просто объявите их и используйте в соответствии с вашими требованиями.

1 голос
/ 25 июня 2019

Вместо подписки на ваш http-вызов, вы можете нажать и установить значение для hasSessionFlag .... так сделайте это ..

hasSession() {
    return this.http.get<{}>('API CALL', {
      withCredentials: true,
      observe: 'response'
    }).pipe(
      tap(res=>{
      if(res.status === 200) {
        this.hasSessionFlag = true;
      } else {
        this.hasSessionFlag = false
      }
    }))
  .switchMap(res=>{
      if(this.hasSessionFlag)return this.authService.login();
      else return this.dualLoginRedirect();
}));
  }

isAuthorized(): boolean {
      if (this.hasSessionFlag) {
        this.authService.login();
      } else {
        this.dualLoginRedirect();
      }
  }

при условии, что ваши authService.login () и dualLoginRedirect () являются наблюдаемыми

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...