如何在 Next.js + Graphql 解耦架构中转发用户会话?

How to forward user sessions in Next.js + Graphql decoupled architecture?

我正在构建一个 next.js 项目,虽然我通常只使用 "Custom Express Server" method to implement my graphql API (using apollo-server-express),但我认为分离 next.js 项目可能是个好主意来自 graphql API 这样每个服务器都托管在不同的机器上。

但通常我会在 graphql API 中实现任何与会话相关的逻辑,使用类似 graphql-passport 的东西;我认为这是一个很好的做法,因为如果我选择添加另一个前端(可能是移动应用程序或其他东西),它们可以共享相同的会话逻辑。但是考虑到我在服务器端使用 next.js 呈现内容,我如何将用户的会话信息转发到 graphql 服务器? 因为 next.js 服务器不应该不用重做认证吧?

如果架构中也有任何缺陷,请告诉我,我是新手。

使用下一个服务器 运行 GraphQL 服务肯定是 not a good idea,所以是的,请将两者分开。

让 Next 服务器 SSR-render 使用用户 session 包含用户特定内容的页面可能也不是一个好主意,除非您有一些特定的用例需要服务 HTML 页面中已经包含用户特定数据。原因是:

  • SSR 呈现将需要大量服务器端计算,因为所有页面总是必须重新呈现。

  • NextJS 正在远离(自 v9.3 起)getInitialPros() 的做事方式,转向使用 getStaticProps() 生成对所有用户通用的页面,并且一旦显示在客户端设备上,就可以直接从 GraphQL API 加载其 session 相关内容。

这种方法通常具有更高的性能和更好的规模。

如果您真的想走 "SSR with user session data" 路线,您可以在 getServerSideProps(context) 方法中开始,其中 context.req 是实际请求,其中包含您所有的 session 数据在其中(cookies 或 headers)。

然后您可以从 req 中提取此 session 数据并将其传递给需要身份验证的 GraphQL 服务器请求。