gpt4 book ai didi

angular - 401 的拦截器,更新并重试 Angular 2

转载 作者:行者123 更新时间:2023-12-02 03:11:31 25 4
gpt4 key购买 nike

Angular 2 - RC5,ADAL.js


问题

所以我正在使用 adal.js 和 angular 2 对 Microsoft AD 进行身份验证。我掌握了 adal.js 的窍门,可以登录、刷新 token 、注销、获取用户等。

我现在的问题是处理扩展 Http 和创建自定义类,在 401 上将重试刚刚失败的请求

这基本上是我现在所拥有的:

export class HttpInterceptor extends Http {
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private _router: Router, private adal: IgAdal) {
super(backend, defaultOptions);
}

request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.request(url, this.getRequestOptionArgs(options)));
}

get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.get(url, this.getRequestOptionArgs(options)));
}

intercept(observable: Observable<Response>): Observable<Response> {
return observable.catch((err, source) => {
if (err.status == 401) {
this.adal.acquireTokenObservable().flatMap(data=>{
// NOT SURE WHAT TO DO HERE...
return Observable.throw(err);
})
} else {
return Observable.throw(err);
}
});
}
}

这在它不是 401 时效果很好,它应该抛出错误。现在,当我尝试在 401 之后调用 super.get() 并获取了一个新 token 时......它不会再次尝试请求,而是出现这样的错误......

Cannot read property 'subscribe' of undefined

^^^ 我觉得这和request all 返回后的订阅有关系。

我认为还值得指出的是,我的 main.ts 设置很好,因为拦截器至少可以正常工作。


我的问题是:

  • 从拦截器中重试请求是否正确?或者稍后在订阅中重试请求是否更有意义。
  • 重试请求是否更好,还是通知用户重试更好? (我假设这听起来有点刺耳)
  • 是否有一个 rxjs 函数可以用来在返回值后重试? (就像来自“acquireToken”函数的 token )

编辑1

    intercept(observable: Observable<Response>): Observable<Response> {
return observable.catch((err, source) => {
if (err.status == 401) {
return this.adal.acquireTokenObservable().flatMap(data=>{
return observable.retry(3);
})
} else {
return Observable.throw(err);
}
});
}

刚刚尝试了“重试”rxjs 运算符.. 似乎正在做我想做的事情。现在我的问题是...重试失败后如何将某人发送到登录页面?


这是我的第一个 stackoverflow 问题,如果布局不是最好的,我深表歉意

谢谢!!

最佳答案

对于任何调查此问题的人...我最终会这样做。

intercept(observable: Observable<Response>): any {
return observable.catch((err, source) => {
if (err.status == 401) {
return this.adal.acquireTokenObservable().flatMap(data=>{
if (data === 'User login is required') {
this.adal.login();
}
return observable;
})
} else {
return Observable.throw(err);
}
});
}

返回可观察流本身而不是 .retry() 似乎做完全相同的事情并且也只是重试 1 次。否则 .retry(1) 实际上会出于某种原因抛出 3 个单独的错误。

this.adal.acquireTokenObservable()

是我使用 adal.js 库返回带有新 token 的流的可观察对象。仍在处理有关重试某些请求的其他几个问题,但这是一个好的开始。

关于angular - 401 的拦截器,更新并重试 Angular 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39649914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com