目标:我正在尝试使用IdentityServer4和oidc客户端在Angular应用中隐藏和显示Loggin和Logout按钮。

问题:来自我的isLoggedIn函数的响应在返回true和* ngIf从不显示“注销”按钮或隐藏“登录”按钮之前返回未定义。看到代码:

app.componenet.html:

<span>
      <button *ngIf="!isLoggedIn()" mat-button (click)="login()">Login</button>
      <button *ngIf="isLoggedIn()" mat-button (click)="logout()">Logout</button>
</span>


app.componenet.ts:

    isLoggedIn(){
        console.log('isLoggedIn -this._authService.isLoggedIn():',
          this._authService.isLoggedIn());
        this._authService.isLoggedIn();
      }


验证服务

isLoggedIn(): boolean{
    return this._user && this._user.access_token && !this._user.expired;
  }


在auth.service.ts中,我像这样设置用户对象:

 this._userManager = new UserManager(config);
    this._userManager.getUser().then(user =>{
      if(user && !user.expired){
        this._user = user;
      }


console.log输出:
javascript - 在* ngIf中使用oidc-client在Angular中实现isLoggedIn()函数-LMLPHP

我尝试过的


我尝试玩我的oidc-client版本,切换
在leatest和1.4.1之间,并确保它们匹配
package.json和我的oidc-login-redirect.html文件。
如果使用异步管道,将auth.service.ts isLoggedIn函数转换为Promise isLoggedIn()并直接从* nf调用它


验证服务
    诺言{
        返回新的Promise(resolve => {
          解析(this._user && this._user.access_token &&!this._user.expired);
        });
      }

app.component.html


  <button *ngIf="!this._authService.isLoggedIn() | async" mat-button (click)="login()">Login</button>
  <button *ngIf="this._authService.isLoggedIn() | async" mat-button (click)="logout()">Logout</button>


这两种方法均无效,并且允诺尝试导致google chrome挂断:
javascript - 在* ngIf中使用oidc-client在Angular中实现isLoggedIn()函数-LMLPHP

最佳答案

如果您在某个角度的Angular应用程序中调用signinRedirectCallback(而不是位于SPA之外的单独的html页面),则很可能在调用登录回调之前调用了设置this.user的代码。

您应该在UserManager上订阅addUserLoaded,并从其处理程序中在身份验证服务中设置用户。这样,您的用户将始终保持最新状态。

如果上面的代码是从您的源复制/粘贴的,则您的app.component isLoggedIn不会从auth服务返回值,它只是在auth服务上调用isLoggedIn而不返回值。

关于javascript - 在* ngIf中使用oidc-client在Angular中实现isLoggedIn()函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56811876/

10-10 00:40