موافقة المستخدم وPKCE وتبادل الرمز
نفّذ Authorization Code من أول رابط إلى access token.
آخر تحديث تحريري: ٣٠ أكتوبر ٢٠٢٦في هذا الدليل
المسار الكامل
- ولّد state عشوائيًا وcode_verifier عشوائيًا آمنًا بطول 43–128 محرفًا URL-safe، ثم challenge باستخدام SHA-256 وBase64URL بدون padding.
- احفظ state وverifier مرتبطين بجلسة بدء الربط، ووجّه المستخدم لصفحة التفويض.
- المستخدم يسجل الدخول ويختار صندوقه ويوافق أو يرفض. تحقق من state عند callback قبل التعامل مع code أو error.
- بادل code من الخادم مع verifier نفسه وredirect_uri نفسه. الرمز قصير العمر ويستخدم مرة واحدة.
مثال توليد رابط التفويض
Node.js — احفظ state وverifier قبل التحويل
import { randomBytes, createHash } from 'node:crypto';
const state = randomBytes(32).toString('base64url');
const verifier = randomBytes(32).toString('base64url');
const challenge = createHash('sha256').update(verifier).digest('base64url');
// Store { state, verifier } in the initiating server-side session.
const url = new URL('https://raselmail.com/oauth/authorize');
url.search = new URLSearchParams({
response_type: 'code', client_id: 'YOUR_CLIENT_ID',
redirect_uri: 'https://client.example/oauth/callback',
scope: 'mail.read', state,
code_challenge: challenge, code_challenge_method: 'S256',
}).toString();
// Redirect the browser to url.href.تبادل الرمز من الخادم
Code exchange
curl -i 'https://raselmail.com/api/v1/oauth/token' -u "$RASEL_CLIENT_ID:$RASEL_CLIENT_SECRET" --data-urlencode 'grant_type=authorization_code' --data-urlencode "code=$AUTHORIZATION_CODE" --data-urlencode 'redirect_uri=https://client.example/oauth/callback' --data-urlencode "code_verifier=$PKCE_VERIFIER"لا تنفذ تبادل السر من JavaScript عام في المتصفح. عند access_denied احترم قرار المستخدم. لا تسجل code أو رموز الوصول في السجلات أو عنوان صفحة تحليلات.