مستندات توسعه‌دهنده

همه چیز برای یکپارچه‌سازی احراز هویت بلینر در سایت یا اپ شما.

شروع سریع

چک‌لیست اتصال بلینر به سایت یا اپ شما:

  1. ۱

    ثبت‌نام کسب‌وکار

    به /dashboard/register بروید، حساب بسازید و وارد داشبورد شوید.

  2. ۲

    ساخت اپ و دریافت کلیدها

    از بخش «اپ‌ها» یک اپ جدید بسازید. دامنهٔ مجاز (مثلاً belener.ir) و redirect URIهای روی همان دامنه را ثبت کنید و client_id و client_secret را یک‌بار کپی کنید (secret فقط همان لحظه نمایش داده می‌شود).

  3. ۳

    انتخاب روش یکپارچه‌سازی

    API لینک احراز (ساده‌تر) یا OIDC استاندارد. هر دو در همین صفحه توضیح داده شده‌اند.

  4. ۴

    تأیید نتیجه در سرور

    پس از بازگشت کاربر result_token یا code را در سرور تأیید کنید. اگر کاربر مرورگر را بست، با session_id وضعیت را از POST /api/v1/verify-status پول کنید.

برای تست سریع بدون کدنویسی، صفحه‌ی /demo را ببینید. برای ثبت‌نام واقعی: /dashboard/register

یکپارچه‌سازی OIDC استاندارد

اگر سیستم شما از OpenID Connect پشتیبانی می‌کند (مثل WordPress، Laravel، Django)، از Discovery URL استفاده کنید:

https://belener.ir/.well-known/openid-configuration

جریان Authorization Code + PKCE

  1. ۱.کاربر را به /oidc/authorize با پارامترهای مناسب هدایت کنید.
  2. ۲.کاربر لاگین می‌کند و (در صورت نیاز) احراز هویت می‌شود.
  3. ۳.هدایت به redirect_uri با پارامتر code.
  4. ۴.تبادل code با token در /oidc/token (server-side).
  5. ۵.استفاده از access_token برای دریافت اطلاعات از /oidc/userinfo.

Scope ها

ScopeClaims دریافتی
openidsub (همیشه الزامی)
profilename, given_name, family_name
mobilephone_number, phone_number_verified
national_idnational_id (اگر احراز شده باشد)
card_numbercard_number (کارت فعال) و card_numbers (آرایهٔ کارت‌های تأیید‌شده)
verification_levelverification_level (سطح ۰ تا ۳)
PKCE (Proof Key for Code Exchange) با روش S256 الزامی است. بدون code_challenge درخواست رد می‌شود.

مرجع API

EndpointMethodاحراز هویتتوضیح
/.well-known/openid-configurationGETOIDC Discovery
/oidc/authorizeGETشروع جریان OAuth
/oidc/tokenPOSTclient_secretدریافت access/id token
/oidc/userinfoGETBearer tokenاطلاعات کاربر
/oidc/jwksGETکلیدهای عمومی JWT
/api/v1/verifyPOSTclient_id + secretساخت لینک احراز مستقیم
/api/v1/verify-resultPOSTclient_id + secretتأیید result_token
/api/v1/verify-statusPOSTclient_id + secretپول وضعیت نشست با session_id
/api/v1/queue-statusGETوضعیت صف احراز هویت

کدهای خطا

پاسخ‌های خطا به‌صورت JSON با فیلدهای error و error_description برمی‌گردند.

errorHTTPمعنی
invalid_request400بدنه یا پارامترها نامعتبر (مثلاً redirect_url در لیست مجاز نیست یا دامنهٔ اپ مطابقت ندارد)
invalid_client401client_id یا client_secret اشتباه / غیرفعال
unauthorized_client403کلاینت سیستمی یا حساب تعلیق‌شده
invalid_token401result_token نامعتبر، منقضی، یا متعلق به این client نیست
session_not_found404session_id نامعتبر، منقضی، یا متعلق به این اپ نیست
insufficient_balance403موجودی کیف‌پول کسب‌وکار برای تحویل نتیجه کافی نیست
rate_limited429تعداد درخواست بیش از حد — کمی بعد دوباره تلاش کنید
redirect_url باید دقیقاً با یکی از آدرس‌های ثبت‌شده در تنظیمات اپ مطابقت داشته باشد (شامل پروتکل و path)، و hostname آن باید روی دامنهٔ مجاز همان اپ باشد (مثلاً belener.ir). ساب‌دامین مجاز است.
کاربر پس از باز کردن لینک احراز، ابتدا باید کد OTP پیامکی را برای همان شمارهٔ mobile وارد کند؛ بدون تأیید پیامک، مراحل KYC شروع نمی‌شود.

سطوح احراز هویت

هر سطح مشخص می‌کند چه scope‌هایی باید درخواست شوند و چه claims‌هایی در پاسخ برمی‌گردند. scope openid همیشه الزامی است و در همه سطوح وجود دارد.

۰

احراز نشده

کاربر هنوز هیچ اطلاعاتی ارائه نداده است.

۱

هویت و کارت بانکی

تطابق موبایل ↔ کد ملی (شاهکار) و تطابق کد ملی ↔ شماره کارت بانکی؛ تأیید خودکار

۴,۵۳۰ تومان

Scopes موردنیاز

openidprofilemobilenational_idcard_number

Claims دریافتی

subnamephone_numbernational_idcard_numbercard_numbers
scope="openid profile mobile national_id card_number"
۲

مدرک شناسایی

تطابق کد ملی، نام، نام خانوادگی و عکس کارت ملی / شناسنامه / مدرک شناسایی

۶,۳۴۰ تومان

Scopes موردنیاز

openidprofilemobilenational_idcard_numberverification_level

Claims دریافتی

subnamephone_numbernational_idcard_numbercard_numbersverification_level
scope="openid profile mobile national_id card_number verification_level"
۳

ویدیویی (کامل)

همه مراحل سطح ۲ به‌علاوه ویدیو سلفی با جمله احراز هویت

۷,۷۵۰ تومان

Scopes موردنیاز

openidprofilemobilenational_idcard_numberverification_level

Claims دریافتی

subnamephone_numbernational_idcard_numbercard_numbersverification_level
scope="openid profile mobile national_id card_number verification_level"
هزینه بر اساس اولین احراز هر کاربر محاسبه می‌شود. دسترسی مجدد همان کاربر در سرویس‌های دیگر 80٪ قیمت همان سطح احراز است. اگر کاربر کارت بانکی را عوض کند، مبلغ جداگانهٔ استعلام مجدد کارت (۹۴۰ تومان) نیز از کیف‌پول شما کسر می‌شود و شماره کارت جدید در پاسخ verify-result یا verify-status برمی‌گردد. هر بار ارسال کد تأیید موبایل در صفحهٔ احراز از کیف‌پول صاحب API کسر می‌شود: پیامک (۱۶۴ تومان) یا تماس صوتی (۹۷۰ تومان). هر شماره در هر ساعت حداکثر دو بار می‌تواند کد بگیرد.

کدهای نمونه — یکپارچه‌سازی OIDC

نمونه‌کد کامل برای فریم‌ورک‌ها و زبان‌های مختلف. همه از Discovery URL و استاندارد OIDC استفاده می‌کنند.

import { Issuer, generators } from 'openid-client';

const issuer = await Issuer.discover('https://belener.ir');
const client = new issuer.Client({
  client_id: 'cl_YOUR_CLIENT_ID',
  client_secret: 'YOUR_CLIENT_SECRET',
  redirect_uris: ['https://belener.ir/callback'],
  response_types: ['code'],
});

// ۱. هدایت کاربر به صفحه احراز
const code_verifier = generators.codeVerifier();
const code_challenge = generators.codeChallenge(code_verifier);
const url = client.authorizationUrl({
  scope: 'openid profile mobile national_id card_number verification_level',
  code_challenge,
  code_challenge_method: 'S256',
});
res.redirect(url);

// ۲. در callback: دریافت توکن
const params = client.callbackParams(req);
const tokenSet = await client.oauthCallback(
  'https://belener.ir/callback',
  params,
  { code_verifier }
);
const user = tokenSet.claims(); // { sub, phone_number, name, verification_level }
همه‌ی فریم‌ورک‌هایی که OIDC / OAuth 2.0 پشتیبانی می‌کنند با بلینر سازگارند. Discovery URL: https://belener.ir/.well-known/openid-configuration

نکات امنیتی

  • هرگز client_secret را در کد فرانت‌اند، مخزن عمومی یا لاگ‌ها قرار ندهید.
  • ارتباط با API فقط از HTTPS با TLS 1.2+ باشد.
  • client_secret را هر ۹۰ روز یا پس از هر رویداد امنیتی تغییر دهید.
  • پارامتر state را در جریان OIDC برای جلوگیری از CSRF تأیید کنید.
  • IP سرورهایی که با client_secret تماس می‌گیرند را در فایروال محدود کنید.
  • result_token را فقط با POST /api/v1/verify-result در سرور تأیید کنید — هرگز در کلاینت به آن اعتماد نکنید.
  • session_id را در سرور ذخیره کنید و با POST /api/v1/verify-status وضعیت را پول کنید تا اگر کاربر مرورگر را بست نتیجه از دست نرود.
  • برای احراز سطح ۳ (ویدیویی)، مطمئن شوید محتوای ویدیو ارسال‌شده مطابق دستورالعمل است.