异步 setContext 中的身份验证等待

Posted

技术标签:

【中文标题】异步 setContext 中的身份验证等待【英文标题】:authentication await in async setContext 【发布时间】:2020-07-25 06:48:18 【问题描述】:

在文档 (https://www.apollographql.com/docs/angular/recipes/authentication/) 中有一个示例。 但是,如果您有一个 angular-apollo 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);
          
        )
      );

问题是,不能调用 subscribe,这将启动 Observable。 你有解决办法吗?

【问题讨论】:

【参考方案1】:

好的,它与 await for promise 和 observable to promise 无关。 这是完全正确的。

这只是一个典型的僵局。

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

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

【讨论】:

以上是关于异步 setContext 中的身份验证等待的主要内容,如果未能解决你的问题,请参考以下文章

链接是不是应该包含 HateOAS 中的身份验证令牌?

IE 10 windows 身份验证中的异步 KendoUI 上传

Django Rest 框架中的基于会话的与令牌身份验证

用于重定向到 REST api 中的身份验证的适当 HTTP 状态

在 IIS 中禁用匿名身份验证后 WebServiceHost 无法正常工作

我用的是window server 2003系统, 管理工具 计算机管理中:无本地用户和组,如何调出?另用window 身份验...