使用身份验证的 graphql 模式拼接
Posted
技术标签:
【中文标题】使用身份验证的 graphql 模式拼接【英文标题】:graphql schema stitching with auth 【发布时间】:2018-11-08 13:07:10 【问题描述】:我的想法是使用 graphql 和无服务器创建一个微服务方法。
我正在考虑为 dynamodb 中的每个表创建一个服务,然后创建一个 apigateway 服务,并在 apigateway 服务中使用 graphql-tool 将模式拼接在一起。
这项工作非常好,我很满意。
但现在我想为我的 graphql 查询和突变添加授权。
我在 apigateway 中添加了一个自定义授权程序,它从客户端解析 JWT 令牌并将其发送到带有 userId 的 graphql 上下文
但现在我想为我的解析器添加授权。
对此最好的方法是什么?
我希望它尽可能模块化,最好的(我认为)是在 apigatway 服务中添加授权,以便我的其他服务保持清洁。但我不知道怎么做?
有什么想法吗?
【问题讨论】:
【参考方案1】:您可能想从 AWS 中查看 AppSync。它会为你处理很多这样的事情;授权者,查询 DyanmoDB 等。
我使用 Apollo GraphQL 构建了 Lambda API,并通过 API Gateway 公开了它们。然后我使用 Apollo 的模式拼接将它们连接在一起。这里有一个非常重要的警告:slooow。 API 网关已经存在速度损失,虽然这是可以接受的,但想象一下在向用户返回响应之前跳过多个网关。您可以缓存模式,这会有所帮助。当然,您的容忍度取决于您的应用程序和用户体验。也许这很好 - 只有您(或您的用户)可以回答这个问题。
除此之外,我处理身份验证的方式是接受授权标头并手动进行检查。我没有使用 API Gateway 中的任何自定义授权方。我没有为此使用 Cognito,所以它与另一个服务通信。这一切都发生在解析器之前。您为什么要在解析器中进行授权?只有一些你想保护吗?访问控制?
在这种情况下,将自定义授权方添加到 API 网关可能不是最好的...因为您正在讨论在代码中的解析器级别执行此操作。
GraphQL 对所有内容都有一个 POST 端点。因此,这无助于为每个资源配置 API Gateway 身份验证。这意味着您现在已经超越了 API 网关,并且无论如何都可以调用您的 Lambda。您没有阻止调用,因此您现在正在被计费并运行代码。
因此,您不妨编写自定义逻辑来进行身份验证。如果您使用的是 Cognito,那么有一个 SDK 可以帮助您。或者看看 AppSync。
【讨论】:
以上是关于使用身份验证的 graphql 模式拼接的主要内容,如果未能解决你的问题,请参考以下文章
graphql_devise 用于 Rails/Graphql/Apollo/React 中的身份验证。 “字段需要身份验证”错误
JWT 身份验证:使用 UI 令牌对 Graphene/Django (GraphQL) 查询进行身份验证?