身份验证在异步setContext中等待

时间:2020-04-12 17:34:41

标签: angular apollo apollo-angular

在文档(https://www.apollographql.com/docs/angular/recipes/authentication/)中有一个示例。 但是,如果您将角形阿波罗watch()。valueChanges或fetch()设置为可延展的Observable,则此操作将无效。

我的代码是:

const auth = setContext(async (_, {headers}) => {
      let token = authService.getAccessToken();

      if (!authService.hasValidAccessToken()) {
        if (authService.hasRefreshToken()) {

          await this.authService.refreshToken().pipe(first()).toPromise(); //Does not work...

          token = authService.getAccessToken();
        }
      }
      // Return the headers as usual
      return {
        headers: {
          Authorization: `Bearer ${token}`,
        },
      };
    });

authService.refreshToken()方法返回此:

refreshToken(): Observable<any> {
    this.removeAccessToken();
    if (this.hasRefreshToken()) {
      return this.refreshGQL.fetch({
         refreshToken: this.getRefreshToken()
      }).pipe(
        tap(next => {
            this.storeTokens(next.data.refresh);
          }
        )
      );
}

问题是,无法调用订阅,这将启动Observable。 你有解决办法吗?

1 个答案:

答案 0 :(得分:0)

好的,它与等待诺言无关,并且可以观察到诺言。 这是完全正确的。

那只是一个经典的僵局。

如果没有有效的访问令牌,它将尝试接收一个新的令牌,从而产生一个gql请求,而该令牌也没有有效的访问令牌,该令牌将尝试在每个gql请求中接收一个新的令牌,等等。

如果操作名称等于刷新突变或查询,则跳过逻辑即可解决。

相关问题