атоб в интерфейсе Angular - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь решить проблему с хранением токенов, которая, на мой взгляд, может быть решена через интерфейсы. Мой текущий код для входа в систему следующий:

import { Component } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { HttpClient } from '@angular/common/http';

interface User {
  success: {
    id: number;
    role: string;
    accessToken: string;
    refreshToken: string;
    lifetime: {
      epoch: number;
      timeZone: number;
    }
  }
}

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css'],
})

export class LoginComponent {
  constructor( private fb: FormBuilder, private http: HttpClient ) { }

  loginInfo = this.fb.group({
    email: [''],
    password: ['']
  })

  onSubmit() {
    this.http.post<User>('', this.loginInfo.value)
      .subscribe(x => localStorage.setItem("currentUser",JSON.stringify(x)))
  };
}

Единственная проблема в том, что refreshToken и accessToken входят в Base64, что, насколько мне известно, решается только с помощью функции atob (). Можно ли предварительно решить его в интерфейсе?

Я понимаю, что следующий код не работает, но он просто для большей ясности:

interface User {
  success: {
    id: number;
    role: string;
    accessToken: atob(string);
    refreshToken: atob(string);
    lifetime: {
      epoch: number;
      timeZone: number;
    }
  }
}

1 Ответ

2 голосов
/ 13 июля 2020

Вы можете попробовать изменить интерфейс на класс и использовать геттер для решения токена base64, например:

class UserSuccess {
  id: number;
  role: string;

  get accessToken(): string {
    return atob(this._accessToken);
  }
  set accessToken(value: string) {
    this._accessToken = value;
  }
  private _accessToken?: string;

  get refreshToken(): string {
    return atob(this._refreshToken);
  }
  set refreshToken(value: string) {
    this._refreshToken = value;
  }
  private _refreshToken?: string;

  lifetime: {
    epoch: number;
    timeZone: number;
  }
}

class User {
  success: UserSuccess;
}

Непосредственно в интерфейсе невозможно. Надеюсь, это поможет.

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