【发布时间】:2016-10-04 02:36:19
【问题描述】:
角度 2 - RC5,ADAL.js
问题
所以我正在使用 adal.js 和 angular 2 对 Microsoft AD 进行身份验证。我掌握了 adal.js 的窍门,可以登录、刷新令牌、注销、获取用户等。
我现在的问题是处理扩展 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() 并获得了新令牌时......它不会再次尝试请求,而是出现这样的错误......
Cannot read property 'subscribe' of undefined
^^^ 我认为这与订阅请求毕竟已经返回有关。
我认为还值得指出的是,我的 main.ts 设置很好,因为拦截器至少可以工作。
我的问题是:
- 从拦截器中重试请求是否正确?或者以后在订阅中重试请求是否更有意义。
- 重试请求是一种好习惯,还是通知用户重试更好? (我假设这听起来有点刺耳)
- 是否有 rxjs 函数可用于在返回值后重试? (如“acquireToken”函数中的令牌)
编辑 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 问题,如果不是最好的布局,我深表歉意
谢谢!!
【问题讨论】:
标签: angular jwt rxjs adal adal.js