Обновление веб-страницы клиентом oidc приводит к потере пользовательских данных

Я использую этот oidc для доступа к аутентификации identityserver4. все работает отлично. После входа в систему пользовательские данные были потеряны после того, как я нажал F5, чтобы обновить данные. Вот мой auth.service.ts.

import { HttpClient , HttpHeaders} from '@angular/common/http';
import { EventEmitter, Injectable } from '@angular/core';
import { User, UserManager } from 'oidc-client';
import { Observable } from 'rxjs/Rx';

import { getUserManagerSettings } from '../utils/get-user-manager-settings-util';

@Injectable()
export class AuthService {
   mgr: UserManager = new UserManager(getUserManagerSettings());
   userLoadededEvent: EventEmitter<User> = new EventEmitter<User>();
   currentUser: User;
   loggedIn = false;
   authHeaders: Headers;
   constructor(private http: HttpClient) {

    this.mgr.getUser()
    .then((user) => {
    if (user) {
      this.loggedIn = true;
      this.currentUser = user;
      this.userLoadededEvent.emit(user);
    } else {
      this.loggedIn = false;
    }
  })
  .catch((err) => {
    this.loggedIn = false;
  });

  this.mgr.events.addUserLoaded((user) => {
    this.currentUser = user;
    this.loggedIn = !!user;
  });

  this.mgr.events.addUserUnloaded((e) => {
    this.loggedIn = false;
  });
 }

isLoggedInObs(): Observable<boolean> {
   return Observable.fromPromise(this.mgr.getUser()).map<User, boolean>
  ((user) => {
  if (user) {
    return true;
  } else {
    return false;
  }
});
}

clearState() {
 this.mgr.clearStaleState().then(function () {
}).catch(function (e) {
});
}

getUser() {
this.mgr.getUser().then((user) => {
  this.currentUser = user;
}).catch(function (err) {
});
}

removeUser() {
this.mgr.removeUser().then(() => {
}).catch(function (err) {
});
}

startSigninMainWindow() {
 this.mgr.signinRedirect({ data: 'some data' }).then(function () {
}).catch(function (err) {
});
}
endSigninMainWindow() {
this.mgr.signinRedirectCallback().then(function (user) {
}).catch(function (err) {
});
}

startSignoutMainWindow() {
 this.mgr.signoutRedirect().then(function (resp) {
  setTimeout(5000, () => {
  });
}).catch(function (err) {
});
}

endSignoutMainWindow() {
this.mgr.signoutRedirectCallback().then(function (resp) {
}).catch(function (err) {
});
}

getHeader() {
  return new HttpHeaders().set('Authorization', this.currentUser.token_type 
+ ' ' + this.currentUser.access_token);
}
}

Вот файл api.service.ts. Auth.service.ts используется ap.service для получения заголовков.

   import { HttpClient } from '@angular/common/http';
   import { Injectable } from '@angular/core';
   import { Observable } from 'rxjs/Observable';
   import { AuthService} from './auth.service';

   @Injectable()
    export class ApiService {

    constructor(private http: HttpClient, private authService: AuthService) 
    { }

   get(path, body?): Observable<any> {
     const options = body ? {...body, headers: this.authService.getHeader()} 
    : {headers: this.authService.getHeader()};
    return this.http.get(path, options);
   }

   post(path, body?) {
       return this.http.post(path, body, { headers: 
     this.authService.getHeader()});
   }
   put(path, body?) {
     return this.http.put(path, body, {headers: 
    this.authService.getHeader()});
    }
   delete(path: string, body?) {
     const options = body ? {...body, headers: this.authService.getHeader()} 
    : {headers: this.authService.getHeader()};
    return this.http.delete(path, options);
  }
 }

Кажется, API вызывают огонь дважды. Первый раз заголовка нет, потом второй вызов с заголовком.

0 ответов

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