Zrzur المطوّرون

OAuth2

دع الناس يسجلون الدخول إلى موقعك بحساب زرزور. يستخدم تثبيت البوت الشاشة نفسها.

ما تحتاج إليه

تطبيق، وموقع أو برنامج يستطيع استقبال إعادة توجيه.

ما يستطيعه وما لا يستطيعه

يقرأ رمز الوصول هوية الشخص وسيرفراته. يعمل على /oauth2/@me... فقط، ولا يتصرف أبدًا باسم الشخص في بقية الواجهة.

النطاقيمنح
identifyGET /oauth2/@me
servers.readGET /oauth2/@me/servers
applications.commandsيبيّن أن أوامرك قد تُضاف
bot.installيثبّت البوت في سيرفر يختاره الشخص

الخطوات

  1. افتح تطبيقك، تبويب OAuth2. أضف عناوين إعادة التوجيه، عنوانًا في كل سطر، حتى 10: عناوين https://، أو http://localhost في أثناء التطوير. يجب أن تطابق تمامًا.
  2. أنشئ سر عميل إذا كان برنامجك يعمل على سيرفر. دونه يكون التطبيق عميلًا عامًا. يظهر مرة واحدة.
  3. لكل تسجيل دخول، أنشئ state عشوائيًا وcode_verifier عشوائيًا. أرسل الشخص إلى:
/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

هذا المسار في تطبيق زرزور. ويبني مولّد الروابط في تبويب OAuth2 هذا العنوان. PKCE (code_challenge) مطلوب دائمًا، حتى مع سر العميل.

  1. يوافق الشخص. يعود المتصفح إلى عنوان إعادة التوجيه مع code وstate. تحقق من أن state لك.
  2. استبدل الرمز خلال 10 دقائق. يصلح مرة واحدة.
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. استدع الواجهة به:
curl "https://api.zrzur.com/oauth2/@me" -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

أنشئ قيم PKCE

code_verifier نص عشوائي من 43 إلى 128 حرفًا. وcode_challenge هو SHA-256 لذلك النص بترميز base64url دون حشو. احتفظ بالقيمة الأولى حتى الخطوة 5، ولا ترسل في العنوان إلا code_challenge.

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

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

التحديث والإلغاء

تدوم رموز الوصول ساعة، ورموز التحديث 30 يومًا. يصلح كل رمز تحديث مرة واحدة ويعود جديدًا. واستخدام رمز قديم ينهي السلسلة كلها، لأن ذلك يشبه السرقة.

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

يأخذ المساران نموذجًا لا JSON، وهما ليسا في مستند OpenAPI. يستطيع الشخص أيضًا سحب تطبيقك من إعداداته.

الأخطاء الشائعة

تجيب هذه المسارات بصيغة { "error": "...", "error_description": "..." }.

errorالسببالحل
invalid_requestحقل مفقود، مثل code_verifierأرسل كل الحقول
invalid_grantالرمز مجهول أو مستخدم أو منتهٍ، أو PKCE خاطئابدأ تسجيل الدخول مجددًا
invalid_clientمعرّف العميل أو سره خاطئ (الحالة 401)تحقق منهما
invalid_scopeنطاق أوسع من الموافقة الأولىاطلب أقل
unsupported_grant_typeنوع منح آخراستخدم النوعين أعلاه

المرجع

GET /applications/{application_id}/oauth

Fetch OAuth2 Settings.

حد المعدل: 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.

حد المعدل: 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.

حد المعدل: any_dlta, 20 / 10 s

GET /oauth2/@me

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

حد المعدل: 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.

حد المعدل: 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.

غير متاح للبوتات.

حد المعدل: 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.

غير متاح للبوتات.

حد المعدل: any_dlta, 20 / 10 s

GET /oauth2/authorized

Authorized Apps. Applications this user authorized with OAuth2.

غير متاح للبوتات.

حد المعدل: 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.

غير متاح للبوتات.

حد المعدل: any_dlta, 20 / 10 s

التالي