首页 > 解决方案 > 使用身份验证的 graphql 模式拼接

问题描述

我的想法是使用 graphql 和无服务器创建一个微服务方法。

我正在考虑为 dynamodb 中的每个表创建一个服务,然后创建一个 apigateway 服务,并在 apigateway 服务中使用 graphql-tool 将模式拼接在一起。

这项工作非常好,我很满意。

但现在我想为我的 graphql 查询和突变添加授权。

我在 apigateway 中添加了一个自定义 autherizer,它从客户端解析 JWT 令牌并将其发送到带有 userId 的 graphql 上下文

但现在我想为我的解析器添加授权。

最好的方法是什么?

我希望它尽可能模块化,最好(我认为)是在 apigatway 服务中添加授权,以便我的其他服务保持清洁。但我不知道怎么做?

有任何想法吗?

标签: graphqlapolloserverlessserverless-architecturegraphql-tools

解决方案


您可能想从 AWS 中查看 AppSync。它会为你处理很多这样的事情;授权人,查询 DyanmoDB 等。

我使用 Apollo GraphQL 构建了 Lambda API,并通过 API Gateway 公开了它们。然后我使用 Apollo 的模式拼接将它们连接在一起。这里有一个非常重要的警告:它很。API 网关已经存在速度损失,虽然这是可以接受的,但想象一下在向用户返回响应之前跳过多个网关。您可以缓存模式,这会有所帮助。当然,您的容忍度取决于您的应用程序和用户体验。也许这很好 - 只有您(或您的用户)可以回答这个问题。

除了那条注释,我处理身份验证的方式是接受授权标头并手动进行检查。我没有使用 API Gateway 中的任何自定义授权方。我没有为此使用 Cognito,所以它与另一个服务通信。这一切都发生解析器之前。您为什么要在解析器中进行授权?只有一些你想保护吗?访问控制?

在这种情况下,将自定义授权方添加到 API Gateway 可能不是最好的……因为您正在讨论在代码中的解析器级别执行此操作。

GraphQL 对所有内容都有一个 POST 端点。因此,这无助于为每个资源配置 API Gateway 身份验证。这意味着您现在已经超越了 API 网关,并且无论如何都可以调用您的 Lambda。您没有阻止调用,因此您现在正在被计费并运行代码。

因此,您不妨编写自定义逻辑来进行身份验证。如果您使用的是 Cognito,那么有一个 SDK 可以帮助您。或者看看 AppSync。


推荐阅读