代理
概览
Backstage 后端附带一个基本 HTTP 代理,可以帮助前端插件代码访问后端服务 API。 请参见调用现有的应用程序接口以了解何时使用代理是与 API 通信的最佳选择。
开始
该插件已添加到默认的 Backstage 项目中。
在packages/backend/src/index.ts
:
const proxyEnv = useHotMemoize(module, () => createEnv('proxy'));
const service = createServiceBuilder(module)
.loadConfig(configReader)
/** ... other routers ... */
.addRouter('/proxy', await proxy(proxyEnv));
配置
代理插件的配置位于proxy
的根密钥app-config.yaml
锉刀
例如
# in app-config.yaml
proxy:
endpoints:
/simple-example: http://simple.example.com:8080
'/larger-example/v1':
target: http://larger.example.com:8080/svc.v1
headers:
Authorization: ${EXAMPLE_AUTH_HEADER}
# ...or interpolating a value into part of a string,
# Authorization: Bearer ${EXAMPLE_AUTH_TOKEN}
代理配置项下的每个键都是要匹配的路由,位于代理插件挂载的前缀下方。 如果不是以斜线开头 ,则会自动加上一个前缀。 例如,如果后端将代理插件挂载为/proxy
,上述配置将导致代理在处理后端请求时向/api/proxy/simple-example/...
和/api/proxy/larger-example/v1/...
.
每个路由内部的值要么是一个简单的 URL 字符串,要么是一个对象,其格式为http 代理中间件.
如果值是字符串,则假定它对应于
target: <the string>
changeOrigin: true
pathRewrite:
'^<url prefix><the string>/': '/'
当目标是一个对象时,它被逐字赋予http-proxy-middleware
但为方便起见,有以下说明:
- 如果未指定
changeOrigin
,则将其设置为true
。 这是最常用的值。 如果未指定pathRewrite
,则将其设置为删除整个前缀和路由的单一重写。 在上例中,添加了'^/api/proxy/larger-example/v1/': '/'
的重写。这意味着对/api/proxy/larger-example/v1/some/path
的请求将被翻译为对http://larger.example.com:8080/svc.v1/some/path
的请求。
还有其他设置:
allowedMethods
: 限制转发的 HTTP 方法。 例如,allowedMethods: ['GET']
强制只读访问。allowedHeaders
: 应该转发到目标和从目标接收的头信息列表。
默认情况下,代理只会向目标转发安全的 HTTP 请求标头。 这些标头基于被认为对 CORS 安全的标头,包括以下标头content-type
或last-modified
以及代理设置的所有标头。 如果代理应该转发其他标头,如authorization
必须通过allowedHeaders
例如allowedHeaders: ['Authorization']
这将有助于避免 意外转发Secret标头 (cookie
,X-Auth-Request-User
)给第三方。
同样的逻辑也适用于从目标发送回前端的标头。