我们的项目和 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 };
}