如何在发送包含要设置的 headers 和来自后端 (Node.js) 的重定向 url 的响应时为客户端(浏览器)设置 HTTP headers?

How to set HTTP headers for client (browser) while sending a response containing the headers to be set and the redirect url from backend (Node.js)?

如果我在这里遗漏了一些非常基本的东西,我真的很抱歉,但是……

BRIEF:我的问题与此处发现的问题相同:,Khan 先生的回答只是没有解释如何设置 headers 来自后端 (Node.js)。我会在那里发表评论,但我没有足够的 Karma :(

这是我到目前为止所做的:

const newTokens = await jwt.generateJWT(user); // generateJWT is a custom function that returns two tokens
res.setHeader("Authorization", `Bearer ${newTokens.accessToken}`);
res.setHeader("refresh-token", newTokens.refreshToken);

return res.redirect("/member/dashboard");

以上代码能够将 HTTP headers 发送到浏览器,但无法在浏览器上为域设置它们。

在 Firefox 中的响应 headers 是:

HTTP/1.1 302 Found
X-Powered-By: Express
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNjA3MDgyNDlmNjBjNjE1YWU4NTdjMmU4IiwidXNlcl9yb2xlIjoibWVtYmVyIiwidXNlcl9uYW1lIjoiQWxleCIsImlhdCI6MTYxNzk5OTM5NywiZXhwIjoxNjE3OTk5OTk3fQ.Odb6TrWBnf9dq00T_ddxD9hqVjhFQYdqA5pP2u6y-2k
refresh-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNjA3MDgyNDlmNjBjNjE1YWU4NTdjMmU4IiwiaWF0IjoxNjE3OTk5Mzk3LCJleHAiOjE2MTc5OTk5OTd9.kY9DZWprHxZFMI3btX-yzZxiUrqZY3kdmxzyc3apAyw
Location: /member/dashboard
Vary: Accept
Content-Type: text/html; charset=utf-8
Content-Length: 78
Date: Fri, 09 Apr 2021 20:16:37 GMT
Connection: keep-alive

注意:“授权”和“refresh-token”headers已发送,重定向“位置” 也已设置导致 302 状态代码。

不幸的是,headers 似乎没有返回来自客户端的所有后续请求,因为 headers 没有被设置。

如果我做错了什么,请告诉我。

编辑:我试图直接从后端执行此操作的原因是我不想依赖前端来处理这项工作,因为我不打算实施 framework-specific 前端,即它应该适用于所有框架。

PS: 如果我的英语不好,请原谅我,这不是我的母语。

当您执行 res.redirect() 时,浏览器不会将您在该响应中设置的 headers 应用到重定向请求。那些 headers 是对请求客户端的响应的一部分,仅此而已。它们不会与重定向请求一起发送。

服务器无法控制重定向请求上的

Headers。浏览器不会那样工作,所以如果您依赖标准浏览器作为客户端,您就不能那样设计东西。

如果您正在使用重定向并且希望通过重定向发送回某些内容,那么您最好的选择通常是将内容放入 cookie 或重定向的查询字符串中 URL。该 cookie 或查询字符串将与重定向请求一起发送,服务器可以从那里获取它。

您还可以建立一个 server-side session 并将数据放入 session。这将设置一个 session cookie,它将出现在未来的客户端请求中,然后服务器可以在来自该客户端的未来请求中访问来自 server-side session object 的数据。