【问题标题】:How to do Silent Refresh manually in implicit flow using iFrame (using Identity Server 4, Angular 2+)如何使用 iFrame 在隐式流中手动进行静默刷新(使用 Identity Server 4、Angular 2+)
【发布时间】:2020-06-12 04:43:59
【问题描述】:

我正在尝试使用带有隐式流的 iFrame 进行静默刷新。我不想使用 automaticSilentRenew,因为它效率不高。我在客户端使用 Angular 8 中的 oidc-client 库。所以,有两件事正在发生:

1.) 我正在使用 auth-guard 来保护重要组件。在 auth-guard 中,我正在检查令牌是否有效,如果不是,那么我将调用 auth-service 类的 signinRedirect 来获取新令牌。

2.) 我没有使用 auth-guard 保护安全 API 调用组件,因此我可能会收到无效令牌的 401 未授权 错误。但是如果我用 auth-guard 保护它,它会在获得新的令牌集并且原始请求丢失后将我路由到 auth-callback。

我想以某种方式自动化这个过程。就像,使用 auth-guard 保护 API 调用组件,当我尝试使用过期令牌访问 API 时,auth-guard 开始发挥作用,在后台使用有效令牌更新当前请求,以提供无缝的用户体验.

export class AuthService {

private manager = new UserManager(getClientSettings());
private user: User = null;


constructor() {
this.manager.getUser().then(user => {
  this.user = user;
});

this.manager.events.addAccessTokenExpiring(async function(){
  await this.manager.signinSilent().then(user => {   
      });  
});
}}

我试图在我的 auth-service 类的构造函数中捕获 addAccessTokenExpiring 事件并调用 signinSilent 以获取新的 access_token。该事件确实在令牌到期之前开始,但我在此事件中得到 this.manager 未定义。

请分享您的宝贵意见以实现这一目标。任何现有的例子都将是非常可观的。

谢谢你!

塔伦·奥里

【问题讨论】:

  • 您可以在您的身份验证请求中添加一些state(即:原始请求)。然后在您收到回调的页面上,使用此状态重定向回原始请求。
  • @PabloRecalde 感谢您的及时回复。我已经编辑了我的帖子,你能看看并尝试帮助我哪里出错了吗?谢谢!
  • 当你在传递给另一个方法的内联函数中使用它时,它并不引用你的类。您需要使用arrow functionbind()

标签: angular oauth-2.0 identityserver4 openid-connect implicit-flow


【解决方案1】:

我的偏好是遵循类似的方法,但不依赖于客户端令牌过期,允许发生 401,然后刷新令牌并使用新令牌重试 API 请求。

如果有帮助,这里有 2 个关键类:

【讨论】:

  • 是的@Gary,这是有道理的,因为如果万一互联网出现故障并且令牌到期事件被触发,在这种情况下新令牌将无法接收,因此我们最终会出现 401 错误。所以无论如何处理401是很重要的。
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 2019-06-12
  • 2018-01-13
  • 1970-01-01
  • 2020-04-20
  • 2019-09-25
  • 2021-06-29
  • 2023-03-05
相关资源
最近更新 更多