angular2 обновить токен через сервис

В моем проекте бэкэнд выставил обновить токен API. При входе в систему вы получаете действительный токен и обновляете токен. Когда срок действия токена истекает, необходимо выполнить вызов обновления, авторизованный со старым токеном с истекшим сроком действия и токеном обновления параметра. Ответ возвращает новый действительный токен и новый токен обновления. На данный момент я пытаюсь реализовать это в моей авторизации. Это код:

 import { Injectable } from '@angular/core';
 import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot }     from '@angular/router';
 import { Observable } from 'rxjs/Rx';

 import { SessionService } from '../services/session.service';

@Injectable()
export class AuthorizationGuard implements CanActivate {

constructor(private sessionService: SessionService, private router: Router) { }

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> {
    if (this.sessionService.isAuthenticated() ) {
        console.log('guard has cookies');
        return true;
    } else {
        if(this.sessionService.checkStorageSession() == null) {
            this.router.navigate(['/']);
        } else {
            console.log('guard will refresh token via refresh token call  ');
            this.sessionService.refreshToken()
                .subscribe(
                    data => {
                        console.log('guard  refresh success');
                        this.sessionService.destroySessionCookie();
                        this.sessionService.rememberUser(data.accessToken);
                        this.sessionService.rememberRefreshTocken(data.refreshToken);
                        this.sessionService.setSessionCookie(data.accessToken);
                        this.sessionService.setRefreshTocken(data.refreshToken);
                        return true;
                    },
                    error => {
                        console.log('session refresh fail: ' + error);
                        this.router.navigate(['/']);
                        return false;
                    }
            );
        }
    }
}

}

Но проблема в том, что canActivate вызывает, звонок запускается, обновляет токен, но я получаю 403 несанкционированных от других вызовов, которые находятся на активированной странице, до успешного ответа от обновления. Также я не могу понять, как обновить токен, когда я стою на странице с кнопкой "Сохранить", токен истекает, я нажимаю "Сохранить" и выполняется вызов обновления, но с токеном с истекшим сроком действия. Пожалуйста, предложите подходы:s

1 ответ

Решение

Я использовал этот подход, в AuthorizationGuard у вас есть проверка:

if(!this.sessionService.isUserAuthenticated){
  this.router.navigate(['/']);
}

Где isAuthenticated=true означает, что пользователь имеет действительный refreshToken. И я переопределил службу http, чтобы иметь логику обновления токенов:

var authenticatedCall: Observable<any>;
      if (needToken) {
          if (this.sessionService.isUserAuthenticated) {
               authenticatedCall = this.sessionService.acquireToken()
               .flatMap((token: string) => {
                         if (options1.headers == null) {
                           options1.headers = new Headers();
                         }
                            options1.headers.append('Authorization', 'Bearer ' + token);
                            return this.http.request(url, options1);
                     });
                }
                else {
                    authenticatedCall = Observable.throw(new Error("User Not Authenticated."));
                }
        }
        else {            
            authenticatedCall = this.http.request(url, options).map(this.extractData);
 }

В качестве примера я использовал это: https://github.com/sureshchahal/angular2-adal/blob/master/src/services/authHttp.service.ts

Другие вопросы по тегам