刷新 id_token 编辑:Angular 4

Refresh id_token ADAL: Angular 4

我使用 Angular 4 和 ADAL 在我的 Web 应用程序中对用户进行身份验证,使用 ng2-adal 库,它是 adal.js.

的包装器

我面临的问题如下: 所以令牌在一个时间限制后过期,我有一个 canActivate 路由保护来检查用户是否已通过身份验证。如果没有,它会将用户导航到登录页面。这是我的路线守卫的样子:

import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AdalService } from 'ng2-adal/dist/core';

@Injectable()
export class RouteGuard implements CanActivate {

  constructor(private router: Router, private adalService: AdalService) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    if (this.adalService.userInfo.isAuthenticated) {
      return true;
    } else {
        this.router.navigate(['/user-login']);
        return false;
    }
  }
}

所以只要令牌过期,用户就会被导航到登录页面,这对用户来说很烦人。有什么方法可以在令牌过期时续订令牌吗?

我明白了。我是这样添加的:

import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AdalService } from 'ng2-adal/dist/core';

@Injectable()
export class RouteGuard implements CanActivate {

  constructor(private router: Router, private adalService: AdalService) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    if (this.adalService.userInfo.isAuthenticated) {
      return true;
    } else {
      this.adalService.acquireToken(this.adalService.config.clientId).toPromise().then((data) => {
      console.log('Generating a new authentication token.');
      return true;
    },
     (error) => {
       console.log('No user logged in.');
       this.router.navigate(['/user-login']);
       return false;
     }
    }
  }
}

我遇到了同样的问题,我的修复成功了。 在 app.component.ts 中,将此代码添加到 ngOnit()。

this.adalService.handleWindowCallback();
 this.adalService.acquireToken(this.adalService.config.loginResource).subscribe(token => {
  this.adalService.userInfo.token = token;
  if (this.adalService.userInfo.authenticated === false) {
    this.adalService.userInfo.authenticated = true;
    this.adalService.userInfo.error = '';
  }
}, error => {
  this.adalService.userInfo.authenticated = false;
  this.adalService.userInfo.error = error;
  this.adalService.login();
});

当令牌过期时,应用程序组件被调用,并获取令牌以静默方式刷新令牌。但是 this.adalService.userInfo.authenticated 仍然是错误的,导致重定向或再次调用登录方法。因此手动将其设置为 true 可以修复重定向错误。 this.adalService.config.loginResource 这是由 adal-angular 本身使用我们需要令牌的资源自动设置的。

还将 expireOffsetSeconds: 320, 添加到 adal 配置数据设置以及

tenant: configData.adalConfig.tenant,
  clientId: configData.adalConfig.clientId,
  redirectUri: window.location.origin,

expireoffsetseconds 根据我们在实际到期前指定的时间使令牌失效。