【问题标题】:Struggling with apollo-link-ws x-api-key authorization苦苦挣扎 apollo-link-ws x-api-key 授权
【发布时间】:2018-12-13 05:46:10
【问题描述】:

我正在使用 Apollo 连接到使用 API 密钥保护的 AWS Appsync API。通过 http 进行查询和突变没有问题,但我在使用 websocket 进行订阅时处于陌生领域。

使用 apollo-link-ws 我有以下内容,但我不知道如何添加 API 密钥。有哪位好心人能给点建议吗?

const ws = new WebSocketLink({
      uri: `wss://xxxxx.appsync-api.eu-west-1.amazonaws.com/graphql`,
      options: {
        reconnect: true
      }
    });

顺便说一句,我假设 wss 的 url 与 http.... 的 url 相同。

【问题讨论】:

  • 这行不通。 GraphQL 将订阅传输留给实现,因此它没有在规范中定义,并且您在上面的代码中定义的 WSS 链接将失败,因为在 AppSync 中授权所需的握手尚未发生。强烈建议您使用 AppSync SDK 或反向工程它的连接握手,因为代码是 OSS。
  • 谢谢。我想这就是我要寻找的答案!

标签: websocket apollo apollo-client aws-appsync


【解决方案1】:

授权通常基于 connectionParams,但 AWS 决定采用不同的方式,他们使用 REST 和自定义标头实现了 some shady way

问题是 Websockets doesn't support custom headers。是什么让与 Apollo 集成变得困难。

AppSync 的缺陷远不止这一点。无论如何,我不会推荐它用于比博客或聊天更雄心勃勃的东西。 This article 更好地解释它的一些缺点。

【讨论】:

    【解决方案2】:

    您是否查看过“构建 JavaScript 客户端应用程序”的 AppSync 指南:https://docs.aws.amazon.com/appsync/latest/devguide/building-a-client-app-javascript.html

    使用 AWSAppSyncClient 可以轻松设置订阅。它在设置订阅时自动使用 websockets。

    在将 AppSync 订阅与 Apollo 一起使用时,我什至没有意识到 apollo-link-ws 和此类复杂性。我只有使用 React 客户端订阅 AppSync 的经验,但纯 JavaScript 的使用似乎比较简单。

    来自指南中的示例:

    const client = new AWSAppSyncClient({
        url: url,
        region: region,
        auth: {
            type: type,
            credentials: credentials,
        }
    });
    
    client.hydrated().then(function (client) {
        //Now subscribe to results
        const observable = client.subscribe({ query: subquery });
    
        const realtimeResults = function realtimeResults(data) {
            console.log('realtime data: ', data);
        };
    
        observable.subscribe({
            next: realtimeResults,
            complete: console.log,
            error: console.log,
        });
    });
    
    // Set up a subscription query
    const subquery = gql(`
    subscription NewPostSub {
    newPost {
        __typename
        id
        title
        author
        version
    }
    }`);
    

    对于 Node.js 的使用,该指南还展示了如何在示例代码中设置 global.WebSocket 和此类依赖项。

    【讨论】:

    • 请看我之前的评论。这是关于阿波罗的问题。我正在寻找的只是添加 API 密钥的示例。我对 Appsync 不感兴趣,因为我希望能够与其他后端一起工作。
    • @Kwoxford 是的,我看到了您之前的评论,使用 AWSAppSyncClient 而不是 Amplify 应该可以让您拥有更多的控制权。使用 AppSync 以外的其他后端没有明确提及。无论如何,您可能会考虑创建一个接口并在后台使用 AWSAppSyncClient,但可能有更简单的方法。当原因是一个不清楚的问题时,请停止对错误的答案投反对票。郑重声明,该问题因不清楚而被否决。
    • 对我来说似乎很清楚。 “我不知道如何添加 API Key。”我还说“我对 Appsync 不感兴趣,因为我希望能够与其他后端一起工作”。有什么不清楚的地方?我不明白为什么人们对这个问题提出质疑而不是回答它。
    【解决方案3】:

    apollo-ws-link 不直接用于 AWS AppSync 订阅。查看AWS Amplify GraphQL client,它使用 AppSync 处理授权以及订阅。这应该可以让您的应用在几分钟内使用 AppSync。

    如果您想实现自己的订阅客户端,握手记录在 Amplify library 中。

    【讨论】:

    • 谢谢,但它必须是阿波罗。我想要一个最终与后端无关的设置。我的问题是如何将 API Key 授权添加到 Apollo-ws-link。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多