与阿波罗服务器一起使用时如何处理“ graphql-redis-subscriptions”身份验证的任何想法

痛点

我正在使用https://github.com/davidyaha/graphql-redis-subscriptions中的'graphql-redis-subscriptions' 给出了一些有关如何设置订阅的示例,它们实际上是有效的,但是我面临的问题是如何进行身份验证并仅允许登录的客户端用户监听订阅。我正在使用Apollo服务器来提供graphql api,如下所示:

const server = new ApolloServer({
            schema,
            dataSources,
            context: async ({ req, connection }) => {
                if (connection) {
                    return {
                        ...connection.context
                    };
                }

                const token = req.headers[API_TOKEN];

                return {
                    premiumAuth: token
                };
            },
        });
        server.listen(5000);
幻灯片放映

context选项中的Authenticatedapollo-server用于HTTP协议请求身份验证。这意味着它将保护/graphql端点免遭未经身份验证的访问。例如

  const contextFunction: ContextFunction<IContextFunctionParams, IConnectors<IMemoryDB>> = (
    context: IContextFunctionParams,
  ): Context<IAppContext> => {
    const { req, connection } = context;
    if (connection) {
      return connection.context;
    } else {
      const token: string = validateToken(req);
      const userConnector = new UserConnector<IMemoryDB>(memoryDB);
      let user: IUser | undefined;
      try {
        const userType: UserType = UserType[token];
        user = userConnector.findUserByUserType(userType);
      } catch (error) {
        throw error;
      }
      return {
        requestingUser: user,
        locationConnector: new LocationConnector<IMemoryDB>(memoryDB),
        userConnector,
        templateConnector: new TemplateConnector<IMemoryDB>(
          memoryDB,
          pubsub,
          // postgresPubSub,
        ),
      };
    }
  };

对于WebSocket协议连接,graphql预订依赖于此。您需要在subscriptions.onConnect方法内部进行身份验证,例如

const server = new ApolloServer({
    typeDefs,
    resolvers,
    context: contextFunction,
    introspection: true,
    subscriptions: {
      onConnect: (
        connectionParams: IWebSocketConnectionParams,
        webSocket: WebSocket,
        connectionContext: ConnectionContext,
      ) => {
        console.log('websocket connect');
        console.log('connectionParams: ', connectionParams);
        if (connectionParams.token) {
          const token: string = validateToken(connectionParams.token);
          const userConnector = new UserConnector<IMemoryDB>(memoryDB);
          let user: IUser | undefined;
          try {
            const userType: UserType = UserType[token];
            user = userConnector.findUserByUserType(userType);
          } catch (error) {
            throw error;
          }

          const context: ISubscriptionContext = {
            // pubsub: postgresPubSub,
            pubsub,
            subscribeUser: user,
            userConnector,
            locationConnector: new LocationConnector<IMemoryDB>(memoryDB),
          };

          return context;
        }

        throw new Error('Missing auth token!');
      },
      onDisconnect: (webSocket: WebSocket, connectionContext: ConnectionContext) => {
        console.log('websocket disconnect');
      },
    },
  });

源代码:https : //github.com/mrdulin/apollo-graphql-tutorial/tree/master/src/subscriptions

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以使用阿波罗联合身份验证只是为了在同一服务器上模块化架构吗?

来自分类Dev

如何使用GraphQL构建经过身份验证的查询?

来自分类Dev

如何使用GraphQL自定义身份验证类?

来自分类Dev

与阿波罗角graphql

来自分类Dev

使用GraphQL和Django进行身份验证

来自分类Dev

在Ubuntu 12.04上将任何VNC查看器(Windows)与VNC服务器一起使用时身份验证失败

来自分类Dev

如何在Slanger上设置Redis身份验证

来自分类Dev

如何将我的自定义ServiceStack身份验证提供程序与Redis一起使用?

来自分类Dev

Flask:如何使用Flask-Redis和Redis进行身份验证

来自分类Dev

GraphQL角形阿波罗客户端。从高速缓存抛出错误中读取,但对服务器进行相同的查询可以正常工作

来自分类Dev

如何在Django REST Framework身份验证中使用Graphene GraphQL框架

来自分类Dev

用于身份验证的 GraphQL 解析器中间件

来自分类Dev

NTLM身份验证-身份验证后,服务器是否发布了任何令牌?

来自分类Dev

Relay&GraphQL中的身份验证

来自分类Dev

Redis,Node.js和Socket.io:跨服务器身份验证和对node.js的了解

来自分类Dev

如何为Redis添加SSL代理和身份验证层

来自分类Dev

使用Spring Session Redis时身份验证主体为空

来自分类Dev

使用身份验证用户名/密码nodejs连接到托管Redis

来自分类Dev

阿波罗graphql突变-JSON输入意外结束

来自分类Dev

无法使用Laravel回显服务器,Redis和socket.io对laravel私有通道进行身份验证

来自分类Dev

WebRTC是否需要“长期凭证”身份验证机制才能与TURN服务器一起使用?

来自分类Dev

Python GraphQL gql客户端身份验证

来自分类Dev

将验证过滤器与async / await一起使用时,如何处理空的HttpContext.Current?

来自分类Dev

如何将Sidekiq与redis一起放置在与应用程序服务器不同的服务器上?

来自分类Dev

NodeJS + Redis + Express + Passport Facebook身份验证失败

来自分类Dev

AWS 上的 Redis 身份验证令牌的 RegExp

来自分类Dev

Keycloak服务器身份验证

来自分类常见问题

.NET Core身份服务器4身份验证VS身份身份验证

来自分类Dev

在同一服务器上将Samba4与OpenLDAP一起使用以对Windows客户端帐户进行身份验证

Related 相关文章

  1. 1

    我可以使用阿波罗联合身份验证只是为了在同一服务器上模块化架构吗?

  2. 2

    如何使用GraphQL构建经过身份验证的查询?

  3. 3

    如何使用GraphQL自定义身份验证类?

  4. 4

    与阿波罗角graphql

  5. 5

    使用GraphQL和Django进行身份验证

  6. 6

    在Ubuntu 12.04上将任何VNC查看器(Windows)与VNC服务器一起使用时身份验证失败

  7. 7

    如何在Slanger上设置Redis身份验证

  8. 8

    如何将我的自定义ServiceStack身份验证提供程序与Redis一起使用?

  9. 9

    Flask:如何使用Flask-Redis和Redis进行身份验证

  10. 10

    GraphQL角形阿波罗客户端。从高速缓存抛出错误中读取,但对服务器进行相同的查询可以正常工作

  11. 11

    如何在Django REST Framework身份验证中使用Graphene GraphQL框架

  12. 12

    用于身份验证的 GraphQL 解析器中间件

  13. 13

    NTLM身份验证-身份验证后,服务器是否发布了任何令牌?

  14. 14

    Relay&GraphQL中的身份验证

  15. 15

    Redis,Node.js和Socket.io:跨服务器身份验证和对node.js的了解

  16. 16

    如何为Redis添加SSL代理和身份验证层

  17. 17

    使用Spring Session Redis时身份验证主体为空

  18. 18

    使用身份验证用户名/密码nodejs连接到托管Redis

  19. 19

    阿波罗graphql突变-JSON输入意外结束

  20. 20

    无法使用Laravel回显服务器,Redis和socket.io对laravel私有通道进行身份验证

  21. 21

    WebRTC是否需要“长期凭证”身份验证机制才能与TURN服务器一起使用?

  22. 22

    Python GraphQL gql客户端身份验证

  23. 23

    将验证过滤器与async / await一起使用时,如何处理空的HttpContext.Current?

  24. 24

    如何将Sidekiq与redis一起放置在与应用程序服务器不同的服务器上?

  25. 25

    NodeJS + Redis + Express + Passport Facebook身份验证失败

  26. 26

    AWS 上的 Redis 身份验证令牌的 RegExp

  27. 27

    Keycloak服务器身份验证

  28. 28

    .NET Core身份服务器4身份验证VS身份身份验证

  29. 29

    在同一服务器上将Samba4与OpenLDAP一起使用以对Windows客户端帐户进行身份验证

热门标签

归档