Relay 和 GraphQL 中的身份验证

Posted

技术标签:

【中文标题】Relay 和 GraphQL 中的身份验证【英文标题】:Authentication in Relay & GraphQL 【发布时间】:2016-12-01 18:49:31 【问题描述】:

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

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

我对传递什么以及如何传递更加困惑。

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

基本上我在问什么, 什么最适合 Relay:jwt、护照、其他?以及如何将其与继电器连接起来。谢谢!

【问题讨论】:

我们对 Auth0 的体验非常好 - 设置或多或少是微不足道的。 【参考方案1】:

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

退房:

Relay Authentication。您的里程可能会有所不同 - 它涵盖了整个概念,但有一些错误。 Universal Relay Boilerplate。那是相当惊人的和完整的,但它是一个野兽,工作可能有点不知所措,因为它还包括 ios/android 应用程序的创建。 Relay Starter Kit。在撰写本文时,它只有 FB auth 设置(因此没有正常的登录表单),它确实设置了一个 JWT cookie。我相信将他们所有的登录路由迁移到 GraphQL 已经在路线图上,因为现在它有点混合。

就您的 jwt/护照问题而言。它们不是相互排斥的。 Passport 可以处理 jwt 身份验证,尽管我个人不使用它并直接使用 jwt 库。这并不难 - 您可以在 Relay Starter Kit 的 server 文件中看到它。

JWT 令牌通常在标头周围传递,但是已经转向将这些令牌存储在 HttpOnly cookie 中(参见 article)。该方法的好处是您不需要处理通过 Relay 传递令牌。

【讨论】:

jwt和passport不互斥是什么意思?他们现在是两种不同的用户身份验证方式吗?为什么我会同时使用两者? Passport 是一个通用的身份验证工具,它有插件来处理本地身份验证(标准用户名/密码,可能是您提到 Passport 时所指的)、facebook、jwt 等。它没有规定特定的方法。特别是在处理更复杂的 FB/twitter auth 场景时,它很方便。但是如果您愿意,所有这些身份验证方法,包括 jwt,都可以在没有护照的情况下处理。 出于某种原因,我将护照与基于会话的身份验证混合在一起,所以我不明白它与基于令牌的身份验证(如 jwt)有什么关系,谢谢! 另外这里有一个关于 SO 的类似讨论:***.com/questions/34796788/… 谢谢,你太棒了:)【参考方案2】:

我是cyberwombats answer中第一个示例的作者,目前正在开发一个新的universal relay starter kit。它包含通过 AWS Cognito 进行的身份验证,并且通过 Cognito 进行了 FB 登录,尽管它是 not fully working yet。它使用 Cognito 发行的 JWT 令牌。

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

入门工具包仍在开发中(例如,尚未使用刷新令牌),但它已经有点可用了。

【讨论】:

以上是关于Relay 和 GraphQL 中的身份验证的主要内容,如果未能解决你的问题,请参考以下文章

graphql_devise 用于 Rails/Graphql/Apollo/React 中的身份验证。 “字段需要身份验证”错误

GraphQL 中的社交身份验证

如何使用 graphql 和护照设置身份验证但仍使用 Playground

使用 Passport 的 Express 服务器、ReactJS 和 Relay 应用程序的身份验证策略

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

在 Relay Modern 中处理身份验证