Next.js s-s-r 存储访问令牌而不使用 redux

Posted

技术标签:

【中文标题】Next.js s-s-r 存储访问令牌而不使用 redux【英文标题】:Next.js s-s-r store access token without using redux 【发布时间】:2019-03-31 01:13:19 【问题描述】:

我已经使用 NextJS 和 ReactJS 实现了一个服务器端渲染应用程序。

当用户登录应用程序时,我想存储一些用户详细信息,例如 访问令牌、刷新令牌、电子邮件地址,并在整个应用程序中使用它。 (有点像我们在客户端渲染应用程序上使用本地存储一样全局存储它)

我没有使用 REDUX,所以我想知道在不使用 REDUX 的情况下存储这些用户详细信息的最佳方式。

在使用 s-s-r 时有哪些不同的方法可以实现这一目标?

【问题讨论】:

【参考方案1】:

我建议使用会话 cookie。这在 next.js getInitialProps 方法中可用。

static async getInitialProps (req) 
  console.log(req.headers.cookies) // depending on your server middlewares / config, this is available

LocalStorage 或 SessionStorage 在 s-s-r 中不可用,而 cookie 始终附加到请求中。我进一步建议制作 cookie secure(仅通过 https 提供)并使用 http-only 防止 JS 客户端/浏览器访问。

当使用express-session 时,使用 cookie/sessions 会更方便。

static async getInitialProps (req) 
  console.log(req.session) // with express session

【讨论】:

处理 cookie 或 session 通常哪种方法比较好?【参考方案2】:
> import cookie from 'cookie'
> 
> export function parseCookies(req)    return cookie.parse(req ?
> req.headers.cookie || "" : document.cookie); 

【讨论】:

您的答案可以通过额外的支持信息得到改进。请“编辑”以添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到更多关于如何写好答案的信息:***.com/help/how-to-answer【参考方案3】:

我最近在做类似的事情。通常,您可以将其存储在存储或 cookie 中。 但是对于nextJS,您可能希望在客户端和服务器端方法中都使用它,例如getServerSideProps。这样您就可以及早检测用户是否登录,在页面呈现之前进行 API 调用(利用 nextJS s-s-r)。

请参阅this discussion,其中明确提到 cookie 是一种方式。 NextJS 的合作者是这样说的:

如果您希望在客户端和服务器上都可以使用数据,您可以使用 cookie。

这是有道理的。 记住getServerSideProps 等方法不会在客户端上运行,也无法访问这些对象:documentwindow 等。

在客户端完成登录后,您可以设置 cookie,如:document.cookie = "cookiename=hello"。这是SO answer

在 getServerSideProps(context) 中,利用 param 上下文,它可以让您访问像 context.req 这样的请求。然后您可以从请求对象中获取 cookie,使用 cookie parser module 或 context.req.headers.cookie

【讨论】:

以上是关于Next.js s-s-r 存储访问令牌而不使用 redux的主要内容,如果未能解决你的问题,请参考以下文章

在 s-s-r 和动态 URL 中使用 Apollo 进行查询 (Next.js)

React-tooltip 和 Next.js s-s-r 问题

Next.js 与 FortAwesome 和 s-s-r

使用 next.js 与传统 s-s-r 进行服务器端渲染

为啥使用 JWT 而不是在 DB 中存储令牌来授权 Node.js 中的访问令牌?

Apollo Client + Next.js 不发送非 s-s-r 请求