如何将授权标头添加到用户请求并使用 express 将其代理到另一个服务器 api
Posted
技术标签:
【中文标题】如何将授权标头添加到用户请求并使用 express 将其代理到另一个服务器 api【英文标题】:How to add a authorization header to a user request and the proxy it to another server api with express 【发布时间】:2021-06-01 14:08:00 【问题描述】:你看到这是怎么回事,客户端有一个带有 http only 标志的 cookie,其中有一个 JWT 将被 API 服务器用来授权请求,问题是 JWT 应该在 Authorization 标头中,所以我使用中间服务器来捕获客户端请求,提取 JWT 从 cookie 中,在客户端请求中设置 Authorization Header,然后将请求转发到 API 服务器以获取数据。
主要问题是我不知道如何从 中间服务器 正确设置标头,或者即使这是可能的,因为每次我尝试转发到 API 服务器 这最后一个 Authorization header 未定义,我应该在 middleware server 中设置。
那么,如何设置Authorization Header并正确转发到另一台服务器呢?中间服务器和API服务器都使用NodeJS 和 Express。
这是目前我拥有的中间服务器的代码(不用担心cookie提取部分,这只是测试propuses):
const proxy = require('express-http-proxy');
const express = require('express');
const cors = require('cors');
const app = express();
const PORT = 8083;
app.use(cors());
// app.use(express.json());
app.use('/graphql',
(req, res, next) =>
req.headers['Authorization'] = `Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZFVzZXIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphY2sifQ.5y3IhB4i_THfKZr5BYe6dZruhOUbQt7SRT_rrssApCo`;
next()
,
proxy('http://localhost:8081/graphql'));
app.listen(PORT, () => console.log(`http://localhost:$PORT`));
【问题讨论】:
【参考方案1】:一段时间后寻找另一个答案并阅读文档documentation 我发现包 express-http-proxy 具有我需要的属性,即 proxyReqOptDecorator强>。当您声明代理中间件时,第二个参数是一个具有不同选项(如属性)的对象,proxyReqOptDecorator 接收一个带有 2 个参数的函数:proxyReqOpts 将任何属性附加到请求对象和原始请求对象(据我所知)。
所以,为了解决问题并在forawrd之前将授权标头设置为请求对象,我确实更改了添加属性的代码proxyReqOptDecorator强>:
app.post('/graphql',
proxy('http://localhost:8081/graphql',
proxyReqOptDecorator: function(proxyReqOpts, srcReq)
proxyReqOpts.headers['Authorization'] = `Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZFVzZXIiOiI2MDNjYzM0ZTM2ZTk0MjI0MTNkYzNmZDUiLCJuYW1lIjoiRGFuaWVsIn0._ZJytuJJoG8RM6kki6YZcMlYAh7M0zAZWE54x7i3nhs`;
return proxyReqOpts;
));
好了,问题就解决了。我仍然不知道为什么第一个代码不起作用,以及是否有任何其他方法可以做到这一点,但我希望这对你也有用。
【讨论】:
以上是关于如何将授权标头添加到用户请求并使用 express 将其代理到另一个服务器 api的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Angular 7 将授权标头发送到节点 11/Express 4 服务器