0

В моем проекте бэкэнд выставил токен обновления api. Когда вы входите в систему, вы получаете действительный токен и обновляете токен. Когда истекает срок действия токена, вам необходимо сделать вызов обновления, разрешенный старым токеном токена истек и токен обновления. Ответ возвращает новый действительный токен и новый токен обновления. В настоящий момент я пытаюсь внедрить его в свой защитный щит. Это код:angular2 refresh token через службу

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 = истина означает, что пользователь имеет действительный 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

+0

Спасибо братан! Это сработало! У меня есть только одна проблема сейчас - когда я использую охранник для активации, это вызывает вызов обновления, но после этого он не переходит к пути, который я нажал в меню. Также после обновления токена я пытаюсь щелкнуть второй раз на одном и том же элементе, но событие охранника не вызывается ... Я должен щелкнуть по другому элементу из меню, а затем путь активируется успешно. Любая идея, как справиться с этим ударом пути? –

+0

Извините, у меня нет ответа. – Nikolai

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