# احراز هویت اولیه و استعلام‌ها

پیاده‌سازی ۹ سپتامبر ۲۰۲۶ در مارکت‌پلیس و پنل مدیریت محلی؛ جداول روی پروژه Supabase با شناسه `wlsxzyeernwtsetzyltq` اعمال شده‌اند. این تغییر رابط روی میزبان عمومی منتشر نشده است.

## مسیر کاربر

در بالای `/account` و صفحه‌های داشبورد، دکمه «احراز هویت» یک پنجره سه‌مرحله‌ای باز می‌کند:

1. نام، نام خانوادگی، کد ملی ده‌رقمی، شماره شناسنامه، نام پدر، نشانی کامل و کد پستی. شماره موبایل از حسابی خوانده می‌شود که با پیامک تأیید شده است؛ فرم نمی‌تواند آن را جایگزین کند. کنترل رقم کنترلی کد ملی فقط بررسی قالب است و مالکیت را اثبات نمی‌کند.
2. تصویر روی کارت ملی و یک عکس واضح از خود کاربر در حالی که کارت ملی و کاغذ حاوی عبارت «احراز هویت در پلانک» و کد تصادفی درخواست را نگه داشته است. کد روی سرور تولید می‌شود، به همان کاربر و درخواست تعلق دارد و ۲۴ ساعت برای بارگذاری اعتبار دارد. تصاویر JPG، PNG یا WebP، هرکدام حداکثر ۵ مگابایت‌اند.
3. بازبینی، تأیید صحت و رضایت برای بررسی مدارک و استعلام، سپس ارسال. وجود هر دو فایل در فضای خصوصی قبل از ارسال کنترل می‌شود. درخواست ارسال‌شده قابل ویرایش یا جایگزینی تصویر نیست. درخواست ردشده یا منقضی با درخواست و کد تازه جایگزین می‌شود؛ حداکثر پنج درخواست در ۲۴ ساعت و دوازده نوبت بارگذاری برای هر درخواست مجاز است.

نتیجه در همان پنجره پیگیری می‌شود. پس از تأیید نهایی، نام، نام خانوادگی، چهار رقم آخر کد ملی، زمان احراز و سطح `primary` در حساب ثبت می‌شوند؛ عنوان «اولیه» و مشخصات هویتی در پروفایل نمایش داده می‌شوند. تغییر موبایل، تأیید هویت و وضعیت تأیید حساب‌های بانکی را باطل می‌کند.

## بررسی مدیر

ورود: `http://localhost:3001/?section=identity`، بخش «احراز هویت». فقط نقش مالک پنل با نشست دومرحله‌ای می‌تواند مدارک را ببیند یا بررسی کند. فهرست آخرین ۱۰۰ درخواست، کد ملی را ماسک می‌کند؛ نمایش مشخصات کامل و تصاویر در جزئیات درخواست است و دسترسی مدیر در تاریخچه ثبت می‌شود.

مدیر خوانایی و تطبیق تصویر کارت، چهره و کد نوشته‌شده روی کاغذ را بررسی می‌کند. رد مدارک به توضیح نیاز دارد و نتیجه برای کاربر ثبت می‌شود. بررسی چهره خودکار یا تشخیص هویت با هوش مصنوعی پیاده نشده است.

**تأیید مدارک به‌تنهایی مالکیت کد ملی، موبایل یا حساب بانکی را تأیید نمی‌کند.** وضعیت `documents_approved` یعنی مدارک تأیید شده‌اند ولی احراز اولیه هنوز منتظر استعلام است. سطح اولیه فقط با تأیید مدارک مدیر و پاسخ موفق هر دو استعلام هویت و مالکیت موبایل ثبت می‌شود. حساب بانکی جداگانه پس از تطبیق مالکیت همان شبا و تکمیل احراز اولیه تأیید می‌شود.

## استعلام‌ها و کلیدها

ورود: `http://localhost:3001/?section=inquiries`، بخش «استعلام‌ها». سه سرویس اولیه برای هویت، مالکیت موبایل و مالکیت حساب بانکی وجود دارد؛ مدیر می‌تواند سرویس‌های آینده را نیز اضافه کند.

هر سرویس نام نمایشی، شناسه یکتا، نوع، نام ارائه‌دهنده، نشانی پایه HTTPS و کلید API دارد. کلید از ورودی رمزدار به سرور و تابع محدود دیتابیس ارسال و در Supabase Vault نگهداری می‌شود. مقدار یا شناسه مخزن کلید در پاسخ برنامه برنمی‌گردد؛ فقط وجود کلید نمایش داده می‌شود. خالی‌گذاشتن ورودی کلید، مقدار قبلی را حفظ می‌کند. هیچ کلیدی در مرورگر، سورس، اسناد یا تاریخچه تغییرات ذخیره نمی‌شود؛ نگهداری داخل حافظه ورودی تا ارسال طبیعی است.

سرویس «تطبیق شبا با کد ملی» شبانیک پیاده شده است. پس از ثبت توکن با ارائه‌دهنده «شبانیک»، نوع «مالکیت حساب بانکی» و نشانی دقیق `https://shabanic.ir/api/v2/matchIbanByNationalcode`، وضعیت «آماده اجرای استعلام» نمایش داده می‌شود. ثبت کلید خودکار درخواست نمی‌فرستد. مدیر مالک در جزئیات احراز هویت، روبه‌روی هر شبا دکمه «استعلام شبا» را می‌زند. نتیجه و شناسه پیگیری ثبت می‌شوند؛ فقط پاسخ صریح `success: true`، `statusCode: 200` و `result.isMatched: true` تطبیق محسوب می‌شود. پاسخ منفی با خطای سرویس و پاسخ ناقص تفاوت دارد.

کلید شبانیک بدون عبارت Bearer در کادر رمزدار وارد می‌شود؛ برنامه هدر را روی سرور می‌سازد. تغییر ارائه‌دهنده یا نشانی بدون ورود کلید تازه، اتصال کلید قبلی را قطع می‌کند. ثبت‌احوال و مالکیت موبایل نیز طبق مستندات جداگانه پیاده و روی Supabase نصب شده‌اند؛ ثبت‌احوال آماده اجراست و شاهکار منتظر کلید اختصاصی است. راهنمای جدید در `SHABANIC_IDENTITY_INQUIRIES.md` قرار دارد. راهنمای اتصال در `SHABANIC_BANK_INQUIRY.md` است.

## داده و دسترسی

- `marketplace_private.identity_requests`: مشخصات، نسخه درخواست، کد و انقضا، مسیر مدارک، رضایت، نتیجه مدیر و زمان‌ها.
- `marketplace_private.identity_inquiries`: وضعیت تطبیق هویت، موبایل و هر شبا؛ شناسه پیگیری ارائه‌دهنده؛ وضعیت اولیه «در انتظار اتصال سرویس»؛ خطای آخر با کد ثابت و بدون متن خام ارائه‌دهنده ثبت می‌شود.
- `marketplace_private.inquiry_services`: تنظیمات و اشاره‌گر محرمانه Vault، وضعیت اتصال و نسخه تنظیمات؛ بدون کلید متنی.
- `marketplace_private.inquiry_attempts`: تاریخچه اجرای استعلام هویت، موبایل و بانک، مدیر اجراکننده، سرویس، نتیجه و شناسه پیگیری؛ بدون توکن یا داده خام پاسخ.
- `identity-documents`: فضای خصوصی مدارک با سیاست‌های محدود خواندن، ایجاد و پاک‌سازی فایل جایگزین پیش‌نویس. کاربر و مالک پنل فقط مدارک مجاز را می‌بینند؛ نسخه نهایی قابل تغییر توسط کاربر نیست.

هر سه جدول RLS دارند و دسترسی مستقیم مهمان یا مشتری به اطلاعات ندارند. برنامه‌های وب با کلید عمومی پروژه و نشست همان کاربر کار می‌کنند؛ به کلید service-role نیاز ندارند. اطلاعات هویتی از مسیرهای خصوصی و پاسخ‌های `no-store` خوانده می‌شود. جدول‌های پیش‌نویس و بایگانی‌شده سیاست پاک‌سازی زمان‌دار خودکار ندارند؛ پیش از بهره‌برداری عمومی باید دوره نگهداری و فرآیند حذف مدارک تعیین شود.

فایل مهاجرت: `supabase/migrations/202609090001_identity_verification.sql`. اجرای مجدد آن در آزمون محلی بررسی شده است. نقش مالک از کنترل موجود `marketplace_role()` و الزام دومرحله‌ای استفاده می‌کند؛ نقش تازه یا امتیاز عمومی جدیدی به کاربران داده نشده است.

## اتصال سرویس در مرحله بعد

تابع `marketplace_identity_inquiry_result(p_inquiry, p_service, p_status, p_reference)` فقط برای سرویس مورد اعتماد قابل اجراست. اتصال شبانیک پاسخ واقعی ارائه‌دهنده را پس از اعتبارسنجی به `passed`، `failed` یا `error` نگاشت می‌کند. این تابع عمومی برای مشتری یا مدیر قابل فراخوانی نیست؛ اجرای بانکی فقط از تابع محدود `marketplace_bank_inquiry_run` که نتیجه را از ارائه‌دهنده می‌گیرد انجام می‌شود. مشتری و مدیر از رابط نمی‌توانند نتیجه استعلام را «موفق» کنند. نتیجه تکراری موفق با همان مرجع بی‌اثر است؛ نتیجه متناقض رد می‌شود. موفقیت آزمون رقم کنترلی کد ملی یا دریافت OTP، جایگزین استعلام مالکیت نیست.

## بررسی‌ها

هر دو برنامه typecheck و build موفق دارند. مجموع ۱۰۰ آزمون مارکت‌پلیس و ۲۵ آزمون پنل مدیریت گذشتند؛ آزمون‌های جدید شامل ورود و مالکیت داده، خصوصی‌بودن مدارک، کد منقضی، رضایت و وجود تصاویر، نسخه هم‌زمان، رد و ثبت مجدد، تأیید مدارک بدون تأیید مالکیت، پاسخ مجاز سرویس، تأیید نهایی، تغییر موبایل و ثبت دوباره حساب بانکی‌اند. Vault در آزمون محلی شبیه‌سازی شده؛ رمزنگاری واقعی آن با آزمون محلی بررسی نشده است.

در Supabase واقعی وجود سه جدول دارای RLS، سه سیاست مدارک، فضای خصوصی، سه سرویس در انتظار مستندات و نبود مجوز خواندن کلیدها یا نوشتن نتایج برای مشتری بررسی شد. هیچ مدارک یا درخواست هویتی واقعی/آزمایشی و هیچ کلید سرویس توسط این کار در دیتابیس اصلی ثبت نشده است. آزمون بصری یا تکمیل احراز یک شخص واقعی انجام نشده است.

## به‌روزرسانی شبانیک — ۲۰۲۶/۰۹/۰۹
مهاجرت دوم: `202609090002_shabanic_bank_inquiry.sql`. مجموع ۱۰۴ آزمون مارکت‌پلیس و ۲۶ آزمون مدیریت موفق‌اند. پاسخ‌های شبانیک در آزمون‌ها شبیه‌سازی شده‌اند؛ هیچ استعلام واقعی اجرا نشده است.


## انتخاب نوع احراز و مرحله بررسی — ۲۰ سپتامبر ۲۰۲۶

مدیر مالک می‌تواند در جزئیات درخواست، مسیر «هویتی · سطح اولیه» یا «هویتی و بانکی · سطح کامل» را انتخاب کند. سطح پایه/اولیه/کاملِ ثبت‌شده جدا از مسیر درخواستی نمایش داده می‌شود. مرحله اطلاعات یا مدارک پیش از تأیید مدارک قابل انتخاب است؛ پس از تأیید مدارک، مرحله استعلام‌ها و تأیید نهایی کاربرد دارند. تکمیل شواهد لازم، مرحله را خودکار به تأیید نهایی می‌رساند.

سطح اولیه همچنان نیازمند بررسی انسانی مدارک و استعلام موفق هویت و مالکیت موبایل است. سطح کامل علاوه بر اینها به نتیجه موفق مالکیت یک حساب بانکی موجود و منطبق نیاز دارد. انتخاب مسیر کامل بدون حساب بانکی، سطح اولیه به‌دست‌آمده را حفظ می‌کند و ارتقا را در انتظار استعلام می‌گذارد. حذف یا رد آخرین حساب بانکی منطبق سطح کامل را به اولیه برمی‌گرداند. تغییر موبایل طبق منطق قبلی احراز را باطل می‌کند.

مهاجرت افزایشی: `supabase/migrations/202609200001_identity_review_levels.sql`. تابع جدید `marketplace_identity_configure` فقط با نقش مالک و نشست دومرحله‌ای قابل اجراست؛ نسخه درخواست، مقادیر مجاز و شواهد مرحله نهایی را بررسی می‌کند و تغییر در سابقه ثبت می‌شود. گزینه‌های فرم هیچ پاسخ استعلامی تولید نمی‌کنند.

وضعیت تحویل این نوبت: پیاده‌سازی محلی و آزمون‌ها آماده‌اند. اجرای مهاجرت روی Supabase اصلی توسط بررسی خودکار مجوز متوقف شد و نیازمند تأیید صریح کاربر است. نسخه آنلاین در این نوبت منتشر نشده است.
