如何将授权标头添加到用户请求并使用 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在传入的http请求标头中添加授权令牌[关闭]

如何将授权标头添加到 Angular http 请求?

无法使用 Angular 7 将授权标头发送到节点 11/Express 4 服务器

如何使用授权标头发出 GET CORS 请求

如何使用 Express 和 Apollo-Server 获取 HTTP 授权标头

JwtModule 不添加授权标头