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

时间:2017-11-14 02:07:31

标签: microservices apollo apollo-client apollo-server graphql-subscriptions

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

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

我唯一能想到的就是在每次广播时都有某种权限对象字段,并使用graphql对auth服务进行验证。似乎不对。我希望我的auth在微服务中完成。任何指向我正确方向的东西都会令人惊叹。

1 个答案:

答案 0 :(得分:0)

假设您在客户端中也使用了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

希望有所帮助。