【问题标题】:How to use a NextJS app with an existing Node.js backend?如何将 NextJS 应用程序与现有的 Node.js 后端一起使用?
【发布时间】:2022-02-09 18:55:21
【问题描述】:

目前我有一个与我的 create-react-app 项目配合使用的现有 Node.js 后端。
我正在迁移到 NextJS,但有一些问题。

我有一个简单的 JWT 认证流程:

  1. 前端向my-server/api/auth发出请求
  2. 后端对用户进行身份验证,将刷新令牌作为httpOnly cookie 添加到响应头。并返回访问令牌作为响应正文。
  3. 下一次对服务器的调用将在 cookie 中包含访问令牌和刷新令牌。

我的问题是,如果我的 NextJS 应用程序部署到 vercel 域:www.my-nextjs-app.vercel.com,正在向部署到 www.my-backend-app.aws.com 的 aws 的后端应用程序发出请求,那么我的后端设置的 cookie 将不会应用因为 CORS(因为他们考虑了来自不同域的第三方 cookie)。

(如果我在 localhost:3000 本地服务器我的 create-react-app 并在 localhost:5000 向我的本地服务器发出请求也是如此,chrome 不会显示 httpOnly cookie,因为它来自不同的域)

这与我的 create-react-app 不同,后者直接从我的后端在同一域中提供,因此没有第三方 cookie 的问题。

有解决办法吗?

编辑:另外,Next.JS 真的要与现有服务器一起使用吗?或仅无服务器

【问题讨论】:

  • 您的问题遗漏了很多重要的细节。您是否为 OAuth 使用 PKCE 授权代码流?在这种情况下,您可能无法使用 next.js 作为替代品。然而,在这些情况下可以使用 OAuth - 这里有一个这样做的指南:auth0.com/blog/ultimate-guide-nextjs-authentication-auth0
  • 我有两个使用谷歌的 OAuth,和一个简单的电子邮件+密码身份验证
  • 忘记我之前的评论。您的 OAuth 实现依赖于 httpOnly cookie,您已经非常正确地指出它不能跨域。最简单的解决方案可能是使用 DNS(即 CNAME)为您的 vercel 部署提供有效域。

标签: javascript node.js cookies next.js cross-domain


【解决方案1】:

为 ui 和后端使用多个服务器是很常见的。有几种方法可以解决您的问题:

1.在一个域上部署所有东西并设置反向代理(图片来自here

当然,这些组织服务器可以是在不同端口上运行的机器上的不同应用程序。您可以使用 nginx 作为反向代理,配置如下所示:

server {
    listen      80;
    server_name yourapp.com;

    location / {
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_pass http://uiapp.com:3000;
    }

    location /backend/ {
       rewrite ^/backend(/.*)$ $1 break;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_pass http://backendapp.com:8000;
    }
}

如果您想将来自http://yourapp.com/backend/foobar 的请求代理到http://backendapp.com:8000/foobar,则需要rewrite 指令

有关如何设置 nginx 的更多详细信息是 here。但是互联网上还有很多其他的指南。

您还可以为您现有的 node.js 应用使用中间件来代理传递到您的 NextJs 应用。

2.在子域上部署您的后端服务器。如果您为仅限 http 的 cookie 指定 Domain,它们也将被发送到子域。例如。如果使用 yourapp.com 作为域,则 cookie 将在 backend.yourapp.comyourapp.com 上可用

Set-Cookie: name=value; domain=yourapp.com

3.使用 Authorizatin 标头而不是 cookie。在这种情况下,您需要将令牌发送到 UI 应用程序,它会将它们存储在 cookie、sessionStorage 或 localStorage 中,并且您的 UI 应用程序将为您的后端添加带有令牌的 Authorization 标头:

var xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.setRequestHeader('Authorization', 'Bearer ' + token);
return xhr;

当然,在这种情况下,您的后端需要能够接受授权标头中的令牌。

【讨论】:

  • 如果我使用子域,这意味着我的后端和 next.JS 应用程序都需要在同一台机器上运行,不是吗?所以我不能在 vercel 上部署 next.JS 应用程序,例如在 AWS 上部署我的后端
  • 不,每个子域都有自己的 A 和 CNAME dns 记录,因此您可以将每个子域指向不同的机器。
猜你喜欢
  • 2022-01-24
  • 2019-06-16
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多