0

我们的项目和 Apollo Angular 都有 Auth0 身份验证,当我们调用常规http 请求时,一切都很好。

但是当我们试图用它来拉订阅时,它就搞砸了。

事情如下:

  • 我们让我们的 ngModule 设置了 graphQL 选项,也想要令牌。

  • 如果我们在 localStorage 中有令牌,没问题。它正在工作!

  • 如果我们没有令牌,我们必须从 auth0 中获取它,它是可观察的并被推送到事件循环队列中。只有在 graphQL 选项设置为 go 后才能获取令牌。

      export function createApollo(httpLink: HttpLink, authService: AuthService): ApolloClientOptions<any> {
    
    
    
    const http = httpLink.create({
      uri: environment.baseUrl + '/query'
    });
    
    
    const wsClient = new SubscriptionClient(environment.webSocketUrl, {
      reconnect: true,
      connectionParams: {
        Authorization: getToken()
    
      }
    });
    
    
    function getToken() {
    
      let token = localStorage.getItem('id_token')
      if(token) {   
        console.log('uto', uToken)
        return `${token}`;
      } else {
    
         this.authService.idTokenClaims$.subscribe((token: any) => {
           localStorage.setItem('id_token', token.__raw)      
           token = token.__raw;   
         })
    
        return 'nothing'
      }
    
    }
    
    
    const ws = new WebSocketLink({
      client: wsClient,
      uri: environment.webSocketUrl, //'ws://localhost:4000/subscriptions',
      options: {
        reconnect: true,
        connectionParams: {
          Authorization: getToken()
        }
    
      },
    });
    
    
    
    
    const link = split(
      // split based on operation type
    
      ({query}) => {
        let definition = getMainDefinition(query);
    
        return definition.kind === 'OperationDefinition' && definition.operation === 'subscription';
      },
      ws,
      http,
    );
    
    
    
    return {
      link,
    
      cache: new InMemoryCache(),
      defaultOptions: defaultOptions
    };
    

    }

4

0 回答 0