Zrzur Entwickler

OAuth2

Lass Menschen sich mit ihrem Zrzur-Konto auf deiner Website anmelden. Das Installieren eines Bots nutzt denselben Bildschirm.

Das brauchst du

Eine Anwendung und eine Website oder ein Programm, das eine Weiterleitung empfangen kann.

Was es kann und was nicht

Ein Zugriffstoken liest, wer jemand ist und auf welchen Servern. Es funktioniert nur auf /oauth2/@me.... Es handelt nie als die Person auf dem Rest der API.

ScopeGibt
identifyGET /oauth2/@me
servers.readGET /oauth2/@me/servers
applications.commandsMarkiert, dass deine Befehle dazukommen dürfen
bot.installInstalliert den Bot auf einem Server, den die Person wählt

Schritte

  1. Öffne deine Anwendung, Tab OAuth2. Trage deine Weiterleitungs-URIs ein, eine pro Zeile, bis zu 10: https://-Adressen oder http://localhost beim Entwickeln. Sie müssen exakt passen.
  2. Erzeuge ein Client-Geheimnis, wenn dein Programm auf einem Server läuft. Ohne eins ist die App ein öffentlicher Client. Es erscheint einmal.
  3. Erzeuge für jede Anmeldung ein zufälliges state und einen zufälligen code_verifier. Schicke die Person zu:
/oauth2/authorize
  ?client_id=YOUR_BOT_ID
  &redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
  &response_type=code
  &scope=identify%20servers.read
  &state=RANDOM_STATE
  &code_challenge=BASE64URL_OF_SHA256_OF_VERIFIER
  &code_challenge_method=S256

Dieser Pfad liegt in der Zrzur-App. Der URL-Generator im Tab OAuth2 baut diese Adresse. PKCE (code_challenge) ist immer Pflicht, auch mit Client-Geheimnis.

  1. Die Person stimmt zu. Der Browser kommt mit code und state zu deiner Weiterleitungs-URI zurück. Prüfe, dass state deins ist.
  2. Tausche den Code innerhalb von 10 Minuten ein. Er funktioniert einmal.
curl -X POST "https://api.zrzur.com/oauth2/token" \
  -d grant_type=authorization_code \
  -d client_id=YOUR_BOT_ID \
  -d client_secret=YOUR_CLIENT_SECRET \
  -d code=THE_CODE \
  -d redirect_uri=https://example.com/callback \
  -d code_verifier=YOUR_VERIFIER
{
  "access_token": "...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "...",
  "scope": "identify servers.read"
}
  1. Rufe die API damit auf:
curl "https://api.zrzur.com/oauth2/@me" -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Die PKCE-Werte erzeugen

code_verifier ist ein zufälliger Text mit 43 bis 128 Zeichen. code_challenge ist das SHA-256 dieses Texts, als base64url ohne Auffüllung kodiert. Behalte den Verifier bis Schritt 5 und sende nur die Challenge in der Adresse.

import { createHash, randomBytes } from "node:crypto";

const verifier = randomBytes(32).toString("base64url");
const challenge = createHash("sha256").update(verifier).digest("base64url");

Aktualisieren und widerrufen

Zugriffstokens halten 1 Stunde, Aktualisierungstokens 30 Tage. Jedes Aktualisierungstoken geht einmal und kommt neu zurück. Ein altes zu nutzen beendet die ganze Kette, denn das sieht nach Diebstahl aus.

curl -X POST "https://api.zrzur.com/oauth2/token" \
  -d grant_type=refresh_token \
  -d client_id=YOUR_BOT_ID \
  -d refresh_token=YOUR_REFRESH_TOKEN

curl -X POST "https://api.zrzur.com/oauth2/revoke" \
  -d client_id=YOUR_BOT_ID \
  -d token=YOUR_REFRESH_TOKEN

Beide Routen nehmen ein Formular, kein JSON. Sie stehen nicht im OpenAPI-Dokument. Eine Person kann deine App auch in ihren Einstellungen entziehen.

Häufige Fehler

Diese Routen antworten { "error": "...", "error_description": "..." }.

errorUrsacheLösung
invalid_requestEin Feld fehlt, etwa code_verifierSende jedes Feld
invalid_grantDer Code ist unbekannt, benutzt oder abgelaufen, oder PKCE ist falschBeginne die Anmeldung neu
invalid_clientClient-ID oder Geheimnis sind falsch (Status 401)Prüfe sie
invalid_scopeMehr Scope als bei der ersten ZustimmungFordere weniger an
unsupported_grant_typeEin anderer Grant-TypNimm die beiden oben

Referenz

GET /applications/{application_id}/oauth

Fetch OAuth2 Settings.

Ratenlimit: any_dlta, 20 / 10 s

PATCH /applications/{application_id}/oauth

Edit OAuth2 Settings. Replace the redirect URIs: https, or http for localhost only; exact match is required when authorizing.

Ratenlimit: any_dlta, 20 / 10 s

POST /applications/{application_id}/oauth/secret

Reset Client Secret. Create a new client secret (the old one stops working). Only the owner, with a validated MFA ticket (X-MFA-Ticket). The secret is shown once.

Ratenlimit: any_dlta, 20 / 10 s

GET /oauth2/@me

Current User (OAuth2). Needs identify. Only id, name and avatar; never e-mail or settings.

Ratenlimit: any_dlta, 20 / 10 s

GET /oauth2/@me/servers

Current User's Servers (OAuth2). Needs servers.read: id, name and icon of each server the user is in.

Ratenlimit: any_dlta, 20 / 10 s

GET /oauth2/authorize

Authorization Preview. What the consent page shows: the application, the scopes it asks for, and (for bot.install) the servers the user can add it to. Every check of the request happens here first; errors are shown, never redirected.

Für Bots nicht verfügbar.

Ratenlimit: any_dlta, 20 / 10 s

POST /oauth2/authorize

Authorize. The user's decision on the consent page. Approving issues a single-use code (and installs the bot for bot.install); denying returns error=access_denied. Either way the answer is the URL to go to next.

Für Bots nicht verfügbar.

Ratenlimit: any_dlta, 20 / 10 s

GET /oauth2/authorized

Authorized Apps. Applications this user authorized with OAuth2.

Für Bots nicht verfügbar.

Ratenlimit: any_dlta, 20 / 10 s

DELETE /oauth2/authorized/{application_id}

Revoke Authorized App. Revoke every token the user gave this application. It does not remove the bot from servers; that is done per server by its managers.

Für Bots nicht verfügbar.

Ratenlimit: any_dlta, 20 / 10 s

Weiter