通过添加从另一个请求返回的身份验证令牌来修改 http 代理请求
Modify http proxy request by adding auth token returned from another request
我正在使用 http-proxy-middleware (https://github.com/chimurai/http-proxy-middleware#http-proxy-events) 实现一个简单的代理(称之为 my-proxy/
)到另一个 REST API(称之为 /rest-api
) 要求用户在 HTTP header auth-token
中传递身份验证令牌。可以使用 body.
中的凭据从端点 POST /rest-api/auth
获取令牌
我希望我的代理接收传入请求并检查请求 header 中是否设置了 auth-token
,如果未设置,则执行 POST /rest-api/auth
以检索令牌并设置 auth-token
在 header 之前将请求传递给 rest-api/
.
在我指定的代理配置中
onProxyReq: function (proxyReq, req, res) {
if (!req.header("auth-token")) {
const authRequest = request({
url: 'rest-api/auth',
method: 'POST',
json: {"username": "user", "password": "pass"}
},
function (error, resp, body) {
proxyReq.setHeader("auth-token", body.token)
}
);
}
}
我可以看到 body.token
return 正确的令牌。但是,setHeader
调用失败并显示 Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
。
我认为这意味着我修改的请求在等待回调之前已经发送到rest-api/
,但我不知道在我的场景中如何最好地解决这个问题。
有什么帮助吗?
我今天遇到了同样的问题。我通过使用单独的中间件(在 http 代理之前)解决了这个问题。
伪代码
// fix token stuff here in a separate middleware
app.use('/api', async (req, res, next) => {
if (!req.session.token) {
const resToken = await axios.post(token_url, data, options)
req.session.token = resToken.data
}
next()
}
// proxy middleware options
const proxyOptions = {
target: config.gateway.url, // target host
changeOrigin: true,
pathRewrite: function(path, req) {
return path.replace('/api', '')
},
onProxyReq: function onProxyReq(proxyReq, req, res) {
// add custom header to request
let token = req.session.token
if (token) {
proxyReq.setHeader('Authorization', `bearer ${token.access_token}`)
}
},
logLevel: 'debug',
}
app.use(proxy('/api', proxyOptions))
希望对您有所帮助!
我正在使用 http-proxy-middleware (https://github.com/chimurai/http-proxy-middleware#http-proxy-events) 实现一个简单的代理(称之为 my-proxy/
)到另一个 REST API(称之为 /rest-api
) 要求用户在 HTTP header auth-token
中传递身份验证令牌。可以使用 body.
POST /rest-api/auth
获取令牌
我希望我的代理接收传入请求并检查请求 header 中是否设置了 auth-token
,如果未设置,则执行 POST /rest-api/auth
以检索令牌并设置 auth-token
在 header 之前将请求传递给 rest-api/
.
在我指定的代理配置中
onProxyReq: function (proxyReq, req, res) {
if (!req.header("auth-token")) {
const authRequest = request({
url: 'rest-api/auth',
method: 'POST',
json: {"username": "user", "password": "pass"}
},
function (error, resp, body) {
proxyReq.setHeader("auth-token", body.token)
}
);
}
}
我可以看到 body.token
return 正确的令牌。但是,setHeader
调用失败并显示 Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
。
我认为这意味着我修改的请求在等待回调之前已经发送到rest-api/
,但我不知道在我的场景中如何最好地解决这个问题。
有什么帮助吗?
我今天遇到了同样的问题。我通过使用单独的中间件(在 http 代理之前)解决了这个问题。
伪代码
// fix token stuff here in a separate middleware
app.use('/api', async (req, res, next) => {
if (!req.session.token) {
const resToken = await axios.post(token_url, data, options)
req.session.token = resToken.data
}
next()
}
// proxy middleware options
const proxyOptions = {
target: config.gateway.url, // target host
changeOrigin: true,
pathRewrite: function(path, req) {
return path.replace('/api', '')
},
onProxyReq: function onProxyReq(proxyReq, req, res) {
// add custom header to request
let token = req.session.token
if (token) {
proxyReq.setHeader('Authorization', `bearer ${token.access_token}`)
}
},
logLevel: 'debug',
}
app.use(proxy('/api', proxyOptions))
希望对您有所帮助!