【问题标题】:ExpressJS: When authenticating, do I store the JWT token from the backend or the frontend?ExpressJS:身份验证时,我是从后端存储 JWT 令牌还是从前端存储 JWT 令牌?
【发布时间】:2021-02-02 18:43:04
【问题描述】:

我正在继承一个后端 Express API 和一个前端 React 应用程序。

目前我在我的POST /login API 中使用cookie-parser,如下所示:

    res.cookie('something', 'abc123', {
      maxAge: COOKIE_MAX_AGE
    });

在我的前端应用程序中,有一个检查身份验证令牌是否存在的功能:

export function isAuthCookiePresent() {
  console.log('ALL COOKIES:', cookies.get());
  return (
    cookies.get(AUTH_COOKIE_NAME) && cookies.get(AUTH_COOKIE_NAME) !== null
  );
}

正如预期的那样,我在控制台日志中看到了{ something: 'abc123' }

但是,当我尝试在 Vercel (https://vercel.com/) 中使用自动部署的分支登录时,cookie 丢失了。

我的印象是 cookie 应该设置在前端?但在代码中,cookie 是在后端设置的。而且我在将其传递到前端的代码中看不到任何内容。我以为我会在前端找到类似“成功登录后,执行cookies.set("x-auth-token", res.body.token)”的东西

对我来说很奇怪,它完全可以在本地工作。有人介意解释这是如何工作的吗?我认为cookies存储在客户端的浏览器中。但如果这是真的,为什么 cookie-parser 甚至存在于 express 中,为什么它被用于服务器端?

【问题讨论】:

    标签: javascript node.js cookies


    【解决方案1】:

    但是,当我尝试在 Vercel (https://vercel.com/) 中使用自动部署的分支登录时,cookie 丢失了。

    这是因为您似乎正在设置 cookie 服务器端,据我所知,vercel 只处理客户端,不会让您使用 express。


    我的印象是 cookie 应该设置在前端?但在代码中,cookie 是在后端设置的。而且我在将其传递到前端的代码中看不到任何内容。我以为我会在前端找到类似“成功登录后,执行 cookies.set("x-auth-token", res.body.token)”的东西

    Cookies 实际上可以通过标头 (Set-Cookie: <cookie-name>=<cookie-value>) 设置,这正是 express 的 res.cookie 所做的。 MDN's article on the Set-Cookie header 说:

    Set-Cookie HTTP 响应头用于将 cookie 从服务器发送到用户代理,因此用户代理可以稍后将其发送回服务器。要发送多个 cookie,应在同一个响应中发送多个 Set-Cookie 标头。


    对我来说很奇怪,它完全可以在本地工作。有人介意解释这是如何工作的吗?我认为cookies存储在客户端的浏览器中。但如果这是真的,为什么 cookie-parser 甚至存在于 express 中,为什么它被用于服务器端?

    Cookie 实际上是存储在客户端的。它们可以通过客户端 javascript 和带有 cookie 标头的后端访问。需要cookie-parser 模块来解析Cookie 标头(Cookie - HTTP | MDN)发送的name=value 语法。它被用于服务器端,因为在前端验证 cookie 可以让任何用户为您用于验证 cookie 的 if 语句提供错误的“真”值。


    作为对这个问题的回答:我建议使用后端,因为 JWT 必须进行签名,并且在客户端设置和签名它们将允许任何人签署任意有效负载。

    【讨论】:

    • 感谢您对 Vercel 的解释。所以在本地,鉴于使用res.cookie() 在响应上设置cookie,当我在前端看不到cookie.set(foo, bar) 的任何代码时,前端如何看到它?本地发生的事情和 Vercel 上发生的事情究竟有什么区别?
    • 它在本地使用 HTTP 标头(请参阅HTTP headers - HTTP | MDN)。浏览器解释响应中的标头并使用它来设置 cookie。在 vercel 上,您使用的是无服务器功能吗? (否则无法从后端设置 cookie)。如果我错了,请纠正我,但是vercel不允许您使用express,那么您如何在vercel上启动服务器?
    • 哦,我想我现在得到了 Set-Cookie 的东西!所以我只使用 Vercel 来部署我的前端开发分支,而我的后端服务器位于 Google Cloud 的其他地方。我想我必须找到一种方法来查看 Set-Cookie 是否适用于 Vercel。可能是因为我正在使用res.status(http.OK).json({ redirect: redirectUrl, token }) 重定向它,而我应该做类似于这个人的事情:stackoverflow.com/a/37760690/1555312
    猜你喜欢
    • 2020-03-23
    • 2019-01-29
    • 2019-02-01
    • 1970-01-01
    • 2018-12-07
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多