服务的IONIC/ANGULAR JWT令牌处理

t1qtbnec  于 2023-09-28  发布在  Ionic
关注(0)|答案(1)|浏览(250)

我创建了一个服务来处理离子存储的令牌存储。在主页中,我需要检查是否已在使用服务的存储中存在令牌,如果不存在,则将用户重定向到登录页面。下面是主页的代码:

  1. ngOnInit(){
  2. this.storage.create() // da fare solo una volta all'avvio dell'app
  3. this.storage.get('jwtToken').then(token => {
  4. this.tokenService.saveToken(token);
  5. });
  6. this.tokenService.getTokenAsObservable().subscribe(
  7. token => {
  8. this.token = token;
  9. let tokan = token;
  10. }
  11. );
  12. if(!this.storage.get('jwtToken')){
  13. this.router.navigate(['/login']);
  14. } else if (!this.checkUserApi()){
  15. this.router.navigate(['/login']);
  16. }
  17. else {
  18. this.storage.get('jwtToken').then(token => {
  19. this.tokenService.saveToken(token);
  20. });
  21. this.initFirebase()
  22. }
  23. }
  24. checkUserApi(){
  25. return true
  26. }
  27. ionViewWillEnter(){
  28. this.fetchTokenAndLoadData();
  29. }
  30. async fetchTokenAndLoadData() {
  31. try {
  32. this.token = await this.storage.get('token');
  33. if (this.token) {
  34. await this.loadData();
  35. } else {
  36. console.log('Token not found');
  37. }
  38. } catch (error) {
  39. console.error('Error fetching token:', error);
  40. }
  41. }

问题是,当我运行应用程序时,变量this.token为null,似乎服务的订阅花费了太多时间,并且该变量保持为null,直到ionwillEnter之后
编辑:我使用一个服务来处理存储:

  1. export class TokenService {
  2. private tokenSubject: BehaviorSubject<string> = new BehaviorSubject<string>('');
  3. constructor(private storage: Storage) {
  4. this.init();
  5. }
  6. async init() {
  7. const token = await this.storage.get('jwtToken');
  8. this.tokenSubject.next(token);
  9. }
  10. async saveToken(token: string): Promise<void> {
  11. await this.storage.set('jwtToken', token);
  12. this.tokenSubject.next(token);
  13. }
  14. async removeToken(): Promise<void> {
  15. await this.storage.remove('jwtToken');
  16. this.tokenSubject.next('');
  17. }
  18. getTokenAsObservable(): Observable<string> {
  19. return this.tokenSubject.asObservable();
  20. }
  21. }

并在应用程序的其他部分使用这些方法来创建、删除令牌。重复:

  1. logout(){
  2. this.tokenService.removeToken();
  3. this.router.navigate(['/']);
  4. }

就像上面的点击注销被执行,令牌被删除,问题是,在导航主页令牌仍然存在,因为所有的存储方法是异步的,这就是问题。

lkaoscv7

lkaoscv71#

你没有正确地管理你的国家。你需要假设任何一个任务都可以占用任何时间,你的代码需要处理这个问题。在这里,你需要在加载令牌后将fetchTokenAndLoadData()放在某个地方,比如在storage.get中,或者更好地在订阅(this.tokenService.getTokenAsObservable().subscribe)中。你还需要一个加载机制,这样在令牌加载之前你就有了一些内容。例如,你可以定义一个像isLoadingToken这样的变量,并在开始加载令牌之前将其设置为true,并在加载时将其设置为false(无论令牌是否可用),然后根据变量更改HTML的内容。或者使用ion-loading。我知道你还没有实现checkUserApi,但这也是另一个异步作业,需要以相同的方式处理,并且是串行加载而不是并行加载。

相关问题