Skip to main content

代理

概览

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-typelast-modified以及代理设置的所有标头。 如果代理应该转发其他标头,如authorization必须通过allowedHeaders例如allowedHeaders: ['Authorization']这将有助于避免意外转发Secret标头 (cookie,X-Auth-Request-User)给第三方。

同样的逻辑也适用于从目标发送回前端的标头。