使用auth进行graphql架构拼接

时间:2018-05-29 19:39:59

标签: graphql apollo serverless serverless-architecture graphql-tools

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

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

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

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

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

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

最佳方法是什么?

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可能想从AWS看一下AppSync。它会为您处理很多事情;授权者,查询DyanmoDB等。

我已经使用Apollo GraphQL构建了Lambda API,并通过API Gateway公开了它们。然后,我使用Apollo的模式缝合将它们连接在一起。这里有一个非常重要的警告: slooow 。 API网关已经存在速度上的损失,虽然可以接受,但请先跳过多个网关,然后再将响应返回给用户。您可以缓存架构,这会有所帮助。当然,您的容忍度取决于您的应用和用户体验。也许还好-只有您(或您的用户)可以回答。

除了那条笔记,我处理auth的方式是接受Authorization标头并手动进行检查。我没有使用API​​ Gateway的任何自定义授权者。我没有为此使用Cognito,因此它与另一项服务进行了交谈。这一切都发生在解析器的之前。您为什么要在解析程序中进行授权?您只想保护一些吗?访问控制?

在这种情况下,最好不要将自定义授权者添加到API Gateway ...因为您正在谈论在代码的解析器级别执行此操作。

GraphQL对所有内容都有一个POST端点。因此,这不会帮助配置每个资源的API网关身份验证。这意味着您现在已经超出了API网关的范围,而且无论如何都无法进行Lambda的调用。您没有阻止调用,因此现在可以向您收费并运行代码。

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