7 मिनट पढ़ें

AI एजेंटों के लिए उलटने योग्य SaaS उपयोगकर्ता प्रोविजनिंग

निमंत्रण, भूमिका और समूह को अलग रखकर AI एजेंटों के लिए उलटने योग्य SaaS उपयोगकर्ता प्रोविजनिंग, सुरक्षित रीट्राई और साफ ऑडिट बनाएं।

AI एजेंटों के लिए उलटने योग्य SaaS उपयोगकर्ता प्रोविजनिंग

किसी AI एजेंट को “Priya को कंपनी खाते में सामान्य इंजीनियरिंग एक्सेस के साथ जोड़ दो” जैसे अस्पष्ट निर्देश से SaaS उपयोगकर्ता प्रोविजन नहीं करना चाहिए। इस वाक्य में कम से कम तीन बदलाव छिपे हैं: पहचान बनाना या आमंत्रित करना, खाते की भूमिका देना और समूह सदस्यता जोड़ना। हर बदलाव का जोखिम, पूरा होने की शर्त और उसे वापस करने का तरीका अलग है।

उलटने योग्य SaaS उपयोगकर्ता प्रोविजनिंग इन सीमाओं को बचाने से शुरू होती है। एजेंट क्रम प्रस्तावित करे, एक बार में एक कॉल चलाए, लौटे हुए ID दर्ज करे और देखी गई स्थिति अपेक्षा से अलग होते ही रुक जाए। कुछ अतिरिक्त API कॉल, टाइमआउट, गलत ईमेल या बहुत व्यापक समूह के बाद अधूरी अनुमति समझने की मेहनत से सस्ती हैं।

निमंत्रण, भूमिका और सदस्यता अलग स्थितियां हैं

लंबित निमंत्रण उपयोगकर्ता नहीं है, उपयोगकर्ता भूमिका नहीं है और भूमिका समूह सदस्यता नहीं है। विक्रेता की स्क्रीन इन्हें एक फ़ॉर्म में दिखा सकती है, पर नीचे की API अक्सर अलग संसाधन और जीवनचक्र कार्रवाई देती है। सुरक्षित सुधार इसी फर्क पर निर्भर है।

निमंत्रण आम तौर पर इरादा और वितरण या स्वीकार करने की प्रक्रिया है। व्यक्ति को उसे स्वीकार करना पड़ सकता है, वह दूसरी पहचान इस्तेमाल कर सकता है या जवाब न दे। Microsoft Graph बाहरी उपयोगकर्ता के लिए निमंत्रण ऑब्जेक्ट लौटाता है और व्यक्ति बाद में इंटरैक्टिव प्रक्रिया पूरी करता है। GitHub संगठन सदस्यता भी स्वीकार होने तक लंबित रहती है। तुरंत “उपयोगकर्ता बन गया” लिखना तथ्य नहीं, अनुमान है।

भूमिका खाते या संगठन की शक्ति बदलती है। व्यक्ति मालिक, बिलिंग प्रबंधक, एडमिन, अतिथि या सामान्य सदस्य बन सकता है। समूह अक्सर प्रोजेक्ट, रिपॉजिटरी, चैनल, ऐप या साझा डेटा का अप्रत्यक्ष एक्सेस देता है। समूह हटाने से भूमिका बदले बिना वह एक्सेस जा सकता है, जबकि भूमिका घटाने के बाद समूह से मिला अधिकार बच सकता है।

तीनों को अलग मॉडल करें, भले एक सुविधाजनक POST सब कुछ स्वीकार करता हो:

{
  "subject": "[email protected]",
  "invitation": {"state": "pending", "id": "inv_8421"},
  "role": {"desired": "member", "observed": null},
  "groups": {
    "desired": ["engineering", "on-call-readers"],
    "observed": []
  }
}

इससे साफ होता है कि क्या वापस करना है। खाता स्वीकार नहीं हुआ तो निमंत्रण रद्द करें। गलत भूमिका हो तो पुरानी भूमिका लौटाएं। एक समूह जुड़ा और अगला कॉल विफल हुआ तो केवल इसी रन में बनी सदस्यता हटाएं। पूरा उपयोगकर्ता मिटाना अक्सर बदली हुई स्थिति न जानने का खतरनाक विकल्प है।

एक जर्नल कार्रवाई एक दूर से देखे जा सकने वाले स्थिति बदलाव से जुड़ी होनी चाहिए। कॉल ईमेल जैसा अतिरिक्त असर कर सकता है, लेकिन एजेंट और ऑपरेटर मुख्य बदलाव को स्पष्ट नाम दे सकें।

प्रोविजनिंग योजना गद्य नहीं, डेटा होनी चाहिए

विक्रेता को कॉल करने से पहले एजेंट मानव अनुरोध को टाइप की हुई योजना में बदले। योजना अस्पष्ट धारणाएं दिखाती है और निष्पादक को स्थिर इनपुट देती है। खुला विचार निष्पादन से पहले खत्म हो; सीमा पर साधारण, सटीक डेटा पहुंचे।

योजना में विषय, लक्ष्य tenant, निमंत्रण तरीका, मांगी भूमिका और समूह, पूर्व शर्तें और operation ID हों। ईमेल भेजना है या नहीं, यह भी साफ लिखा हो। निमंत्रण रद्द करने से भेजा हुआ ईमेल वापस नहीं आता, इसलिए इसे default में छिपाना गलत है।

{
  "operation_id": "prov_2026_07_24_0187",
  "tenant": "acme-production",
  "subject": {"email": "[email protected]"},
  "steps": [
    {"kind": "invite", "send_email": false},
    {"kind": "wait_for_acceptance"},
    {"kind": "set_role", "role": "member"},
    {"kind": "add_group", "group": "engineering"},
    {"kind": "add_group", "group": "on-call-readers"}
  ],
  "preconditions": {
    "account_absent": true,
    "allowed_email_domain": "example.test"
  }
}

हर समूह अलग कदम रहे, चौड़े endpoint को सूची न दें। तब निष्पादक हर सदस्यता को अलग मंजूर, रीट्राई और वापस कर सकता है। यदि स्वीकार होने से पहले भूमिका नहीं मिल सकती, wait_for_acceptance वास्तविक स्थिति अवरोध है, समय की नींद नहीं।

सीक्रेट खोलने या नेटवर्क कॉल से पहले स्थानीय नियम जांचें। tenant सटीक ज्ञात ID हो, ईमेल का domain सामान्य करें पर स्थानीय हिस्सा न बदलें, समूह नाम को स्थायी vendor ID में बदलें और स्पष्ट मांग के बिना owner या admin रोकें। शक्तिशाली token से हर खाते में tenant खोजने न दें।

पहले किए गए reads मौजूदा स्थिति पकड़ें। दस्तावेज़ में बताए unique attribute से विषय खोजें, फिर सीधी भूमिका और सदस्यता पढ़ें। “नहीं मिला” और “read विफल” अलग हैं। 403, timeout या अधूरा page अनुपस्थिति साबित नहीं करता। eventual consistency या pagination हो तो बनाने से पहले मजबूत lookup करें।

मंजूरी के बाद योजना स्थिर रहे। ईमेल, भूमिका, group ID या delivery flag बदले तो नया operation ID और नया निर्णय लें। वरना मंजूर शब्द और चले कॉल अलग हो जाएंगे।

एक्सेस देने से पहले निमंत्रण को चरणबद्ध करें

पहले निमंत्रण बनाएं या भेजें, फिर सेवा से परिणाम सिद्ध होने तक रुकें। endpoint की सुविधा के कारण privileged role और संवेदनशील समूह साथ न बांधें। एक request atomic दिखती है, पर अधिकतर SaaS API पहचान, भूमिका, सूचना और group propagation पर transaction का वादा नहीं करतीं।

GitHub संगठन निमंत्रण में role और team IDs आ सकते हैं। console में यह आसान है, पर autonomous executor checkpoints खो देता है। validation सब रोक सकती है और response खोने पर असर अनजान रहता है। व्यक्ति agent run के बहुत बाद स्वीकार करके access सक्रिय कर सकता है।

विक्रेता का सबसे कम अधिकार वाला निमंत्रण चुनें। भूमिका जरूरी हो तो सामान्य member रखें और elevation बाद में करें। समूह या channel जरूरी हो तो बिना संवेदनशील संसाधन वाला arrival group चुनें। Slack Enterprise Grid निमंत्रण कम से कम एक channel मांगता है, इसलिए कम-access arrival channel बनाएं, सभी काम के channel न जोड़ें।

ईमेल भेजे जाने, invitation ID, status, समय और canonical subject को दर्ज करें। redemption URL व्यापक journal में न रखें; वह bearer capability हो सकता है। उसे सबसे छोटे trusted component से भेजें और agent-visible result से हटाएं।

accepted, expired, cancelled और pending जैसे अंतिम state इस्तेमाल करें। उपलब्ध न हों तो documented fields से state निकालकर derived लिखें। POST का 201 यह साबित नहीं करता कि व्यक्ति production data देख सकता है।

स्थानीय record में deadline रखें। समय बीतने पर state पढ़ें और जरूरत खत्म होने पर लंबित निमंत्रण रद्द करें। अंधा cancellation न चलाएं, क्योंकि व्यक्ति ठीक पहले स्वीकार कर सकता है। पढ़ें, तुलना करें, फिर action लें।

Cancellation केवल सीमित अर्थ में reversible है। वह भविष्य का accept रोक सकता है, पर ईमेल या संगठन की जानकारी वापस नहीं लेता। approval card पर यह सीमा दिखाएं।

पहचान स्थिर होने के बाद भूमिका दें

अनुरोध को स्थायी remote user ID से जोड़ने तक प्रतीक्षा करें। ईमेल खोज में उपयोगी है, लंबे समय का handle नहीं: पता बदलता है, alias टकराते हैं और निमंत्रण मौजूदा खाते से स्वीकार हो सकता है। आगे के कॉल vendor ID पर हों।

भूमिका बदलने से पहले मौजूदा भूमिका पढ़कर compensation value रखें। लक्ष्य पहले से मिला हो तो नया write न करें, no-op दर्ज करें। इससे जांच साबित होती है और एजेंट किसी दूसरे के बदलाव का श्रेय नहीं लेता।

सामान्य सदस्यता और elevation अलग रखें। standard member session approval में हो सकता है, जबकि owner, admin या billing के लिए हर कॉल पर approval चाहिए। सीमा HTTP method नहीं, credential के परिणाम पर चले। PATCH /users/123 एक field के कारण सामान्य या विनाशकारी हो सकता है।

ETag के साथ If-Match, version field या revision मिले तो प्रयोग करें। इससे preflight के बाद मानव बदलाव overwrite नहीं होगा। conflict पर फिर पढ़ें और समीक्षा के लिए रुकें; नई value पढ़कर पुरानी योजना जबरन न चलाएं।

जर्नल में before, requested, observed, remote subject ID, response status और version हो, bearer token नहीं:

{
  "operation_id": "prov_2026_07_24_0187",
  "step": 3,
  "action": "role.set",
  "subject_id": "usr_1938",
  "before": "guest",
  "requested": "member",
  "observed": "member",
  "http_status": 200,
  "undo": {"action": "role.set", "value": "guest"}
}

सफल update के बाद resource दोबारा पढ़कर effective role पक्का करें। API 202 Accepted दे सकती है, बदलाव async हो सकता है या pending और active अलग हों। read से प्रमाण मिलने तक journal में requested रहे।

यदि role downgrade compensation है, तय करें कि उसे भी approval चाहिए या नहीं। accidental owner को guest लौटाना सुरक्षित हो सकता है, पर मानव सुधार से टकरा सकता है। stored version इसी operation की version से मिले तभी automatic compensation करें।

हर समूह को अलग कॉल में जोड़ें

प्रोविजनिंग secrets एजेंट से दूर रखें
Sallyport SaaS credentials को HTTP calls में डालता है, एजेंट को नहीं दिखाता।

हर सदस्यता का अपना step, remote ID, result और undo हो। समूह बड़े access छिपाते हैं। engineering repository, deployment console, incident channel और synced applications खोल सकता है। friendly name से blast radius न मानें।

prompt से बाहर रखे allowlist catalog से group resolve करें। वह display name को tenant के immutable ID से जोड़े और direct, nested, dynamic या synced प्रकार बताए। समान नाम पर बंद हो जाएं। rule-managed समूह को repeated direct writes से न लड़ें।

Google Admin SDK Directory API add, update और DELETE remove को अलग endpoints देती है। documentation nested membership में देरी और cycles के rejection की चेतावनी देती है। इसलिए observed state जांचें, तुरंत consistency न मानें।

RFC 7644 के SCIM PATCH उदाहरण में पहले से मौजूद member को जोड़ने पर बदलाव नहीं और success होना चाहिए। यह retry-friendly है, पर हर implementation को जांचें और reconciliation lookup रखें।

चार परिणाम रखें: added, already_present, rejected, unknownalready_present के लिए undo न बनाएं, वरना पुराना access मिटेगा। unknown में write सफल हो सकता है, इसलिए reconcile करें, optimistic retry नहीं।

कम privilege से ज्यादा की ओर groups जोड़ें। basic collaboration पहले, production administration बाद में। sensitive boundary पर नई approval लें। latency घटाने के लिए parallel writes न करें; वे evidence, rate limits और downstream order बिगाड़ते हैं।

हर add के बाद direct membership पढ़ें, flattened effective view नहीं। effective access parent group से आ सकता है और direct edge हटने के बाद भी रह सकता है। receipt में इसी operation की edge हो।

सुरक्षित रीट्राई observed state से शुरू होता है

retry policy किसी POST को सुरक्षित नहीं बनाती। RFC 9110 PUT, DELETE और safe methods को intended effect से idempotent मानता है। non-idempotent request तभी अपने आप दोहराएं जब उसकी semantics idempotent हो या पहला request लागू न होने का प्रमाण हो।

निमंत्रण POST भेजने के बाद timeout सबसे खतरनाक है। server invitation और email बना चुका हो सकता है। दोहराने से duplicate बनेगा। subject और tenant से read करें, matching object अपनाएं, absence साबित होने पर ही retry करें और ambiguity पर रुकें।

API documented idempotency key दे तो immutable operation ID और step से key बनाकर journal में रखें और उसी logical attempt पर दोबारा इस्तेमाल करें। timeout पर नई key बनाना नई action बताता है।

key न हो तो हर write के लिए exact reconciliation function बनाएं। email और tenant invitation पहचानें, user ID और group ID membership edge। fuzzy match न करें। exact lookup न हो तो uncertain result को human confirmation चाहिए।

retry budget रखें। Retry-After मानें, transient error पर सीमित backoff करें और validation, permission या conflict पर रुकें। 403 धीमा 200 नहीं है।

परिणामअगला कदम
निश्चित सफलता और verified statestep receipt commit करें
बिना बदलाव निश्चित failureदर्ज करके रुकें
भेजने के बाद timeoutretry से पहले reconcile करें
success response पर अलग verificationdivergence दर्ज करके रुकें
retry निर्देश वाला rate limitbudget में प्रतीक्षा करें

transport attempts और logical steps अलग रखें। पांच HTTP attempts एक membership हो सकते हैं। मुख्य journal logical result दिखाए और linked attempts status तथा समय रखें।

rollback समय लौटाना नहीं, compensation है

approval को process से बांधें
नया agent process authorization से पहले अपनी code-signing authority दिखाता है।

SaaS provisioning में distributed transaction विरला है। reverse order में compensation करें: इस run की memberships हटाएं, पुरानी role लौटाएं और pending invitation रद्द करें। हर compensation असली API call है और विफल, approval-dependent या concurrent edit से टकरा सकता है।

confirmed changes से stack बनाएं, planned steps से नहीं। पहले से मौजूद group न हटाएं, server तक न पहुंची role न लौटाएं और unknown result पर पहले reconcile करें।

{
  "action": "group.add",
  "target": {"user_id": "usr_1938", "group_id": "grp_77"},
  "result": "added",
  "remote_version_after": "W/\"9012\"",
  "compensation": {
    "action": "group.remove",
    "only_if_direct_membership_matches": true
  }
}

version guard जरूरी है। एजेंट के बाद manager स्वतंत्र रूप से सदस्यता पक्का करे तो blind rollback उसका निर्णय मिटा सकता है। DELETE में condition न हो तो edge और metadata पढ़ें, conflict दिखाएं और मानव निर्णय लें।

हर असर का compensation नहीं होता। email वापस नहीं आता, audit event नहीं मिटना चाहिए, license billing बदल सकती है और downstream identity provider देर से बदलाव फैला सकता है। इन्हें residual effects लिखें।

rollback की deadline और escalation रखें। credential expire हो सकता है, service बंद हो सकती है, process खत्म हो सकता है। receipt agent context से बाहर रखें ताकि trusted executor जारी रखे। operator को rollback_pending साफ दिखे।

nonproduction tenant में असली व्यवहार जांचें: invitation बनाकर cancel और link जांचें; direct group edge जोड़कर हटाएं और effective access देखें; कम-risk role बदलकर conflict में restore करें।

जर्नल कारण और प्रभाव सिद्ध करे

जर्नल बताए कि बदलाव किसने मांगा, किस process ने चलाया, किस credential boundary ने अनुमति दी, कौन सा remote object बदला और verification कैसे हुई। tool transcript पर्याप्त नहीं; agent की कहानी गलत और HTTP body संवेदनशील हो सकती है।

operation और step को stable IDs दें। plan hash, tenant, normalized subject, remote IDs, approval, request fingerprint, response, verification read और compensation रखें। जरूरत पर redacted excerpt रखें; response hash निजी data कॉपी किए बिना तुलना देता है।

requested_role: member intent है, response_status: 200 transport observation और observed_role: member verified state। तीनों को एक success boolean में न खोएं।

$ provision status prov_2026_07_24_0187
STEP  ACTION                 RESULT            UNDO
1     invitation.create      accepted          unavailable
2     acceptance.wait        observed          n/a
3     role.set               changed           ready: guest
4     group.add engineering  added             ready
5     group.add on-call      denied            none
STATE partial_failure

यह output account, role change, सफल पहली group और denied आखिरी group साफ दिखाता है। इसे केवल “provisioning failed” न बनाएं।

कार्रवाई करने वाले agent से journal बचाएं। Sallyport sessions और individual calls को एक encrypted hash-chained log के दो views में रखता है; sp audit verify बिना key ciphertext chain को offline जांचता है। vendor audit logs फिर भी जरूरी हैं, पर local operator को स्वतंत्र क्रम मिलता है।

local step ID को vendor request ID से जोड़ें। timestamps रखें, पर monotonic local sequence से order करें क्योंकि clocks और async events अलग हो सकते हैं। retention में न्यूनतम fields, encryption, सीमित readers और auxiliary response की छोटी उम्र रखें।

approval परिणाम की सीमा पर हो

हर retry को call की तरह देखें
दोहराए invitation और membership attempts Activity में अलग entries बने रहते हैं।

एक approval card एक ठोस परिणाम बताए। “provisioning allow करें” बहुत व्यापक है। “बिना email [email protected] को acme-production में invite करें” समीक्षा योग्य है। role change और production group अलग जोखिम हों तो अलग निर्णय हों।

resolved IDs और current state दिखाएं: tenant, canonical subject, action, before, after और compensation। invitation पर email delivery और group पर display name के साथ immutable ID दिखे।

कम-risk repeated calls session authorization में हो सकते हैं, sensitive key हर use पर approval मांग सकती है। Sallyport की fixed decision ladder में vault खुला होना चाहिए, नया process default session authorization लेता है और per-key flag हर call पर approval मांग सकता है। privileged credential strict boundary के पीछे रखें।

approval कमजोर execution semantics नहीं सुधारती। सही group मंजूर होने पर भी timeout के बाद duplicate POST हो सकता है। idempotency, verification और compensation executor की जिम्मेदारी हैं।

बिना निर्णय वाले prompts हटाकर fatigue कम करें। limited reads session में हों, exact no-op बिना approval दर्ज हो। केवल तब low-risk memberships group करें जब UI हर target और rollback अलग receipt रखे।

revocation आगे के steps रोके, पूरे steps को उलटा हुआ न बताए। step चार के बाद session revoke हो तो queued calls cancel करें, operation interrupted लिखें और compensation plan दें।

विफल run भी समझ में आना चाहिए

मान लें contractor को सामान्य account और दो groups चाहिए। preflight में account नहीं मिलता। invitation भेजने के बाद timeout होता है, reconciliation एक pending invitation पाता है और उसका ID अपनाता है। contractor स्वीकार करता है, role बदलती है, पहला group जुड़ता है और दूसरे पर token authority न होने से 403 आता है।

यह partial result है। active account और एक direct membership मौजूद हैं। agent रुके, denied step दिखाए और दो विकल्प दे: बाकी authority मिलने तक confirmed state रखें, या पहली membership और पुरानी role compensate करें।

user delete न करें; data, accepted identity या downstream provisioning टूट सकती है। 403 retry न करें, delivered email को reversible न कहें और denied group की जगह व्यापक group न दें।

नया executor immutable plan और receipts पढ़कर remote account, role और पहली group मिलाए। सब समान हो तो केवल बाकी membership की approval ले। manager ने role बदली हो तो plan stale है और नया निर्णय चाहिए।

यही नियम offboarding पर भी लागू है। session revocation, group removal, role change, suspension और deletion की urgency और reversibility अलग हैं। license assignment अलग exposed हो तो उसे भी अलग रखें।

अतिरिक्त calls जानबूझकर रखी friction हैं। वे पहचान जांचने, authority सीमित करने, divergence पर रुकने और केवल इसी operation का बदलाव उलटने की जगह देती हैं। API कई परिणाम एक irreversible call में बांधे तो उसे वैसा ही दर्ज करें और उसके सामने मानव रखें।

सामान्य प्रश्न

क्या AI एजेंट एक कॉल में SaaS उपयोगकर्ता और access बनाए?

आम तौर पर नहीं। invitation या account, role और हर group अलग रखें ताकि स्वतंत्र verification और compensation हो। combined endpoint तभी लें जब उसके जुड़े परिणाम समझकर irreversible unit के रूप में मंजूर हों।

invitation API timeout पर क्या करें?

POST तुरंत न दोहराएं। tenant और canonical subject से exact invitation खोजें, साफ match अपनाएं और पहली request से कोई बदलाव न होने पर ही retry करें।

क्या user delete करना सुरक्षित rollback है?

अक्सर नहीं, क्योंकि data और accepted identity मिट सकती है। केवल इस run के confirmed बदलाव, जैसे direct group edge और पुरानी role, compensate करें।

पहले से मौजूद membership कैसे संभालें?

already_present दर्ज करें और undo न बनाएं। rollback में उसे हटाने से operation से पहले का access मिटेगा।

प्रोविजनिंग action सच में reversible कब है?

जब service observed पुरानी authorization लौटा सके और executor के पास सही IDs हों। email, billing और downstream propagation फिर भी रह सकते हैं।

audit entry में क्या रखें?

operation और step IDs, tenant, remote objects, before और requested values, approval, response, verification और compensation। credentials और redemption links न रखें।

क्या PUT और DELETE अपने आप retry किए जा सकते हैं?

HTTP intended effect से उन्हें idempotent मानता है, पर vendor semantics और concurrent changes जरूरी हैं। version conditions इस्तेमाल करें और call के बाद state जांचें।

क्या group additions parallel चलें?

privileged provisioning में sequential writes सुरक्षित हैं। वे क्रम, साफ evidence, आसान rate limits और हर membership की सही receipt देते हैं।

approval card क्या दिखाए?

एक परिणाम, tenant, canonical subject, immutable ID, before और after state, delivery effects और compensation। व्यापक “onboarding allow करें” बहुत कुछ छिपाता है।

403 के बाद agent क्या करे?

रुककर exact partial state बताए। permission error retry या व्यापक access से बदलने के बजाय corrected authorization की प्रतीक्षा करे या compensation दे।

Sallyport

Sallyport आपके AI एजेंट के लिए API कॉल और SSH कमांड चलाता है। कुंजियाँ आपके Mac पर एक लोकल वॉल्ट में रहती हैं; आप हर रन को स्वीकृत करते हैं और हर क्रिया एक सीलबंद जर्नल में दर्ज होती है।

© 2026 Sallyport · Apache-2.0 के तहत ओपन सोर्स · Oleg Sotnikov