Relay 和 GraphQL 中的身份验证

Authentication in Relay & GraphQL

我一直在开发一个使用 React 和 Relay 的应用程序,现在我被困在实现身份验证上。

我知道您可以通过 GraphQL 解析函数中可用的上下文将值传递给每个 graphql 请求。

我更困惑应该传递什么以及如何传递。

使用 JSON 网络令牌、护照或其他东西更好吗?我应该如何为用户传递标识符?

基本上就是我要问的, 什么最适合 Relay:jwt,passport,还是别的?以及如何将其与中继连接起来。谢谢!

我认为最好的办法是研究一些入门工具包。不幸的是,这些工具包中几乎 none 提供了完整的 JWT 实现——其中许多似乎只完成了一半。

查看:

  • Relay Authentication。您的里程可能会有所不同 - 它涵盖了整个概念,但有一些错误。
  • Universal Relay Boilerplate。那个非常惊人和完整但是是一个野兽并且可能有点难以处理因为它还包括 iOS/Android 应用程序创建。
  • Relay Starter Kit。在撰写本文时,它只有 FB 身份验证设置(因此没有有效的常规登录表单),它确实设置了 JWT cookie。我相信将他们所有的登录路由迁移到 GraphQL 都在路线图上,因为现在它有点混合。

至于你的 jwt/passport 问题。它们并不相互排斥。 Passport 可以处理 jwt 身份验证,但我个人不使用它并直接使用 jwt 库。做起来并不难 - 您可以在 Relay Starter Kit 的 server 文件中看到它。

JWT 令牌通常在 headers 周围传递,但是已经转向将这些令牌存储在 HttpOnly cookie 中(请参阅此 article)。该方法的好处是您无需处理使用 Relay 传递令牌的问题。

我是 cyberwombats answer 中第一个示例的作者,目前正在开发一个新的 universal relay starter kit. It has authentication via AWS Cognito included and there is a FB login via Cognito, though it's not fully working yet。它使用 Cognito 发行的 JWT 令牌。

如果您需要自己实施身份验证工作流程而不是使用 Cognito 或 Auth0 或类似服务,Passport 也可能是替代方案。您可以实现一个(单独的)auth 服务器,公开 auth 端点,如登录等。该服务器可以在 cookie 中设置 JWT,该 cookie 可以在 GraphQL 服务器上用于身份验证。

初学者工具包仍在开发中(例如,刷新令牌尚未使用),但已经可以使用了。