POST Öffentlichen OAuth-Client registrieren
/oauth/register
Registriert öffentliche Clients mit token_endpoint_auth_method none und ausschließlich authorization_code. HTTPS-Rücksprünge und ausdrücklich erlaubte Loopbackadressen werden geprüft; Registrierung ist begrenzt.
Auf dieser Seite
Zugriff und Rechte
Registriert öffentliche Clients mit token_endpoint_auth_method none und ausschließlich authorization_code. HTTPS-Rücksprünge und ausdrücklich erlaubte Loopbackadressen werden geprüft; Registrierung ist begrenzt.
Eine Kontoanmeldung ist nicht erforderlich. Die angegebenen Prüfungen der Browserherkunft und Nutzungslimits gelten weiterhin.
Parameter und Header
Keine Pfad-, Query- oder zusätzlichen Anfrageheader-Parameter.
Anfragekörper
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | object | Ja | — |
| $.client_name | string; {"maxLength":128,"minLength":1} | Ja | Anzeigename bei der OAuth-Zustimmung. |
| $.grant_types | array<string; {"enum":["authorization_code","refresh_token"]}>; {"maxItems":1} | Nein | — |
| $.grant_types[] | string; {"enum":["authorization_code","refresh_token"]} | Ja | — |
| $.redirect_uris | array<string; {"format":"uri"}>; {"maxItems":5,"minItems":1} | Ja | Zulässige exakte Rücksprungadressen. HTTPS oder geprüfte Loopback-Adressen sind erforderlich. |
| $.redirect_uris[] | string; {"format":"uri"} | Ja | — |
| $.response_types | array<JSON; {"const":"code"}>; {"maxItems":1} | Nein | — |
| $.response_types[] | JSON; {"const":"code"} | Ja | — |
| $.token_endpoint_auth_method | string; {"default":"none","enum":["","none"]} | Nein | — |
Antworten
| Header | Typ und Grenzen | Bedeutung |
|---|---|---|
| Cache-Control | string; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"} | Private API-Antworten verbieten Speicherung. Öffentliche OAuth-Metadaten werden 300 Sekunden gecacht; Livestreams verbieten zusätzlich Transformation. |
| Content-Language | string; {"enum":["en","de"]} | Sprache lesbarer Antworttexte aus Accept-Language oder der dokumentierten Browserpräferenz. Technische Codes und Kennungen bleiben stabil. |
| Referrer-Policy | JSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]} | Standard-Referrerpolicy ist strict-origin-when-cross-origin. Anbieterloginantworten verwenden no-referrer zum Schutz der Loginparameter. |
| Vary | string | Antworten variieren nach Accept-Language; browsergerenderte Antworten können zusätzlich nach Präferenzcookie variieren. |
| X-Content-Type-Options | JSON; {"const":"nosniff"} | Der Browser muss den angegebenen Inhaltstyp verwenden. |
| X-Frame-Options | JSON; {"const":"DENY"} | Die Antwort darf nicht in einem Frame eingebettet werden. |
| X-Request-ID | string | Vom Server erzeugte Anfragekennung. Bei Fehlermeldungen mitgeben; eingehende Werte werden nicht als vertrauenswürdig übernommen. |
application/json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | object | Ja | — |
| $.client_id | string | Ja | OAuth-Clientkennung aus der öffentlichen Clientregistrierung. |
| $.client_name | string | Ja | Anzeigename bei der OAuth-Zustimmung. |
| $.grant_types | array<string> | Ja | — |
| $.grant_types[] | string | Ja | — |
| $.redirect_uris | array<string> | Ja | Zulässige exakte Rücksprungadressen. HTTPS oder geprüfte Loopback-Adressen sind erforderlich. |
| $.redirect_uris[] | string | Ja | — |
| $.response_types | array<string> | Ja | — |
| $.response_types[] | string | Ja | — |
| $.token_endpoint_auth_method | string | Ja | — |
{
"client_id": "demo",
"client_name": "demo",
"grant_types": [],
"redirect_uris": [],
"response_types": [],
"token_endpoint_auth_method": "demo"
}| Stabile Fehlercodes |
|---|
| invalid_client_metadata |
| invalid_peer |
| invalid_redirect_uri |
| Header | Typ und Grenzen | Bedeutung |
|---|---|---|
| Cache-Control | string; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"} | Private API-Antworten verbieten Speicherung. Öffentliche OAuth-Metadaten werden 300 Sekunden gecacht; Livestreams verbieten zusätzlich Transformation. |
| Content-Language | string; {"enum":["en","de"]} | Sprache lesbarer Antworttexte aus Accept-Language oder der dokumentierten Browserpräferenz. Technische Codes und Kennungen bleiben stabil. |
| Referrer-Policy | JSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]} | Standard-Referrerpolicy ist strict-origin-when-cross-origin. Anbieterloginantworten verwenden no-referrer zum Schutz der Loginparameter. |
| Vary | string | Antworten variieren nach Accept-Language; browsergerenderte Antworten können zusätzlich nach Präferenzcookie variieren. |
| X-Content-Type-Options | JSON; {"const":"nosniff"} | Der Browser muss den angegebenen Inhaltstyp verwenden. |
| X-Frame-Options | JSON; {"const":"DENY"} | Die Antwort darf nicht in einem Frame eingebettet werden. |
| X-Request-ID | string | Vom Server erzeugte Anfragekennung. Bei Fehlermeldungen mitgeben; eingehende Werte werden nicht als vertrauenswürdig übernommen. |
application/problem+json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | Problem | Ja | — |
| $.code | string | Ja | Stabiler maschinenlesbarer Fehlercode |
| $.detail | string | Ja | Kurze lokalisierte Erklärung ohne interne Fehlerdaten |
| $.instance | string | Ja | Einmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource |
| $.message | string | Ja | Vorübergehend für bestehende Clients gleich detail |
| $.message_key | string | Ja | Stabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage |
| $.message_params | object; {"additionalProperties":true} | Ja | Benannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML |
| $.request_id | string; {"pattern":"^[0-9a-f]{32}$"} | Ja | Vom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten. |
| $.status | integer; {"maximum":599,"minimum":400} | Ja | — |
| $.title | string | Ja | Lokalisierte HTTP-Statusbezeichnung |
| $.type | string; {"const":"about:blank"} | Ja | — |
{
"code": "demo",
"detail": "Demo error detail; inspect the documented code.",
"instance": "demo",
"message": "Demo error detail; inspect the documented code.",
"message_key": "errors.requestFailed",
"message_params": {},
"request_id": "00000000000000000000000000000000",
"status": 400,
"title": "Demo error",
"type": "about:blank"
}| Stabile Fehlercodes |
|---|
| rate_limited |
| Header | Typ und Grenzen | Bedeutung |
|---|---|---|
| Cache-Control | string; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"} | Private API-Antworten verbieten Speicherung. Öffentliche OAuth-Metadaten werden 300 Sekunden gecacht; Livestreams verbieten zusätzlich Transformation. |
| Content-Language | string; {"enum":["en","de"]} | Sprache lesbarer Antworttexte aus Accept-Language oder der dokumentierten Browserpräferenz. Technische Codes und Kennungen bleiben stabil. |
| Referrer-Policy | JSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]} | Standard-Referrerpolicy ist strict-origin-when-cross-origin. Anbieterloginantworten verwenden no-referrer zum Schutz der Loginparameter. |
| Retry-After | string; {"pattern":"^[0-9]+$"} | Sekunden bis zur Wiederholung. Bewahren Sie unterstützte Idempotenzkennungen und beachten Sie die Änderungsregeln der Operation. |
| Vary | string | Antworten variieren nach Accept-Language; browsergerenderte Antworten können zusätzlich nach Präferenzcookie variieren. |
| X-Content-Type-Options | JSON; {"const":"nosniff"} | Der Browser muss den angegebenen Inhaltstyp verwenden. |
| X-Frame-Options | JSON; {"const":"DENY"} | Die Antwort darf nicht in einem Frame eingebettet werden. |
| X-Request-ID | string | Vom Server erzeugte Anfragekennung. Bei Fehlermeldungen mitgeben; eingehende Werte werden nicht als vertrauenswürdig übernommen. |
application/problem+json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | Problem | Ja | — |
| $.code | string | Ja | Stabiler maschinenlesbarer Fehlercode |
| $.detail | string | Ja | Kurze lokalisierte Erklärung ohne interne Fehlerdaten |
| $.instance | string | Ja | Einmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource |
| $.message | string | Ja | Vorübergehend für bestehende Clients gleich detail |
| $.message_key | string | Ja | Stabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage |
| $.message_params | object; {"additionalProperties":true} | Ja | Benannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML |
| $.request_id | string; {"pattern":"^[0-9a-f]{32}$"} | Ja | Vom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten. |
| $.status | integer; {"maximum":599,"minimum":400} | Ja | — |
| $.title | string | Ja | Lokalisierte HTTP-Statusbezeichnung |
| $.type | string; {"const":"about:blank"} | Ja | — |
{
"code": "demo",
"detail": "Demo error detail; inspect the documented code.",
"instance": "demo",
"message": "Demo error detail; inspect the documented code.",
"message_key": "errors.requestFailed",
"message_params": {},
"request_id": "00000000000000000000000000000000",
"status": 429,
"title": "Demo error",
"type": "about:blank"
}| Stabile Fehlercodes |
|---|
| feature_unavailable |
| unavailable |
| Header | Typ und Grenzen | Bedeutung |
|---|---|---|
| Cache-Control | string; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"} | Private API-Antworten verbieten Speicherung. Öffentliche OAuth-Metadaten werden 300 Sekunden gecacht; Livestreams verbieten zusätzlich Transformation. |
| Content-Language | string; {"enum":["en","de"]} | Sprache lesbarer Antworttexte aus Accept-Language oder der dokumentierten Browserpräferenz. Technische Codes und Kennungen bleiben stabil. |
| Referrer-Policy | JSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]} | Standard-Referrerpolicy ist strict-origin-when-cross-origin. Anbieterloginantworten verwenden no-referrer zum Schutz der Loginparameter. |
| Retry-After | string; {"pattern":"^[0-9]+$"} | Sekunden bis zur Wiederholung. Bewahren Sie unterstützte Idempotenzkennungen und beachten Sie die Änderungsregeln der Operation. |
| Vary | string | Antworten variieren nach Accept-Language; browsergerenderte Antworten können zusätzlich nach Präferenzcookie variieren. |
| X-Content-Type-Options | JSON; {"const":"nosniff"} | Der Browser muss den angegebenen Inhaltstyp verwenden. |
| X-Frame-Options | JSON; {"const":"DENY"} | Die Antwort darf nicht in einem Frame eingebettet werden. |
| X-Request-ID | string | Vom Server erzeugte Anfragekennung. Bei Fehlermeldungen mitgeben; eingehende Werte werden nicht als vertrauenswürdig übernommen. |
application/problem+json
| Feld | Typ und Grenzen | Erforderlich | Bedeutung |
|---|---|---|---|
| $ | Problem | Ja | — |
| $.code | string | Ja | Stabiler maschinenlesbarer Fehlercode |
| $.detail | string | Ja | Kurze lokalisierte Erklärung ohne interne Fehlerdaten |
| $.instance | string | Ja | Einmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource |
| $.message | string | Ja | Vorübergehend für bestehende Clients gleich detail |
| $.message_key | string | Ja | Stabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage |
| $.message_params | object; {"additionalProperties":true} | Ja | Benannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML |
| $.request_id | string; {"pattern":"^[0-9a-f]{32}$"} | Ja | Vom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten. |
| $.status | integer; {"maximum":599,"minimum":400} | Ja | — |
| $.title | string | Ja | Lokalisierte HTTP-Statusbezeichnung |
| $.type | string; {"const":"about:blank"} | Ja | — |
{
"code": "demo",
"detail": "Demo error detail; inspect the documented code.",
"instance": "demo",
"message": "Demo error detail; inspect the documented code.",
"message_key": "errors.requestFailed",
"message_params": {},
"request_id": "00000000000000000000000000000000",
"status": 503,
"title": "Demo error",
"type": "about:blank"
}Wiederholungen und asynchrone Aufträge
Für diese Änderung gibt es keine allgemeine Wiederholungsgarantie. Prüfen Sie bei unklarer Antwort den betroffenen Eintrag, bevor Sie es erneut versuchen. Beachten Sie Wartezeiten aus Retry-After und fordern Sie abgelaufene Anmelde- oder Aktionscodes neu an.
Anfragebeispiele
Ersetzen Sie Demokennungen, Zeitstempel und Platzhalter durch eigene Werte. Behalten Sie bei Wiederholungen Kennungen, Zeit und Inhalt bei. Diese Beispiele führen auf der Seite keine Anfragen aus.
Halten Sie Anmeldelinks, Codes, Cookies und Schlüssel privat. Schreiben Sie sie nicht in Logs und teilen Sie sie nicht in Hilfeanfragen.
curl --silent --show-error --output /dev/null --write-out "%{http_code}\n" \
--request POST \
--header "Content-Type: application/json" \
--data-binary '{"client_name":"demo","redirect_uris":["https://example.com/callback"]}' \
"https://metribeacon.com/oauth/register"
import json
from pathlib import Path
from urllib.request import Request, HTTPRedirectHandler, build_opener
from urllib.error import HTTPError
headers = {}
headers["Content-Type"] = "application/json"
request = Request("https://metribeacon.com/oauth/register", data="{\"client_name\":\"demo\",\"redirect_uris\":[\"https://example.com/callback\"]}".encode("utf-8"), headers=headers, method="POST")
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, request, fp, code, message, headers, target):
return None
opener = build_opener(NoRedirect())
try:
with opener.open(request, timeout=10) as response:
print(response.status)
except HTTPError as error:
print(error.code)
error.close()
import { readFile } from "node:fs/promises";
import { homedir } from "node:os";
import { join } from "node:path";
const headers = {};
headers["Content-Type"] = "application/json";
const response = await fetch("https://metribeacon.com/oauth/register", {
method: "POST", headers, redirect: "manual",
signal: AbortSignal.timeout(10000), body: "{\"client_name\":\"demo\",\"redirect_uris\":[\"https://example.com/callback\"]}",
});
console.log(response.status);
await response.body?.cancel();
package main
import (
"fmt"
"net/http"
"time"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://metribeacon.com/oauth/register", strings.NewReader("{\"client_name\":\"demo\",\"redirect_uris\":[\"https://example.com/callback\"]}"))
if err != nil { panic("request failed; credentials and response omitted") }
request.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 10*time.Second, CheckRedirect: func(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }}
response, err := client.Do(request)
if err != nil { panic("request failed; credentials and response omitted") }
defer response.Body.Close()
fmt.Println(response.StatusCode)
}
Verwandte Anleitungen
- HTTP-API, OAuth und MCP
Finden Sie die Nutzer-API-Endpunkte mit Rechten, Feldern, Beispielen und Antwortformaten.
- GET OAuth-Zustimmung anfordern oder bestätigen
GET bereitet nach Anmeldung ausdrückliche Browserzustimmung vor. POST bestätigt eine ausstehende Anfrage mit Origin und CSRF. Erforderlich sind PKCE S256, exakt registrierter Rücksprung und kanonische /mcp-Resource. Codes verfallen nach fünf Minuten. Erforderliche Queryparameter kommen genau einmal vor. URIs sind auf 2048 Bytes begrenzt. Der Rücksprung muss einer registrierten HTTPS- oder Loopback-URI exakt entsprechen. Unterstützte Scopes: account:read, config:read, config:write, telemetry:read.
- POST OAuth-Zustimmung anfordern oder bestätigen
GET bereitet nach Anmeldung ausdrückliche Browserzustimmung vor. POST bestätigt eine ausstehende Anfrage mit Origin und CSRF. Erforderlich sind PKCE S256, exakt registrierter Rücksprung und kanonische /mcp-Resource. Codes verfallen nach fünf Minuten. Der CSRF-Wert wird als Formularfeld csrf_token geliefert und muss dem __Host-mb_csrf-Cookie sowie dieser Sitzung entsprechen. Zustimmung wird einmalig verbraucht; nur approve stellt einen Autorisierungscode aus.
- POST Autorisierungscode gegen MCP-Zugangstoken tauschen
Akzeptiert application/x-www-form-urlencoded mit authorization_code, client_id, redirect_uri, code_verifier und resource. Codes sind einmalig; Zugriffstokens gelten 15 Minuten, Refreshtokens werden nicht ausgestellt. Alle Formularfelder kommen genau einmal vor. Der Code gilt fünf Minuten, ist einmalig verwendbar und an exakten Client, Rücksprung, Ressource und S256-Verifier gebunden. Das Bearer-Token gilt 900 Sekunden. Es wird kein Refresh-Token ausgestellt.