ناکامی کا درست نقشہ (failure map) ذمہ داری کا تعین واضح اور حتمی بناتا ہے۔ ماڈل نے صرف متن تیار کیا، لیکن یہ فیصلہ بیک اینڈ نے کیا کہ آیا POST /v1/tools/refund.create پر عمل درآمد ہو یا نہیں؛ بیک اینڈ ہی وہ جگہ ہے جہاں ہم ‘پرنسپل’ (صارف/سسٹم) کے دائرہ کار کو ثابت کر سکتے ہیں، ناقابلِ واپسی اقدامات کے لیے منظوری لازمی قرار دے سکتے ہیں، اور ‘آئیڈیمپوٹنسی کی’ (idempotency key) منسلک کر سکتے ہیں تاکہ دوبارہ کوششوں (retries) کے نتیجے میں رقم کی ڈبل ادائیگی نہ ہو۔ جب ہم اس حد کو نافذ کر دیتے ہیں، تو ‘پرامپٹ انجیکشن’ کی کوششیں محض ایسے ان پٹ بن کر رہ جاتی ہیں جو توثیق (validation) اور اجازت (authorization) کے مراحل میں ناکام ہو جاتے ہیں، نہ کہ ایسے احکامات جو رقم کی منتقلی کا باعث بنیں۔
ہم یہ فرض کرتے ہیں کہ آپ کو HTTP اسٹیٹس کوڈز کی عملی سمجھ بوجھ ہے، یعنی آپ جانتے ہیں کہ نیٹ ورک پر ‘انکار کا جواب’ (refusal response) کیا ظاہر کرتا ہے۔
ہم JWT کی بنیادی باتوں سے واقفیت فرض کرتے ہیں، یعنی ہم کسی تصدیق شدہ لائبریری کا استعمال کرتے ہوئے دستخط کی تصدیق کر سکتے ہیں اور جاری کنندہ (issuer)، وصول کنندہ (audience) اور میعاد ختم ہونے کی تاریخ (expiry) کی جانچ کر سکتے ہیں۔
ہم FastAPI میں ‘ڈیپینڈنسی انجیکشن’ (dependency injection) کے تصور کو فرض کرتے ہیں، جس کا مطلب ہے کہ ہم ہینڈلرز میں مختلف جگہوں پر جانچ پڑتال بکھیرنے کے بجائے، تصدیقِ شناخت (authentication)، اجازت (authorization) اور کوٹہ چیکس کو ‘ریکوئسٹ اسکوپڈ ڈیپینڈنسیز’ (request-scoped dependencies) کے طور پر منسلک کر سکتے ہیں۔
اس کورس کے دوران ہم جو نظام (artifact) تیار کریں گے وہ ایک ‘ریفرنس بیک اینڈ پائپ لائن’ ہے جس میں ہر مرحلے پر انکار (refusal) کا واضح نقطہ موجود ہے، ہر لاگ ریکارڈ میں ایسے مستقل فیلڈز ہیں جن کا جائزہ لینے والے تجزیہ کر سکتے ہیں، اور ہر ‘ریگریشن کیس’ (regression case) کسی ایک کنٹرول سے منسلک ہے۔ مقصد کوئی ہوشیار یا پیچیدہ پرامپٹ تیار کرنا نہیں ہے۔ مقصد ایک ایسا بیک اینڈ بنانا ہے جو اکاؤنٹ کی ہسٹری پر محفوظ طریقے سے RAG (Retrieval-Augmented Generation) کر سکے، refund.create کو صرف تب کال کرے جب u_123 اس کا اہل ہو اور منظور شدہ ہو، اور نیٹ ورک یا خفیہ ڈیٹا (secrets) تک رسائی دیے بغیر تجزیاتی اسکرپٹس چلا سکے۔ آگے دیا گیا ڈایاگرام اس ‘ریکوئسٹ پاتھ’ (درخواست کے راستے) کا تعین کرتا ہے جسے ہم مرحلہ وار محفوظ اور مضبوط (harden) بنائیں گے۔
FastAPI پر مبنی سپورٹ کوپائلٹ کا بیک اینڈ عام طور پر ایک روایتی انداز میں ناکام ہوتا ہے۔ بیک اینڈ acct_987 کے اکاؤنٹ کی ہسٹری پڑھتا ہے، ایک ماڈل اگلے اقدامات تجویز کرتا ہے، اور ایک ٹول کال txn_456 کے لیے ریفنڈ جاری کر دیتی ہے کیونکہ سپورٹ ٹکٹ کا متن پراعتماد انداز میں لکھا گیا تھا۔ اس میں کوئی غیر معمولی بات نہیں ہوئی۔ ایپلی کیشن نے ٹکٹ سے غیر مصدقہ (untrusted) متن قبول کیا، تجویز کو اجازت (authorization) سمجھا، اور اینڈ یوزر کے حقوق اور منظوری کے مرحلے (approval gate) کو لاگو کرنے کے بجائے سروس کے اپنے استحقاق (privileges) کے ساتھ refund.create کو چلایا۔
اس کورس میں سیکیورٹی کا کام ان مقامات پر نفاذ کے گمشدہ مراحل (enforcement stages) کو تعمیر کرنا ہے جہاں انہیں نافذ کیا جا سکتا ہے۔ پرامپٹ (prompt) کے الفاظ ٹول راؤٹر کو درخواست بھیجنے سے نہیں روک سکتے، اور کوئی ماڈل یہ ثابت نہیں کر سکتا کہ u_123 کو txn_456 کا ریفنڈ کرنے کی اجازت ہے۔ بیک اینڈ یا تو ٹول چلنے سے پہلے درخواست مسترد کر دیتا ہے، یا پھر ٹول چلا کر حقیقی رقم خرچ کر دیتا ہے۔
ہم ہر سبق کے لیے ایک ٹھوس حوالہ (anchor) برقرار رکھتے ہیں تاکہ ہر کنٹرول انہی متحرک حصوں پر لاگو ہو۔ ٹیننٹ (tenant) t_acme ہے، اینڈ یوزر u_123 ہے، اکاؤنٹ acct_987 ہے، اور ریفنڈ کے لیے زیرِ غور ٹرانزیکشن txn_456 ہے۔ ریفنڈ کا واحد ٹول refund.create ہے، اور اس تک پہنچنے والا واحد روٹ POST /v1/tools/refund.create ہے۔
ہم اس واحد ‘اسکوپ’ (scope) کا نام بھی متعین کرتے ہیں جو ریفنڈ کی اجازت دیتا ہے۔ ایسا پرنسپل (principal) جس کے پاس support:refund کا اختیار نہ ہو، وہ پالیسیوں کے بارے میں بات چیت کر سکتا ہے، اکاؤنٹ ہسٹری کا خلاصہ کر سکتا ہے اور جواب کا مسودہ تیار کر سکتا ہے، لیکن اسے refund.create چلانے کی اجازت نہیں ہونی چاہیے۔ ماڈل کا انتخاب واضح مگر تجریدی (abstract) رہتا ہے۔ ایپلی کیشن $CHAT_MODEL کے ذریعے چیٹ ماڈل کو کال کرتی ہے اور $MODERATION_MODEL کا استعمال وہاں کرتی ہے جہاں بعد کے کسی سبق میں مخصوص اسکریننگ کال کی ضرورت ہو۔
ایک بار نام متعین ہو جانے کے بعد، ہم درخواست کے واحد راستے (request path) کا نقشہ بنا سکتے ہیں اور نشاندہی کر سکتے ہیں کہ غیر مصدقہ ڈیٹا کہاں داخل ہوتا ہے۔ کالر کا پیغام اس وقت بھی غیر مصدقہ ہوتا ہے جب وہ کسی تصدیق شدہ سپورٹ ایجنٹ کی طرف سے آیا ہو، کیونکہ پیغام میں گاہک کا کاپی شدہ متن یا ٹکٹ کا مواد شامل ہو سکتا ہے۔ اکاؤنٹ ہسٹری کے حاصل کردہ حصے (chunks) غیر مصدقہ ہوتے ہیں کیونکہ بازیافت (retrieval) کے عمل میں وہی کچھ واپس آتا ہے جو اسٹور میں موجود ہو، بشمول پرانے نوٹس اور آزادانہ متن (free text) جو ماڈل کو کسی خاص سمت لے جانے کی کوشش کر سکتے ہیں۔ ٹول کے نتائج غیر مصدقہ ہوتے ہیں کیونکہ ڈاؤن اسٹریم سسٹمز غیر متوقع اسٹرنگز یا فیلڈز واپس کر سکتے ہیں، اور ماڈل کا آؤٹ پٹ بھی غیر مصدقہ ہوتا ہے کیونکہ ماڈل پالیسی کی تعمیل کے بجائے قابلِ یقین (plausible) متن کی تخلیق کے لیے کام کرتا ہے۔
یہ عمل صرف ایسے نفاذی مقامات (enforcement points) تشکیل دیتا ہے جو غیر مصدقہ (untrusted) ان پٹس کو ایک محدود اور قابلِ آڈٹ عمل میں تبدیل کر سکیں۔ ہم ‘پرنسپل’ (صارف یا سروس) کی تصدیق اور وابستگی (binding) کو یقینی بناتے ہیں تاکہ ہر درخواست میں t_acme اور u_123 سرور کے تصدیق شدہ حقائق کے طور پر شامل ہوں، نہ کہ کال کرنے والے کی طرف سے فراہم کردہ ہیڈرز (headers) کے طور پر۔ ہم پرووائیڈر کو کال کرنے سے پہلے کوٹے (quota) کی پیمائش کرتے ہیں تاکہ کوئی ایک اینڈ پوائنٹ راتوں رات پورے مہینے کے ٹوکنز خرچ نہ کر سکے۔ ہم کال کے مقام پر ہی ڈیٹا کے حصول (retrieval) کی اجازت دیتے ہیں تاکہ بیک اینڈ صرف وہی حصے (chunks) حاصل کرے جنہیں دیکھنے کا حق u_123 کو حاصل ہے، اور ہم حاصل کردہ ہر حصے کو بہرحال غیر مصدقہ مواد ہی سمجھتے ہیں۔ ہم ماڈل کے ساختہ آؤٹ پٹ (structured output) کی توثیق اس وقت کرتے ہیں جب اسے کسی راؤٹر، پارسر، ٹیمپلیٹ یا ٹول کی طرف بھیجے جانے سے پہلے جانچا جا سکے۔ ہم ٹول کالز کی اجازت اور منظوری دیتے ہیں تاکہ refund.create صرف اس لیے نہ چل سکے کہ ماڈل نے کوئی قائل کرنے والی تجویز پیش کی ہے۔ ہم تجزیاتی اسکرپٹس کو ‘سینڈ باکس’ (محفوظ ماحول) میں چلاتے ہیں تاکہ تیار کردہ کوڈ نیٹ ورک یا خفیہ معلومات (secrets) تک رسائی حاصل نہ کر سکے۔ ہم ہر انکار اور ہر انجام دیے گئے عمل کا آڈٹ کرتے ہیں اور اس میں ایسے کافی فیلڈز شامل کرتے ہیں جن سے یہ وضاحت ہو سکے کہ کس نے کیا کیا، کس ٹیننٹ (tenant) کے لیے کیا، اور بیک اینڈ نے اس کی اجازت کیوں دی۔
جب سپورٹ ٹکٹ کا متن ریفنڈ (رقم کی واپسی) شروع کرنے کی کوشش کرتا ہے، تو کسی بھی ٹول کے چلنے سے پہلے کون سا مرحلہ اس ریفنڈ کو مسترد کر سکتا تھا؟