← Cloudflare for Platforms / cloudflare-for-platforms / workers-for-platforms / configuration
Outbound Workers
Outbound Workers располагаются между Workers вашего клиента и публичным интернетом. Они дают вам полный обзор всего исходящего fetch() запросы от пользовательских Workers.
Общие сценарии использования
Outbound Workers можно использовать для:
- Ведите журнал всех подзапросов, чтобы выявлять вредоносные домены или подозрительные шаблоны использования.
- Создавайте списки разрешённых или блокируемых имён хостов, которые запрашивают пользовательские Workers.
- Настройте аутентификацию к своим API в фоновом режиме (чтобы конечным разработчикам не нужно было задавать учётные данные).
Используйте Outbound Workers
Использование Outbound Workers:
- Создайте Worker, который будет выполнять роль вашего Outbound Worker.
- Outbound Worker можно указать как необязательный параметр в dispatch namespaces binding в конфигурации проекта конфигурационный файл Wrangler. При необходимости имена переменных для передачи данных из dynamic dispatch Worker в Outbound Worker можно указать в параметры.
Убедитесь, что у вас есть [email protected] или новее установлен.
{
"dispatch_namespaces": [
{
"binding": "dispatcher",
"namespace": "<NAMESPACE_NAME>",
"outbound": {
"service": "<SERVICE_NAME>",
"parameters": [
"params_object"
]
}
}
]
}[[dispatch_namespaces]]
binding = "dispatcher"
namespace = "<NAMESPACE_NAME>"
[dispatch_namespaces.outbound]
service = "<SERVICE_NAME>"
parameters = [ "params_object" ]- Измените свой динамический dispatch Worker так, чтобы он вызывал Outbound Worker, и объявите переменные, которые нужно передать
dispatcher.get().
export default {
async fetch(request, env) {
try {
// parse the URL, read the subdomain
let workerName = new URL(request.url).host.split(".")[0];
let context_from_dispatcher = {
customer_name: workerName,
url: request.url,
};
let userWorker = env.dispatcher.get(
workerName,
{},
{
// outbound arguments. object name must match parameters in the binding
outbound: {
params_object: context_from_dispatcher,
},
},
);
return await userWorker.fetch(request);
} catch (e) {
if (e.message.startsWith("Worker not found")) {
// we tried to get a worker that doesn't exist in our dispatch namespace
return new Response("", { status: 404 });
}
return new Response(e.message, { status: 500 });
}
},
};- Теперь Outbound Worker будет вызываться при любом
fetch()запросы от пользовательского Worker. Пользовательский Worker вызовет FetchEvent на Outbound Worker. Переменные, объявленные в привязке, доступны в Outbound Worker черезenv.<VAR_NAME>.
Ниже приведён пример Outbound Worker, который записывает в журнал запрос fetch от пользовательского Worker и создаёт JWT, если запрос fetch соответствует api.example.com.
export default {
// this event is fired when the dispatched Workers make a subrequest
async fetch(request, env, ctx) {
// env contains the values we set in `dispatcher.get()`
const customer_name = env.customer_name;
const original_url = env.url;
// log the request
ctx.waitUntil(
fetch("https://logs.example.com", {
method: "POST",
body: JSON.stringify({
customer_name,
original_url,
}),
}),
);
const url = new URL(original_url);
if (url.host === "api.example.com") {
// pre-auth requests to our API
const jwt = make_jwt_for_customer(customer_name);
let headers = new Headers(request.headers);
headers.set("Authorization", `Bearer ${jwt}`);
// clone the request to set new headers using existing body
let new_request = new Request(request, { headers });
return fetch(new_request);
}
return fetch(request);
},
};