使用 graphql 订阅和微服务的授权(不是身份验证!)模式

Posted

技术标签:

【中文标题】使用 graphql 订阅和微服务的授权(不是身份验证!)模式【英文标题】:Authorization (not authentication!) patterns with graphql-subscriptions and microservices 【发布时间】:2018-04-26 20:34:24 【问题描述】:

我已经创建了一个带有 graphql-subscriptions 的 apollo-server,到目前为止一切都很好。我可以在前端接收出版物。太好了!

我现在要做的只是将出版物发送给授权用户,因此,需要进行某种逻辑/测试。但是在哪里以及如何?我见过的所有示例和事情都涉及盲目地从 redis 服务器接收消息,并将其设置回客户端。我可以测试哪个用户登录了,但是现在呢?各个微服务将与身份验证/用户服务对话,并据此决定允许的操作。没问题。但是如何阻止 redis 广播到达错误的用户? apollo-server 所做的只是监听来自 redis 的消息——而不是验证它们。

我真正能想到的唯一一件事是在每次广播中都有某种权限对象字段,并使用 graphql 来针对身份验证服务对其进行验证。似乎不对。我希望我的身份验证在微服务中完成。任何将我指向正确方向的东西都会很棒。

【问题讨论】:

不确定它是否对您有帮助,但这就是我所做的:每个通知/消息/事件源都指定消息的目标用户 ID 或 null。 nodejs 服务器(所有客户端都连接到的服务器,充当代理)仅将消息发送给使用该用户 ID 进行身份验证的客户端。如果用户 ID 是null,则广播消息。当需要将消息发送给多个用户时,消息会成倍增加。我使用 Web 客户端 (html/JS)、php 后端和 nodejs 作为服务器发送端点。 这确实有很大帮助!谢谢。所以在我的情况下,apollo-server 是代理,所以每个微服务都应该在发送消息之前进行授权检查?我猜这意味着代理中存在用户服务依赖关系? 【参考方案1】:

假设您也在客户端中使用 Apollo,您可以将用于身份验证的令牌或任何其他参数发送到 websocket 连接。 你可以在这里阅读更多: https://www.apollographql.com/docs/react/features/subscriptions.html#authentication

然后您可以在 Apollo Server 中对用户进行身份验证,例如 onConnect: https://www.apollographql.com/docs/graphql-subscriptions/authentication.html

您还可以将一些声明放入令牌中,这些声明定义用户是否可以连接、发布或接收消息,然后将令牌或经过验证的用户传递给 Redis,否则您将相应地调用您的用户/身份验证服务来验证用户然后继续。

您还可以在解析订阅/消息的​​ onOperation 中添加验证,以验证例如用户订阅频道/主题。 我强烈建议您将其作为一个很好的示例阅读: https://medium.com/react-native-training/building-chatty-part-7-authentication-in-graphql-cd37770e5ab3

希望对您有所帮助。

【讨论】:

以上是关于使用 graphql 订阅和微服务的授权(不是身份验证!)模式的主要内容,如果未能解决你的问题,请参考以下文章

授权和微服务

使用身份验证的 graphql 模式拼接

GraphQL 服务器中的授权

如何在 jest / apollo 客户端中捕获被拒绝的 graphql 订阅?

使用 flask-jwt-extended + ariadne (graphql) + react 设置身份验证/授权

使用 Django GraphQL JWT 和 Graphene Relay 进行身份验证和授权