LLM proxy
Authorize API clients for Backplane's separate /v1 resource, then call model endpoints with a resource-bound bearer token.
Grant llm::models for model discovery and llm::invoke for inference operations. Request only the scopes the client and user share.
Resource OAuth is additive compatibility: existing PAT and legacy bearer access continue under the deployment's configured authentication policy.
Setup
- Create or select a predefined confidential OAuth client with PKCE S256, enable LLM API (/v1), and assign llm::models and llm::invoke as needed.
- Fetch the protected-resource metadata and make an unauthenticated GET request to the canonical /v1 resource to inspect its challenge.
- Authorize with resource=https://backplane.gsmlg.net/v1, then exchange $CODE with the same resource value and the original $CODE_VERIFIER.
- Send the returned bearer token to /v1 operations and keep provider credentials inside Backplane.
Examples
Discover the LLM resource
curl https://backplane.gsmlg.net/.well-known/oauth-protected-resource/v1
# Unauthenticated probe: GET https://backplane.gsmlg.net/v1
curl -i https://backplane.gsmlg.net/v1
Authorize with PKCE
https://backplane.gsmlg.net/oauth/authorize?response_type=code&client_id=$CLIENT_ID&redirect_uri=$REDIRECT_URI&code_challenge=$CODE_CHALLENGE&code_challenge_method=S256&resource=https://backplane.gsmlg.net/v1&scope=llm::models%20llm::invoke
Exchange the authorization code
curl -X POST https://backplane.gsmlg.net/oauth/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
--data-urlencode "grant_type=authorization_code" \
--data-urlencode "code=$CODE" \
--data-urlencode "redirect_uri=$REDIRECT_URI" \
--data-urlencode "code_verifier=$CODE_VERIFIER" \
--data-urlencode "resource=https://backplane.gsmlg.net/v1"
Call the model gateway
curl -H "Authorization: Bearer $ACCESS_TOKEN" https://backplane.gsmlg.net/v1/models
Reference
GET /v1
GET /v1/models
POST /v1/messages
POST /v1/chat/completions
POST /v1/responses
GET /.well-known/oauth-protected-resource/v1