Typescript,Angular4:刷新浏览器后数组为空

Posted

技术标签:

【中文标题】Typescript,Angular4:刷新浏览器后数组为空【英文标题】:Typescript, Angular4: array goes empty after refreshing browser 【发布时间】:2018-05-10 14:45:46 【问题描述】:

我对用于在 Angular 应用程序的授权服务中存储角色的数组有疑问。我正在使用 auth0 服务登录。 auth.service.ts 看起来像这样:

  @Injectable()
export class AuthService 
  userProfile: any;
  private roles: string[] = [];
 ...
  public handleAuthentication(): void 
this.auth0.parseHash((err, authResult) => 
  if (authResult && authResult.accessToken && authResult.idToken) 
    window.location.hash = '';
    this.setSession(authResult);
    this.getRoles(authResult);
    this.router.navigate(['/']);
   else if (err) 
    this.router.navigate(['/']);
    console.log(err);
    alert(`Error: $err.error. Check the console for further details.`);
  
);
//THIS IS getRole function
private getRoles(authResult)
let jwtHelper = new JwtHelper();
let decodedToken = jwtHelper.decodeToken(authResult.idToken);
this.roles = decodedToken['https://tobenorme.com/roles'];

登录后,handleAuthentication 函数被调用,一切正常,直到点击刷新按钮。然后角色数组返回空数组,我不再能够获得角色。我尝试将它们存储在本地存储中,但可以在浏览器中进行编辑。

【问题讨论】:

【参考方案1】:

当您刷新并且状态消失时,您的应用程序将再次引导,正如您所提到的,将数据存储到本地存储或会话存储(最好不要以纯文本形式),当您不想这样做时,创建一个像singelton这样的方法,当角色为空时进行http调用并获取它,当角色不为空时将它们返回。使用 RxJs BehaviorSubject 是一个很好的案例。

【讨论】:

【参考方案2】:

本地存储应该没问题,只要它在您的浏览器中启用。请务必使用localStorage.setItem(name, value) 存储值,并使用localStorage.getItem(name) 下次检索值。

【讨论】:

【参考方案3】:

由于声明使用 JWT 令牌 (https://auth0.com/docs/jwt),您可以安全地依赖将令牌存储在本地存储或 cookie 中。 JWT 令牌经过签名,因此浏览器中的每一次本地更改都会在服务器上检测到,同时使用每个 API 调用解密令牌。

无法避免本地更改,但服务器端应始终确保用户实际拥有提供的角色/权限。

您可以参考以下示例:https://github.com/auth0/angular2-jwt

【讨论】:

【参考方案4】:

也许它会帮助我这样解决的人:

private getRoles(authResult)
    let jwtHelper = new JwtHelper();
    let decodedToken;
    if (authResult && authResult.accessToken && authResult.idToken)
        decodedToken = jwtHelper.decodeToken(authResult.idToken);
        this.roles = decodedToken['https://tobenorme.com/roles'];
    else if(this.isAuthenticated && authResult)
      decodedToken = jwtHelper.decodeToken(authResult);
      this.roles = decodedToken['https://tobenorme.com/roles'];
    

我必须在构造函数中调用这个函数。

【讨论】:

以上是关于Typescript,Angular4:刷新浏览器后数组为空的主要内容,如果未能解决你的问题,请参考以下文章

创建一个具有可变长度数组的接口,其中包含 TypeScript/Angular4 中的对象

浏览器中间接运行typescript,并实现实时刷新(vscode)

刷新浏览器后显示 localStorage 中的收藏项 - Next.js 和 Typescript 项目

在 Angular 4/5 和 TypeScript 中重新加载同一页面

用户无法通过刷新 Angular4 上的输入绑定使用

typescript 使用OAuth,匿名和电子邮件/密码的Angular4 Firebase身份验证服务。专为Angular中引入的更改而设计