更新 websocket graphql 中的授权标头

per*_*snk 4 websocket apollo graphql apollo-server

我正在尝试使用 firebase 和 websockets (在 React Native 上)在 Graphql 中实现身份验证。

客户端使用 firebase 进行身份验证并获取令牌。然后,它通过 websocket 客户端将令牌发送到服务器,该客户端使用 admin sdk 验证用户。

我面临两个问题:

  1. 当应用程序启动时,它会建立一个 ws 连接,此时它没有授权标头。用户使用 firebase 一段时间后会获得一个令牌。

  2. 令牌会在一段时间后过期,因此一段时间后我需要更新 websocket 连接中的授权标头,并重新运行因令牌过期而被拒绝的查询、突变或订阅。

有没有办法更新授权标头并重新运行查询?

我是否需要关闭以前的连接并使用授权标头中的新令牌打开一个新连接?这是怎么做到的?

我正在使用 apollo-server、apollo-client、apollo-link、subscriptions-transport-ws。

小智 7

我之前没有遇到过你的确切问题,但你应该检查一下connectionParams字段。如果在启动时创建了新的 websocket 客户端,您可以在connectionParams.

import { createClient } from 'graphql-ws';

export const createWebsocketClient = (user) => createClient({
  url: 'ws://localhost:8080/v1/graphql',
  connectionParams: async () => {
    const token = await user.getToken();
    return {
      headers: {
        Authorization: `Bearer ${token}`,
      },
    };
  },
});
Run Code Online (Sandbox Code Playgroud)

令牌仅在初始化连接时发送,因此即使令牌在初始化后过期,也不会有问题。