Skip to main content
Direct signer integration uses:
  1. GET .../signer/routing — fetch the DMZ URL and webhook URL for your app.
  2. @pymthouse/builder-sdk/signer/server — proxy signing requests directly to the remote signer DMZ with JWT minting.
  3. @pymthouse/builder-sdk/signer/webhook — handle go-livepeer identity webhook calls (POST /authorize) to authenticate end-users.

Token lifecycle

The following diagram shows how a signing request flows from the app backend through PymtHouse to the remote signer DMZ:

Fetch signer routing config

Returns the remote DMZ URL, JWKS URL, webhook URL, and metering mode for the app. Response:
SDK:

Direct DMZ proxy (@pymthouse/builder-sdk/signer/server)

Use createDirectSignerProxyHandler to build an HTTP handler in your backend that:
  1. Mints a user JWT (or signer session) via the Builder API or OIDC.
  2. Forwards the original signing request to the remote DMZ with the JWT as the Bearer token.
  3. Streams the response back to the caller.

Low-level helpers

For custom forwarding logic:

Device and API key exchange handlers

For CLI device flows and API key integrations, builder-sdk provides purpose-built handlers:

Identity webhook (@pymthouse/builder-sdk/signer/webhook)

go-livepeer calls POST /authorize (configured via -remoteSignerWebhookUrl) for every signing request to verify the end-user’s credentials and receive an auth_id for usage attribution.

Setup

End-user auth adapters

The webhook handler is split into two layers:
  • Transport auth — validates the go-livepeer shared secret (WEBHOOK_SECRET) that proves the request came from your DMZ, not an arbitrary caller.
  • End-user auth (EndUserAuthVerifier) — validates the end-user’s credential in the signing request and resolves it to a UsageIdentity.
Four built-in adapters are provided:

API key adapter

Custom verifier

Implement the EndUserAuthVerifier interface for any custom auth scheme:

Webhook environment variables


Security guidance

  • WEBHOOK_SECRET authenticates that the signing request came from your go-livepeer DMZ instance. Rotate it if the DMZ is compromised.
  • The end-user EndUserAuthVerifier authenticates the user making the signing request. Keep the two auth layers separate — webhook secret is transport; end-user auth is identity.
  • Configure the go-livepeer DMZ with -remoteSignerWebhookUrl pointing to your /authorize endpoint and -remoteSignerWebhookSecret matching WEBHOOK_SECRET.
  • The DMZ validates JWTs against the JWKS URL from getSignerRouting() — ensure jwksUrl is reachable from the DMZ host.