Apollo Client 3.0 中的 WebSocketClient 如何传递认证令牌?

Posted

技术标签:

【中文标题】Apollo Client 3.0 中的 WebSocketClient 如何传递认证令牌?【英文标题】:How does WebSocketClient pass authentication token in Apollo Client 3.0? 【发布时间】:2020-11-24 22:08:53 【问题描述】:

根据 Apollo GraphQL 的官方文档,Apollo Client 3.0 支持对其订阅的 WebSocket 身份验证。在许多情况下,订阅应通过安全令牌进行身份验证。对我来说也是一样。我关注了最新的 Apollo Client(here) 的 WebSocket 身份验证文档。

文档:

我的代码:

import  WebSocketLink  from '@apollo/client/link/ws';

const wsLink = new WebSocketLink(
  uri: `$process.env.REACT_APP_WS_API/graphql/`,
  options: 
    reconnect: true,
    connectionParams: 
      authToken: `$localStorage.getItem('access_token')`
    
  
)

很遗憾,这种身份验证根本不起作用。 graphql_jwt.exceptions.PermissionDenied 错误发生在我的 Django 后端并且后端没有读取 authToken 值。我在下面附上了异常的屏幕截图。

是否有任何有效的解决方案可以将安全令牌传递给WebSocketLink

【问题讨论】:

【参考方案1】:

如果后端期望通过标头获取令牌,WebSocketLink 可能不起作用,因为它通过WebSocket (see code) 将 connectionParams 作为消息的有效负载属性发送。为了让它工作,后端必须等待 GQL_CONNECTION_INIT 消息来获取令牌。

【讨论】:

以上是关于Apollo Client 3.0 中的 WebSocketClient 如何传递认证令牌?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo Client 3.0 或 Redux 用于本地状态管理?

在第 7 行调用 C:\wamp\www\Webs\client.php 中未定义的函数 sqlsrv_connect()

如何将 redux 与 graphql 一起使用

nodejs/vanilla 中的 Apollo-client 未触发订阅

next.js 中的 apollo-client 与 `next-with-apollo` VS next.js 文档常见问题解答中显示的方法(不使用 `getDataFromTree`)

Apollo Client 2.1 中的突变错误处理