Authagonal

दस्तावेज़ीकरण

Authagonal के साथ शुरुआत करने के लिए आपको जो कुछ भी चाहिए — अपना पहला टेनेंट बनाने से लेकर SSO, SCIM, और कस्टम ब्रांडिंग को जोड़ने तक।

शुरुआत करना

Authagonal हर टेनेंट को एक पूरी तरह से standards-compliant OIDC सर्वर देता है। हर टेनेंट को अपना खुद का जारीकर्ता URL, डिस्कवरी दस्तावेज़, और टोकन एंडपॉइंट्स मिलते हैं — टेनेंट के बीच कोई साझा इन्फ्रास्ट्रक्चर नहीं। आप 5 मिनट से भी कम समय में शून्य से एक कार्यशील लॉगिन फ़्लो तक पहुँच सकते हैं।

एक खाता बनाएँ

authagonal.io पर साइन अप करें और अपने खाते के लिए एक slug चुनें। यह slug आपका जारीकर्ता डोमेन बन जाता है: {slug}.authagonal.io। अपना खाता बनाने के बाद, शुरुआत करने के लिए अपना ईमेल पता सत्यापित करें।

Authagonal signup page showing tenant slug input and email verification

साइनअप के दौरान अपने खाते के लिए एक अद्वितीय slug चुनें

एक क्लाइंट पंजीकृत करें

पोर्टल साइडबार में Clients पर जाएँ और नया क्लाइंट पर क्लिक करें। अपने एप्लिकेशन के लिए एक clientId और clientName दर्ज करें। फिर, क्लाइंट के URI टैब पर, कम से कम एक रीडायरेक्ट URI जोड़ें; प्रमाणीकरण के बाद उपयोगकर्ताओं को यहीं भेजा जाता है। उदाहरण के लिए: https://app.example.com/callback। नए क्लाइंट्स को डिफ़ॉल्ट रूप से client secret की आवश्यकता होती है, इसलिए बिना backend वाले ब्राउज़र ऐप के लिए सामान्य टैब पर सीक्रेट आवश्यक करें बंद करें।

New client form with Client ID and Client Name fields

पोर्टल में एक नया OAuth क्लाइंट पंजीकृत करें

लोकल डेवलपमेंट

लोकल डेवलपमेंट के लिए रीडायरेक्ट URI के रूप में http://localhost:3000/callback का उपयोग करें। Authagonal localhost ओरिजिन्स के लिए non-HTTPS रीडायरेक्ट URIs की अनुमति देता है।

आपका पहला लॉगिन

एकीकृत करने का सबसे तेज़ तरीका oidc-client-ts है, जो JavaScript और TypeScript एप्लिकेशन के लिए एक हल्की OIDC क्लाइंट लाइब्रेरी है।

oidc-client-ts integration
import { UserManager } from 'oidc-client-ts';

const mgr = new UserManager({
  authority: 'https://acme.authagonal.io',
  client_id: 'my-app',
  redirect_uri: 'https://app.example.com/callback',
  response_type: 'code',
  scope: 'openid profile email',
});

// Redirect to login
mgr.signinRedirect();

// On callback page
const user = await mgr.signinRedirectCallback();
console.log(user.profile); // { sub, email, name, ... }

यदि आप किसी लाइब्रेरी के बिना न्यूनतम दृष्टिकोण पसंद करते हैं, तो आप सादे fetch के साथ मानक OAuth 2.0 authorization code flow का उपयोग कर सकते हैं:

Minimal fetch-based flow
// 1. Redirect the user to the authorization endpoint
const authorizeUrl = new URL('https://acme.authagonal.io/connect/authorize');
authorizeUrl.searchParams.set('client_id', 'my-app');
authorizeUrl.searchParams.set('redirect_uri', 'https://app.example.com/callback');
authorizeUrl.searchParams.set('response_type', 'code');
authorizeUrl.searchParams.set('scope', 'openid profile email');
authorizeUrl.searchParams.set('code_challenge', codeChallenge);
authorizeUrl.searchParams.set('code_challenge_method', 'S256');
window.location.href = authorizeUrl.toString();

// 2. On the callback page, exchange the code for tokens
const res = await fetch('https://acme.authagonal.io/connect/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    grant_type: 'authorization_code',
    code: new URLSearchParams(window.location.search).get('code')!,
    redirect_uri: 'https://app.example.com/callback',
    client_id: 'my-app',
    code_verifier: codeVerifier,
  }),
});

const tokens = await res.json();
// tokens.id_token, tokens.access_token (refresh_token only when offline_access is requested and allowed)
Authagonal login page with email and password fields, branded with tenant logo

आपके टेनेंट के लिए डिफ़ॉल्ट लॉगिन पेज

सैंडबॉक्स मोड

पहले एक सैंडबॉक्स एनवायरनमेंट में अपने एकीकरण का परीक्षण करें। पोर्टल में एनवायरनमेंट के अंतर्गत एक बनाएँ: हर सैंडबॉक्स को अपना URL ({env}-{slug}.authagonal.io, उदा. test1-acme.authagonal.io) मिलता है और लाइव उपयोगकर्ताओं को प्रभावित किए बिना किसी भी समय खाली स्थिति में रीसेट किया जा सकता है।

डैशबोर्ड

पोर्टल डैशबोर्ड आपको आपके टेनेंट का रीयल-टाइम अवलोकन देता है। यह सबसे महत्वपूर्ण मेट्रिक्स को सामने लाता है — उपयोगकर्ता वृद्धि, प्रमाणीकरण गतिविधि, और पोर्टल की हर सुविधा तक त्वरित नेविगेशन।

अवलोकन

डैशबोर्ड के शीर्ष पर आपको एक स्वागत संदेश और आपके टेनेंट के hosted लॉगिन का लॉगिन पृष्ठ खोलें लिंक दिखाई देगा। स्टेट कार्ड के नीचे, एक मासिक सक्रिय उपयोगकर्ता मीटर आपकी प्लान सीमा के मुकाबले उपयोग को ट्रैक करता है और 80% पार करने के बाद आपके प्लान विकल्पों से लिंक करता है। एक साइन-इन गतिविधि चार्ट और नवीनतम ऑडिट प्रविष्टियों की एक हाल की गतिविधि फ़ीड पेज को पूरा करते हैं।

Full dashboard view showing the welcome banner, stat cards, monthly active users meter, and sign-in activity chart

स्टेट कार्ड और साइन-इन गतिविधि के साथ डैशबोर्ड होम स्क्रीन

गतिविधि मेट्रिक्स

छह स्टेट कार्ड एक नज़र में आपके टेनेंट का सारांश देते हैं:

  • सक्रिय उपयोगकर्ता: आपके टेनेंट में उपयोगकर्ताओं की कुल संख्या
  • साइन-इन (24घं): पिछले 24 घंटों में सफल साइन-इन
  • MFA नामांकित: MFA नामांकित उपयोगकर्ताओं का प्रतिशत, नामांकित और कुल संख्या के साथ
  • असफल प्रयास (24घं): पिछले 24 घंटों में असफल साइन-इन, जैसे गलत क्रेडेंशियल्स, लॉक किए गए खाते, या नीति अस्वीकृतियाँ
  • SCIM सिंक: कनेक्टेड IdPs से प्रोविज़निंग गतिविधि, जो निष्क्रिय या ऑपरेशन की संख्या के रूप में दिखाई जाती है
  • मासिक खर्च: इस माह अब तक का खर्च, महीने के अंत के अनुमानित आँकड़े के साथ

24-घंटे वाले कार्ड पिछले 24 घंटों की तुलना उससे पहले के 24 घंटों से करते हैं। साइन-इन गतिविधि चार्ट 14, 30, या 90 दिनों की अवधि में प्रति दिन सफल और असफल साइन-इन दर्शाता है। डैशबोर्ड हर मिनट रिफ़्रेश होता है।

Six stat cards showing active users, sign-ins, MFA enrolment, failed attempts, SCIM sync, and monthly spend

पिछले 24 घंटों का सारांश देने वाले स्टेट कार्ड

त्वरित नेविगेशन

मेट्रिक्स के नीचे, नेविगेशन कार्ड सीधे Clients, SSO, Users, SCIM, Branding, Settings, Billing, Domains, और Audit Log से लिंक करते हैं। हर कार्ड एक संक्षिप्त विवरण दिखाता है ताकि नए टीम सदस्य खुद को जल्दी से परिचित कर सकें।

क्लाइंट्स

OAuth क्लाइंट उन एप्लिकेशन का प्रतिनिधित्व करते हैं जो आपके टेनेंट के माध्यम से उपयोगकर्ताओं का प्रमाणीकरण करते हैं। हर क्लाइंट का redirect URIs, स्कोप्स, ग्रांट प्रकार, टोकन जीवनकाल, और MFA policy के लिए अपना खुद का कॉन्फ़िगरेशन होता है।

क्लाइंट सूची

Clients पेज सभी पंजीकृत क्लाइंट्स की एक तालिका दिखाता है। हर पंक्ति clientId, डिस्प्ले नाम, रंगीन बैज के रूप में अनुमत ग्रांट प्रकार, और क्या PKCE सक्षम है, दिखाती है। पूर्ण कॉन्फ़िगरेशन संपादक खोलने के लिए किसी भी पंक्ति पर क्लिक करें।

Clients table showing clientId, name, grant type badges, and PKCE status for each registered application

ग्रांट प्रकार बैज और PKCE संकेतकों के साथ क्लाइंट सूची

एक क्लाइंट बनाना

एक नया एप्लिकेशन पंजीकृत करने के लिए नया क्लाइंट पर क्लिक करें। आपको दो फ़ील्ड प्रदान करने होंगे:

  • clientId — क्लाइंट के लिए एक अद्वितीय पहचानकर्ता (उदा. my-spa)
  • clientName — एक मानव-पठनीय डिस्प्ले नाम
New client form with Client ID and Client Name input fields

एक नया OAuth क्लाइंट पंजीकृत करें

एक क्लाइंट हटाना

किसी क्लाइंट को हटाने के लिए, क्लाइंट तालिका में उसकी पंक्ति पर ट्रैश आइकन पर क्लिक करें और पुष्टि करने के लिए client ID टाइप करें। क्लाइंट स्थायी रूप से हटा दिया जाता है और अब उपयोगकर्ताओं को साइन इन नहीं करा सकता या टोकन रिफ़्रेश नहीं कर सकता। पहले से जारी किए गए एक्सेस टोकन रद्द नहीं होते और समाप्त होने तक मान्य रहते हैं।

क्लाइंट कॉन्फ़िगरेशन संदर्भ

हर क्लाइंट के पास पाँच टैब में व्यवस्थित कॉन्फ़िगरेशन विकल्पों का एक व्यापक सेट होता है: सामान्य, URI, स्कोप और ग्रांट, टोकन, और सुरक्षा।

सामान्य सेटिंग्स

सेटिंगविवरणडिफ़ॉल्ट
clientNameसहमति स्क्रीन और पोर्टल में दिखाया जाने वाला डिस्प्ले नाम–
requirePkceauthorization code flows पर Proof Key for Code Exchange आवश्यक करेंचालू
requireClientSecretटोकन अनुरोधों के लिए एक client सीक्रेट आवश्यक करें (SPAs जैसे सार्वजनिक क्लाइंट्स के लिए अक्षम करें)चालू
allowOfflineAccessक्लाइंट को offline_access स्कोप के माध्यम से रिफ़्रेश टोकन्स का अनुरोध करने की अनुमति देंबंद
alwaysIncludeUserClaimsInIdTokenमेल खाने वाले scopes का अनुरोध न किए जाने पर भी profile, email, role, और group क्लेम्स को ID टोकन में शामिल करेंबंद
includeGroupsInTokensgroups scope का अनुरोध किए जाने पर जारी किए गए टोकन में उपयोगकर्ता के SCIM ग्रुप्स के नामों को एक groups क्लेम के रूप में शामिल करेंबंद

PKCE सुरक्षा

PKCE को अक्षम करने से authorization code flows की सुरक्षा कम हो जाती है। इसे केवल उन लीगेसी क्लाइंट्स के लिए अक्षम करें जो PKCE का समर्थन नहीं करते। सभी आधुनिक एप्लिकेशन को PKCE सक्षम रखना चाहिए।

URIs

URI फ़ील्ड एक टैग इनपुट का उपयोग करते हैं — एक मान टाइप करें और इसे जोड़ने के लिए Enter या comma दबाएँ। किसी भी टैग को हटाने के लिए उस पर X पर क्लिक करें।

सेटिंगविवरण
redirectUrisप्रमाणीकरण के बाद अनुमत callback URLs। प्राधिकरण अनुरोधों में redirect_uri पैरामीटर से बिल्कुल मेल खाना चाहिए।
postLogoutRedirectUrisलॉगआउट के बाद रीडायरेक्ट करने के लिए अनुमत URLs।
allowedCorsOriginsटोकन और UserInfo एंडपॉइंट्स के लिए क्रॉस-ओरिजिन अनुरोधों हेतु अनुमत ओरिजिन्स।
URI configuration section showing tag inputs for redirect URIs, post-logout URIs, and CORS origins

URIs कॉन्फ़िगर करने के लिए टैग इनपुट फ़ील्ड

Scopes और Grant Types

सेटिंगविकल्प
allowedScopesopenid profile email offline_access phone roles groups
allowedGrantTypesauthorization_code client_credentials refresh_token urn:ietf:params:oauth:grant-type:device_code urn:ietf:params:oauth:grant-type:token-exchange

Token Lifetimes

सेटिंगविवरणडिफ़ॉल्ट
accessTokenLifetimeSecondsएक्सेस टोकन्स कितने समय तक मान्य हैं1800 (30 min)
identityTokenLifetimeSecondsID tokens कितने समय तक मान्य हैं300 (5 min)
authorizationCodeLifetimeSecondsauthorization codes एक्सचेंज के लिए कितने समय तक मान्य हैं300 (5 min)
absoluteRefreshTokenLifetimeSecondsगतिविधि की परवाह किए बिना एक रिफ़्रेश टोकन का अधिकतम जीवनकाल2592000 (30 days)
slidingRefreshTokenLifetimeSecondsरिफ़्रेश टोकन की समाप्ति प्रत्येक उपयोग पर रीसेट हो जाती है, absolute जीवनकाल तक1296000 (15 days)
Token lifetime configuration fields with numeric inputs for each lifetime setting

प्रति क्लाइंट टोकन जीवनकाल कॉन्फ़िगर करें

Logout URIs

क्लाइंट बैक-चैनल और फ़्रंट-चैनल दोनों logout URIs पंजीकृत कर सकते हैं। दोनों में से कोई एक या दोनों वैकल्पिक हैं — जो भी इस बात से मेल खाता हो कि आपका एप्लिकेशन अपना सत्र कैसे साफ़ करता है, उसे कॉन्फ़िगर करें।

सेटिंगविवरण
backChannelLogoutUriएक signed logout टोकन के साथ server-to-server POST। उपयोगकर्ता का ब्राउज़र ऑफ़लाइन होने पर भी विश्वसनीय।
frontChannelLogoutUriलॉगआउट के दौरान एक छिपे हुए iframe में रेंडर किया जाता है ताकि ब्राउज़र cookies और local storage साफ़ कर दे।
frontChannelLogoutSessionRequiredचालू होने पर, logout URL को iss और sid क्वेरी parameters प्राप्त होते हैं ताकि आपका ऐप लॉगआउट को विशिष्ट सत्र के साथ सहसंबंधित कर सके।

दोनों का एक साथ उपयोग करें

Back-channel यह गारंटी देता है कि सर्वर को सूचित किया गया है; फ़्रंट-चैनल ब्राउज़र को साफ़ करता है। अधिकांश ऐप दोनों को कॉन्फ़िगर करने से लाभान्वित होते हैं।

MFA Policy

हर क्लाइंट की अपनी MFA policy होती है, जो क्लाइंट के <strong>सुरक्षा</strong> टैब पर सेट की जाती है। MFA policy ड्रॉपडाउन तीन विकल्प प्रदान करता है:

नीतिव्यवहार
अक्षमइस क्लाइंट के लिए MFA कभी संकेत नहीं किया जाता
सक्षमउपयोगकर्ता वैकल्पिक रूप से MFA में नामांकित हो सकते हैं; नामांकित होने पर उन्हें संकेत किया जाएगा
आवश्यकइस क्लाइंट के माध्यम से प्रमाणीकरण के लिए सभी उपयोगकर्ताओं को MFA पूरा करना होगा
MFA policy dropdown showing Disabled, Enabled, and Required options on the client configuration page

प्रति-क्लाइंट MFA policy

Enterprise SSO

Enterprise SSO आपके ग्राहकों को अपना खुद का आइडेंटिटी प्रोवाइडर लाने देता है। Authagonal डोमेन-आधारित रूटिंग के साथ SAML 2.0 और OIDC फ़ेडरेशन दोनों का समर्थन करता है, इसलिए उपयोगकर्ताओं को उनके ईमेल पते के आधार पर स्वचालित रूप से सही IdP पर निर्देशित किया जाता है।

SSO domain routing flow: shows how email domains are matched to SAML or OIDC identity providers

डोमेन-आधारित SSO रूटिंग

SAML 2.0 कनेक्शन

एक SAML कनेक्शन बनाने के लिए, SSO पेज पर जाएँ और SAML टैब चुनें। निम्नलिखित प्रदान करें:

फ़ील्डविवरण
connectionNameइस कनेक्शन के लिए एक मानव-पठनीय नाम (उदा. "Acme Corp Okta")
entityIdआपकी SP एंटिटी ID। यही मान अपने IdP में एप्लिकेशन के Identifier (Entity ID) के रूप में दर्ज करें; assertions में इसे Audience के रूप में होना चाहिए
metadataLocationIdP के SAML मेटाडेटा XML दस्तावेज़ का URL
metadataXmlपेस्ट किया गया IdP मेटाडेटा XML, उन IdP के लिए जिनके पास मेटाडेटा URL नहीं है (Google Workspace) या जिनका URL इंटरनेट से उपलब्ध नहीं है। यह या metadataLocation में से एक ही दें, दोनों नहीं
nameIdFormatIdP से अनुरोधित वैकल्पिक NameID फ़ॉर्मेट। emailAddress डिफ़ॉल्ट के लिए छोड़ दें, या NameIDPolicy को पूरी तरह हटाने के लिए "none" सेट करें (ADFS के लिए अनुशंसित)
allowedDomainsइस कनेक्शन पर रूट किए जाने वाले ईमेल डोमेन (उदा. acme.com)। API के माध्यम से सेट किए जाते हैं; पोर्टल उन्हें कनेक्शन कार्ड पर और डोमेन रूटिंग टैब पर दिखाता है

जब आप कनेक्शन सहेजते हैं, तो Authagonal मेटाडेटा document प्राप्त करता है और IdP का साइनिंग प्रमाणपत्र, SSO एंडपॉइंट URL, और name identifier format आयात करता है। प्रमाणपत्र रोटेशन को पकड़ने के लिए मेटाडेटा को समय-समय पर रीफ़्रेश किया जाता है।

SAML connection creation form with fields for connection name, SP entity ID, and IdP metadata

एक SAML 2.0 SSO कनेक्शन बनाएँ

OIDC कनेक्शन

एक OIDC फ़ेडरेशन कनेक्शन बनाने के लिए, OIDC टैब चुनें और प्रदान करें:

फ़ील्डविवरण
connectionNameइस कनेक्शन के लिए एक मानव-पठनीय नाम
metadataLocationOpenID Connect डिस्कवरी URL (उदा. https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration)
clientIdइस फ़ेडरेशन के लिए बाहरी IdP के साथ पंजीकृत client ID
clientSecretबाहरी IdP पंजीकरण के लिए client सीक्रेट
allowedDomainsइस कनेक्शन पर रूट किए जाने वाले ईमेल डोमेन (उदा. acme.com)। API के माध्यम से सेट किए जाते हैं; पोर्टल उन्हें कनेक्शन कार्ड पर और डोमेन रूटिंग टैब पर दिखाता है
OIDC connection creation form with fields for connection name, discovery URL, client ID, and client secret

एक OIDC फ़ेडरेशन कनेक्शन बनाएँ

डोमेन रूटिंग

डोमेन रूटिंग उपयोगकर्ताओं को उनके ईमेल डोमेन के आधार पर स्वचालित रूप से सही आइडेंटिटी प्रोवाइडर पर रीडायरेक्ट करता है। जब कोई उपयोगकर्ता लॉगिन पेज पर अपना ईमेल दर्ज करता है, तो Authagonal जाँचता है कि क्या डोमेन भाग (उदा. acme.com) किसी SSO कनेक्शन के allowedDomains से मेल खाता है। यदि मेल खाता है, तो उपयोगकर्ता को सहजता से उनके संगठन के IdP पर रीडायरेक्ट कर दिया जाता है।

ईमेल डोमेनSSO Providerप्रोटोकॉल
acme.comAcme Corp OktaSAML 2.0
contoso.comContoso Azure ADOIDC
example.orgExample OneLoginSAML 2.0
Domain routing table showing email domains mapped to SSO connections with protocol type

डोमेन रूटिंग ईमेल डोमेन को आइडेंटिटी प्रोवाइडर्स से मैप करता है

SP-Initiated फ़्लो

SP-initiated फ़्लो डिफ़ॉल्ट है — उपयोगकर्ता आपके लॉगिन पेज पर शुरू करते हैं और स्वचालित रूप से सही IdP पर रूट किए जाते हैं। उपयोगकर्ताओं को /saml/{connectionId}/login या /oidc/{connectionId}/login के माध्यम से सीधे किसी विशिष्ट कनेक्शन से डीप-लिंक भी किया जा सकता है।

JIT प्रोविज़निंग

जब कोई उपयोगकर्ता पहली बार SSO के माध्यम से साइन इन करता है और आपके टेनेंट में पहले से मौजूद नहीं होता है, तो Authagonal स्वचालित रूप से उनका खाता बना सकता है (Just-In-Time प्रोविज़निंग)। JIT प्रोविज़निंग डिफ़ॉल्ट रूप से बंद होती है: कनेक्शन बनाते समय JIT प्रोविज़निंग चालू करें को चेक करके इसे प्रति कनेक्शन चालू करें।

जब JIT प्रोविज़निंग अक्षम होता है, तो केवल वे उपयोगकर्ता जिन्हें पहले से प्रोविज़न किया गया है — SCIM, पोर्टल के Users पेज, या API के माध्यम से — उस कनेक्शन के माध्यम से साइन इन कर सकते हैं। अज्ञात उपयोगकर्ताओं को एक access_denied त्रुटि प्राप्त होती है और उन्हें अपने व्यवस्थापक से संपर्क करने के लिए निर्देशित किया जाता है।

प्रति-कनेक्शन सेटिंग

JIT प्रोविज़निंग प्रति SSO कनेक्शन नियंत्रित होता है, टेनेंट-व्यापी नहीं। आपके पास एक कनेक्शन हो सकता है जो JIT की अनुमति देता है (उदा. एक साझेदार संगठन के लिए जो अपने खुद के उपयोगकर्ताओं का प्रबंधन करता है) और दूसरा जिसे पूर्व-प्रोविज़निंग की आवश्यकता होती है (उदा. SCIM sync का उपयोग करने वाले किसी एंटरप्राइज़ ग्राहक के लिए)।

रोलआउट से पहले परीक्षण करें

प्रोडक्शन उपयोगकर्ताओं के लिए रोलआउट करने से पहले सैंडबॉक्स मोड के साथ SSO कनेक्शन का परीक्षण करें। यह आपको लाइव प्रमाणीकरण फ़्लो को प्रभावित किए बिना IdP कॉन्फ़िगरेशन, विशेषता मैपिंग, और डोमेन रूटिंग सत्यापित करने देता है।

संगठन-स्कोप्ड कनेक्शन

एक कनेक्शन पूरे टेनेंट के बजाय आपके टेनेंट के भीतर किसी एक संगठन का भी हो सकता है। यह तभी पेश किया जाता है जब वह संगठन पहले ही तय हो चुका हो: उससे पिन किए गए कस्टम डोमेन से, साइन-इन लिंक पर organization पैरामीटर से, या उसी एक संगठन के लिए रजिस्टर किए गए क्लाइंट से। टेनेंट-व्यापी लॉगिन पेज पर यह कभी नहीं दिखता। इनमें से कौन जीतता है, यह इसी क्रम में जाँचा जाता है, सबसे ऊपर वाला पहले।

साइन इन करने से सदस्यता बनती है

जो उपयोगकर्ता संगठन-स्कोप्ड कनेक्शन से साइन इन करता है, वह अपने आप उस संगठन का सदस्य बन जाता है, ठीक वैसे ही जैसे JIT प्रोविज़निंग उसका अकाउंट बनाती है। अलग से आमंत्रण का कोई चरण नहीं है।

डोमेन की विशिष्टता प्रति स्कोप होती है

एक ईमेल डोमेन टेनेंट-व्यापी स्तर पर एक बार और इससे स्वतंत्र रूप से हर संगठन के भीतर एक-एक बार क्लेम किया जा सकता है। acme.com टेनेंट-व्यापी कनेक्शन पर रूट हो सकता है, और संगठन चुने जाने के बाद उस संगठन के अपने कनेक्शन पर भी। लेकिन वह एक ही स्कोप के दो कनेक्शनों का हिस्सा नहीं हो सकता। कनेक्शन सहेजते समय Authagonal इसे अस्वीकार कर देता है।

उपयोगकर्ता

Users पेज आपको अपने टेनेंट में सभी एंड उपयोगकर्ताओं का प्रबंधन करने देता है। आप उपयोगकर्ताओं को खोज सकते हैं, उनके विवरण देख सकते हैं, नए उपयोगकर्ताओं को आमंत्रित कर सकते हैं, और देख सकते हैं कि प्रत्येक उपयोगकर्ता को कैसे प्रोविज़न किया गया था।

खोज बार किसी सटीक user ID या ईमेल से, या ईमेल, पहले नाम, या अंतिम नाम के prefix से मेल खाता है, और सभी, सक्रिय, और निष्क्रिय फ़िल्टर सूची को स्थिति के आधार पर सीमित करते हैं। खोज 300ms पर debounced है ताकि API को अभिभूत किए बिना आपके टाइप करते ही परिणाम अपडेट हों। परिणाम प्रति पेज 50 उपयोगकर्ताओं पर पेजिनेटेड होते हैं; पेजों के बीच जाने के लिए तालिका के नीचे नेविगेशन नियंत्रणों का उपयोग करें।

उपयोगकर्ता तालिका

उपयोगकर्ता तालिका प्रत्येक उपयोगकर्ता के लिए निम्नलिखित कॉलम दिखाती है:

कॉलमविवरण
उपयोगकर्ताउपयोगकर्ता का नाम (या नाम सेट न होने पर ईमेल), उसके नीचे उनका ईमेल, और ईमेल की पुष्टि होने तक एक असत्यापित बैज
स्थितिActive या Inactive — इंगित करता है कि खाता सक्षम है या नहीं
स्रोतSCIM या Local — उपयोगकर्ता कैसे बनाया गया था
भूमिकाएँउपयोगकर्ता को असाइन की गई भूमिकाएँ
MFAEnabled multi-factor authentication नामांकित होने पर, अन्यथा एक डैश
बनाया गयावह तारीख जब उपयोगकर्ता खाता बनाया गया था
User list table with columns for user, status, source, roles, MFA, and created date

खोज बार और पेजिनेशन के साथ उपयोगकर्ता सूची

उपयोगकर्ताओं को आमंत्रित करना

किसी को अपने टेनेंट में आमंत्रित करने के लिए उपयोगकर्ता को आमंत्रित करें पर क्लिक करें। उन्हें अपना पासवर्ड खुद सेट करने के लिए एक ईमेल मिलता है। फ़ॉर्म में ये फ़ील्ड होते हैं:

फ़ील्डविवरण
emailउपयोगकर्ता का ईमेल पता (टेनेंट के भीतर अद्वितीय होना चाहिए)
firstNameउपयोगकर्ता का पहला नाम
lastNameउपयोगकर्ता का अंतिम नाम
localeपसंदीदा भाषा। उपयोगकर्ता की UI और ईमेल भाषा सेट करती है; वैकल्पिक, English पर वापस आ जाती है।
organizationIdवैकल्पिक संगठन जिसमें उपयोगकर्ता को जोड़ना है, उसमें उनकी भूमिकाओं के साथ। तब दिखाया जाता है जब आपके टेनेंट में संगठन हों
Invite user form with email, first name, last name, and Language fields

एक नए उपयोगकर्ता को आमंत्रित करें

SCIM-Provisioned उपयोगकर्ता

SCIM के माध्यम से बनाए गए उपयोगकर्ता स्रोत कॉलम में एक "SCIM" बैज के साथ चिह्नित होते हैं। उनका जीवनचक्र (निर्माण, अपडेट, और निष्क्रियकरण) अपस्ट्रीम आइडेंटिटी प्रोवाइडर द्वारा प्रबंधित किया जाता है।

पसंदीदा भाषा

हर उपयोगकर्ता की एक पसंदीदा भाषा होती है जो उनकी hosted UI और Authagonal द्वारा उन्हें भेजे जाने वाले transactional emails (सत्यापन, password reset, welcome, और अधिक) दोनों को संचालित करती है। आप इसे उपयोगकर्ता को आमंत्रित करते समय सेट कर सकते हैं और उपयोगकर्ता के विवरण पेज से इसे किसी भी समय बदल सकते हैं। यदि किसी उपयोगकर्ता की कोई पसंदीदा भाषा सेट नहीं है, तो Authagonal English पर वापस आ जाता है। चयनकर्ता सभी समर्थित locales प्रदान करता है: English, Chinese (Simplified), German, French, Spanish, Vietnamese, Portuguese, Japanese, Arabic, Hindi, और Afrikaans।

User detail edit form with profile fields including a preferred Language selector

विवरण पेज पर उपयोगकर्ता की पसंदीदा भाषा सेट करें

उपयोगकर्ता विवरण

इसका विवरण पेज खोलने के लिए उपयोगकर्ता सूची में किसी भी पंक्ति पर क्लिक करें। वहाँ से आप प्रोफ़ाइल डेटा संपादित कर सकते हैं, भूमिकाओं (roles) का प्रबंधन कर सकते हैं, MFA रीसेट कर सकते हैं, कस्टम विशेषताएँ की समीक्षा कर सकते हैं, और उपयोगकर्ता को हटा सकते हैं।

User detail page showing profile fields, status, assigned roles, and custom attributes

प्रोफ़ाइल

ईमेल, पहला/अंतिम नाम, फ़ोन, कंपनी, भाषा, external ID संपादित करें, और उपयोगकर्ता के active flag को टॉगल करें। ईमेल या email-confirmed flag बदलने के लिए admin या owner की आवश्यकता होती है। ईमेल परिवर्तन टेनेंट भर में अद्वितीय रहने चाहिए; यदि पहले से लिया गया है तो API email_already_in_use लौटाता है।

भूमिकाएँ (Roles)

Roles पेज पर परिभाषित भूमिकाएँ असाइन और अनअसाइन करें। जब क्लाइंट roles scope का अनुरोध करता है, तो असाइन की गई भूमिकाएँ ID और एक्सेस टोकन्स में roles क्लेम के रूप में जारी की जाती हैं।

Multi-Factor Authentication

उपयोगकर्ता के लिए पंजीकृत हर MFA क्रेडेंशियल देखें (authenticator app (TOTP), WebAuthn/passkeys, और recovery codes), प्रत्येक अपने खुद के registered/last-used timestamps के साथ। व्यक्तिगत क्रेडेंशियल हटाएँ, या सभी MFA रीसेट करें; दोनों के लिए admin या owner की आवश्यकता होती है। रीसेट करने से उपयोगकर्ता को अगले लॉगिन पर फिर से नामांकित होना पड़ता है।

Custom Attributes

उपयोगकर्ता से जुड़ा मनमाना key/value डेटा। keys अद्वितीय होनी चाहिए। Attributes user profile API और SCIM के माध्यम से उजागर होते हैं, और एक कस्टम स्कोप के userClaims को कॉन्फ़िगर करके इन्हें एक्सेस-टोकन क्लेम्स से मैप किया जा सकता है।

संगठन

वह संगठन जिससे यह उपयोगकर्ता संबंधित है। यह आपकी अपनी पसंद का एक फ़्री-टेक्स्ट पहचानकर्ता है, जो उनके टोकनों में और profile स्कोप के अंतर्गत /connect/userinfo पर org_id क्लेम के रूप में जारी होता है। Authagonal इसे कभी स्वयं व्युत्पन्न नहीं करता: इसे आपका प्रोविज़निंग ऐप सेट करता है, या वह SCIM क्रेडेंशियल जिसने उपयोगकर्ता को बनाया, या इसे यहाँ हाथ से सेट किया जाता है।

फ़ील्ड के बगल में मौजूद लिंक उन सभी को सूचीबद्ध करता है जिनका यही मान है, और वही फ़िल्टर API पर GET /api/v1/users?organizationId= के रूप में उपलब्ध है। पूरी डायरेक्टरी को पेज-दर-पेज देखे बिना यह जानने के लिए इसका उपयोग करें कि कौन किस ग्राहक का है।

उपयोगकर्ता हटाएँ

उपयोगकर्ता और उनके सभी MFA क्रेडेंशियल को स्थायी रूप से हटा देता है। पुष्टि के लिए उपयोगकर्ता का ईमेल टाइप करें — इसे पूर्ववत नहीं किया जा सकता।

ग्रुप्स

ग्रुप्स आपको उपयोगकर्ताओं को व्यवस्थित करने और टोकन्स में ग्रुप सदस्यता शामिल करने देते हैं। ग्रुप्स को पोर्टल में मैन्युअल रूप से बनाया जा सकता है या किसी बाहरी आइडेंटिटी प्रोवाइडर से SCIM के माध्यम से स्वचालित रूप से प्रोविज़न किया जा सकता है।

ग्रुप सूची

ग्रुप्स SCIM पेज के समूह टैब पर निम्नलिखित जानकारी के साथ सूचीबद्ध होते हैं:

कॉलमविवरण
ग्रुप नामग्रुप का डिस्प्ले नाम
सदस्यवर्तमान में ग्रुप में उपयोगकर्ताओं की संख्या
स्रोतSCIM या Manual — ग्रुप कैसे बनाया गया था
बनाया गयावह तारीख जब ग्रुप बनाया गया था
Groups list table showing group name, member count, source badge, granted roles, and created date

स्रोत संकेतकों के साथ ग्रुप सूची

एक ग्रुप बनाना

नया समूह पर क्लिक करें और ग्रुप के लिए एक प्रदर्शन नाम दर्ज करें। ग्रुप नाम वर्णनात्मक और आपके टेनेंट के भीतर अद्वितीय होने चाहिए (उदा. "Engineering", "Billing Admins", "Beta Testers")।

ग्रुप विवरण और सदस्य

विवरण दृश्य खोलने के लिए किसी भी ग्रुप पर क्लिक करें। यहाँ आप सभी वर्तमान सदस्यों को देख सकते हैं और सदस्यता का प्रबंधन कर सकते हैं:

  • Add members: किसी उपयोगकर्ता को ईमेल या नाम से खोजें और उसे ग्रुप में जोड़ें।
  • Remove members: किसी भी सदस्य के बगल में remove बटन पर क्लिक करें और पुष्टि करें। ग्रुप के माध्यम से दी गई सभी भूमिकाएँ रद्द कर दी जाती हैं।
Group detail view showing the member list, a user search to add members, and the roles the group grants

विवरण दृश्य में ग्रुप सदस्यता का प्रबंधन करें

Tokens में ग्रुप्स

जब किसी क्लाइंट पर टोकन में समूह सक्षम होता है और groups scope का अनुरोध किया जाता है, तो जारी किए गए टोकन में एक groups क्लेम शामिल होता है जो उपयोगकर्ता के ग्रुप्स के प्रदर्शन नामों को सूचीबद्ध करता है:

groups claim
{
  "sub": "user-123",
  "email": "[email protected]",
  "groups": ["Engineering", "Beta Testers"]
}

प्रति क्लाइंट सक्षम करें

टोकन में समूह सेटिंग प्रत्येक क्लाइंट पर व्यक्तिगत रूप से, क्लाइंट के सामान्य टैब पर कॉन्फ़िगर की जाती है। क्लाइंट को groups scope की भी अनुमति देनी होगी।

भूमिकाएँ (Roles)

भूमिकाएँ (Roles) आपके एप्लिकेशन में role-based access control (RBAC) का समर्थन करती हैं। Authagonal में भूमिकाएँ परिभाषित करें, उन्हें उपयोगकर्ताओं को असाइन करें, और अपने एप्लिकेशन लॉजिक में प्राधिकरण लागू करने के लिए टोकन्स में roles क्लेम का उपयोग करें।

भूमिकाओं का प्रबंधन

Roles पेज inline editing के साथ सभी परिभाषित भूमिकाओं की एक तालिका दिखाता है। प्रत्येक भूमिका में होता है:

कॉलमविवरण
नामभूमिका के लिए एक अद्वितीय पहचानकर्ता (उदा. "admin", "editor", "viewer")
विवरणभूमिका क्या प्रदान करती है, इसका एक मानव-पठनीय विवरण
बनाया गयावह तारीख जब भूमिका बनाई गई थी

एक भूमिका बनाना

नई भूमिका पर क्लिक करें और एक नाम और विवरण प्रदान करें। भूमिका नाम संक्षिप्त होने चाहिए और आपके एप्लिकेशन भर में एक सुसंगत naming convention का पालन करना चाहिए (उदा. हाइफ़न के साथ lowercase: billing-admin)।

Inline Editing

भूमिकाएँ सीधे तालिका में inline editing का समर्थन करती हैं। edit मोड में प्रवेश करने के लिए किसी भी भूमिका पर pencil आइकन पर क्लिक करें — नाम और विवरण फ़ील्ड संपादन योग्य हो जाते हैं। मानों को संशोधित करें, फिर सहेजने के लिए checkmark आइकन पर क्लिक करें। परिवर्तन तुरंत प्रभावी हो जाते हैं।

एक भूमिका हटाना

किसी भी भूमिका को हटाने के लिए उस पर delete आइकन पर क्लिक करें। भूमिका को स्थायी रूप से हटाए जाने से पहले आपसे पुष्टि करने के लिए कहा जाएगा। किसी भूमिका को हटाने से मौजूदा टोकन्स पूर्वव्यापी रूप से अमान्य नहीं होते — हटाने के बाद जारी किए गए नए टोकन्स में भूमिका अनुपस्थित होगी।

Roles table with inline editing active, showing editable name and description fields with save and cancel icons

roles तालिका में भूमिकाओं की inline editing

Tokens में भूमिकाएँ

जब क्लाइंट roles scope का अनुरोध करता है, तो किसी उपयोगकर्ता को असाइन की गई भूमिकाएँ ID और एक्सेस टोकन में एक roles क्लेम के रूप में शामिल होती हैं। आपका एप्लिकेशन प्राधिकरण निर्णय लेने के लिए इस क्लेम को पढ़ सकता है:

roles claim in ID token
{
  "sub": "user-123",
  "email": "[email protected]",
  "roles": ["admin", "billing-admin"]
}

SCIM प्रोविज़निंग

SCIM 2.0 (System for Cross-domain Identity Management) Okta, Azure AD, OneLogin और JumpCloud जैसे एंटरप्राइज़ आइडेंटिटी प्रोवाइडर से स्वचालित उपयोगकर्ता और समूह प्रोविज़निंग सक्षम करता है। कॉन्फ़िगर होने पर, उपयोगकर्ता खाते और समूह सदस्यताएँ अपस्ट्रीम IdP से आपके Authagonal टेनेंट में स्वचालित रूप से सिंक हो जाती हैं।

SCIM provisioning flow: shows user lifecycle events flowing from enterprise IdP through Authagonal SCIM API to your app via TCC webhooks

डाउनस्ट्रीम प्रोविज़निंग के साथ SCIM उपयोगकर्ता लाइफसाइकल सिंक

सेटअप चरण

किसी क्लाइंट के लिए SCIM प्रोविज़निंग सक्षम करने हेतु इन चरणों का पालन करें:

  1. क्लाइंट एप्लिकेशन चुनें — वह OAuth क्लाइंट चुनें जिसके साथ SCIM प्रोविज़निंग संबद्ध होगी।
  2. SCIM टोकन जनरेट करें — एक विवरण और दिनों में समाप्ति अवधि दें, फिर टोकन जनरेट करें।
  3. टोकन तुरंत कॉपी करें — रॉ टोकन मान केवल एक बार दिखाया जाता है। डायलॉग बंद करने से पहले इसे कॉपी कर लें।
  4. अपना IdP कॉन्फ़िगर करें — अपने आइडेंटिटी प्रोवाइडर की SCIM सेटिंग्स में base URL और bearer टोकन दर्ज करें।
  5. उपयोगकर्ता सिंक का परीक्षण करें — अपने IdP से एक परीक्षण सिंक ट्रिगर करें और सत्यापित करें कि उपयोगकर्ता Authagonal पोर्टल में दिखाई देते हैं।

SCIM Base URL

अपने आइडेंटिटी प्रोवाइडर को निम्नलिखित base URL के साथ कॉन्फ़िगर करें:

SCIM Base URL
https://{slug}.authagonal.io/scim/v2

{slug} को अपने टेनेंट slug से बदलें।

SCIM configuration page showing client selector, token generation form, and base URL

टोकन जनरेशन के साथ SCIM सेटअप पेज

टोकन प्रबंधन

SCIM टोकन आपके IdP से प्रोविज़निंग अनुरोधों को प्रमाणित करते हैं। आप प्रति क्लाइंट कई टोकन प्रबंधित कर सकते हैं:

फ़ील्डविवरण
विवरणटोकन की पहचान के लिए एक लेबल (उदा. "Okta Production SCIM")
समाप्तिदिनों में टोकन की अवधि (1 से 3650, डिफ़ॉल्ट 365)।
स्थितिसक्रिय टोकन उपयोग में हैं। रद्द किए गए टोकन एक Revoked बैज दिखाते हैं और अब अनुरोध प्रमाणित नहीं कर सकते।

किसी टोकन को रद्द करने के लिए, उसके बगल में मौजूद Revoke बटन पर क्लिक करें। रद्द किए गए टोकन ऑडिट उद्देश्यों के लिए सूची में दिखते रहते हैं लेकिन तुरंत अनुरोध स्वीकार करना बंद कर देते हैं।

SCIM token list showing active and revoked tokens with description, expiry date, and revoke button

सक्रिय और रद्द किए गए टोकन संकेतकों के साथ टोकन प्रबंधन

टोकन तुरंत कॉपी करें

रॉ SCIM टोकन बनाए जाने पर केवल एक बार दिखाया जाता है। इसे तुरंत कॉपी कर लें — इसे बाद में पुनः प्राप्त नहीं किया जा सकता। यदि आप टोकन खो देते हैं, तो आपको एक नया जनरेट करना होगा और अपना IdP कॉन्फ़िगरेशन अपडेट करना होगा।

कनेक्टिविटी का परीक्षण

ServiceProviderConfig एंडपॉइंट को क्वेरी करके सत्यापित करें कि आपका SCIM इंटीग्रेशन काम कर रहा है:

Test SCIM connectivity
curl -H "Authorization: Bearer YOUR_TOKEN" \
  https://acme.authagonal.io/scim/v2/ServiceProviderConfig

एक सफल प्रतिक्रिया एक JSON दस्तावेज़ लौटाती है जो समर्थित SCIM सुविधाओं का वर्णन करती है: PATCH और फ़िल्टरिंग समर्थित हैं, जबकि बल्क ऑपरेशन, पासवर्ड बदलना, सॉर्टिंग और ETags समर्थित नहीं हैं।

पसंदीदा भाषा

SCIM preferredLanguage एट्रिब्यूट (जो locale पर फ़ॉलबैक करता है) उपयोगकर्ता की संग्रहीत भाषा से मैप होता है। SCIM के माध्यम से प्रोविज़न किए गए SSO उपयोगकर्ता स्वचालित रूप से उनके IdP द्वारा भेजी गई भाषा में स्थानीयकृत ईमेल प्राप्त करते हैं।

एक क्रेडेंशियल क्या देख सकता है

एक SCIM क्रेडेंशियल केवल उन्हीं उपयोगकर्ताओं और समूहों को देखता है जिन्हें उसने प्रोविज़न किया है। किसी दूसरे कनेक्टर द्वारा बनाए गए उपयोगकर्ता को पढ़ना, अपडेट करना या हटाना 404 लौटाता है, सूचीकरण केवल उसके अपने लौटाता है, और किसी समूह की सदस्यता में केवल वही उपयोगकर्ता नामित किए जा सकते हैं जिन्हें उसी कनेक्टर ने प्रोविज़न किया हो। किसी अन्य तरीके से बनाए गए खाते, चाहे किसी प्रशासक द्वारा, स्वयं-सेवा साइनअप द्वारा या SSO जस्ट-इन-टाइम प्रोविज़निंग द्वारा, SCIM के लिए पूरी तरह अदृश्य होते हैं।

वह सीमा प्रति क्लाइंट है, प्रति टोकन नहीं। एक ही क्लाइंट के विरुद्ध जारी किए गए दो क्रेडेंशियल दो सीक्रेट वाली एक ही पहचान हैं, और हर एक वह बदल सकता है जो दूसरे ने बनाया है। परस्पर अविश्वसनीय कनेक्टरों को एक-एक अलग क्लाइंट दें। externalId का दायरा भी इसी तरह तय होता है, इसलिए दो कनेक्टर बिना टकराव के अलग-अलग लोगों के लिए ext-001 का उपयोग कर सकते हैं।

डीप्रोविज़निंग

DELETE /scim/v2/Users/{id} खाते को निष्क्रिय करता है और उसे हटाया गया चिह्नित करता है। रिकॉर्ड रखा जाता है, जैसा RFC 7644 अनुमति देता है, लेकिन वह हर आगामी ऑपरेशन पर 404 लौटाता है और सूचियों से छोड़ दिया जाता है। उनके MFA नामांकन और समूह सदस्यताएँ मिटा दी जाती हैं, उनकी externalId मैपिंग मुक्त कर दी जाती है, और जारी किए गए सभी टोकन रद्द कर दिए जाते हैं, ताकि पहुँच अगले टोकन की समाप्ति पर नहीं, बल्कि तुरंत समाप्त हो जाए।

यदि वही व्यक्ति बाद में दोबारा नियुक्त किया जाता है और फिर से बनाया जाता है, तो उसे नया user id मिलता है। पहचानकर्ताओं का पुनः उपयोग कभी नहीं किया जाता: यह id आपके द्वारा अब तक जारी किए गए हर टोकन में subject है, इसलिए इसे दोबारा इस्तेमाल करने पर, उस पर भरोसा करने वाले हर एप्लिकेशन में, नए जुड़ने वाले व्यक्ति को चुपचाप पिछले धारक का इतिहास मिल जाएगा।

सिंक किए गए उपयोगकर्ताओं को संगठन से टैग करना

SCIM में किसी कनेक्टर के पास यह बताने का कोई तरीका नहीं है कि वह आपके किस ग्राहक को सिंक कर रहा है। कोर SCIM कोई संगठन एट्रिब्यूट परिभाषित नहीं करता, इसलिए एक सामान्य उपयोगकर्ता निर्माण आपको व्यक्ति का नाम और ईमेल बताता है और यह कुछ नहीं बताता कि वह किसका है। यदि कई ग्राहक आपके टेनेंट में प्रोविज़न करते हैं, तो उनके उपयोगकर्ता ऐसे आते हैं कि उनमें अंतर नहीं किया जा सकता।

इसका उत्तर अनुरोध नहीं, बल्कि क्रेडेंशियल देता है। जब आप SCIM टोकन बनाते हैं, तो संगठन के अंतर्गत अपने टेनेंट के संगठनों में से एक चुनें (आपके टेनेंट में संगठन होने के बाद यह picker दिखाई देता है)। उस टोकन के माध्यम से प्रोविज़न किया गया हर उपयोगकर्ता उस संगठन का सक्रिय सदस्य बन जाता है और उसके बाद उसे अपने टोकनों में org_id क्लेम के रूप में रखता है। एक ही क्लाइंट के विरुद्ध प्रति ग्राहक एक क्रेडेंशियल जारी करें, और उनके सिंक किए गए उपयोगकर्ता हर ग्राहक के लिए अलग क्लाइंट पंजीकरण के बिना सही ढंग से आरोपित होकर आते हैं। इसे खाली छोड़ दें तो उपयोगकर्ता बिना टैग के रहते हैं।

टैग करना आइसोलेशन नहीं है

स्वामित्व प्रति क्लाइंट लागू होता है, प्रति टोकन नहीं। एक ही क्लाइंट पर दो क्रेडेंशियल दो सीक्रेट वाली एक ही पहचान हैं: हर एक उन उपयोगकर्ताओं को पढ़ सकता है, उनका नाम बदल सकता है, उन्हें निष्क्रिय कर सकता है और हटा सकता है जिन्हें दूसरे ने बनाया है। जब सभी क्रेडेंशियल आप स्वयं रखते हैं, तब यह ठीक है। यदि हर ग्राहक की अपनी IT टीम अपना क्रेडेंशियल रखती है, तो उन्हें एक-एक क्लाइंट दें, और उनके क्रेडेंशियल पर संगठन भी सेट करें।

टैग उपयोगकर्ता के बनाए जाने पर लगाया जाता है और बाद के किसी अपडेट पर कभी नहीं, इसलिए एक नियमित इंक्रीमेंटल सिंक किसी मौजूदा खाते को चुपचाप स्थानांतरित नहीं कर सकता। यदि आप एक प्रोविज़निंग ऐप भी चलाते हैं, तो क्रेडेंशियल पर लगा स्पष्ट टैग जीतता है: /try की प्रतिक्रिया केवल उसी संगठन को भरती है जो अब भी खाली है।

समर्थित स्कीमा

हम कोर SCIM 2.0 User और Group स्कीमा (RFC 7643) लागू करते हैं। समर्थित उपयोगकर्ता एट्रिब्यूट हैं userName, name.givenName, name.familyName, displayName, emails, active, externalId और preferredLanguage / locale।

enterprise user एक्सटेंशन लागू नहीं किया गया है, इसलिए department, manager, employeeNumber, costCenter, division और organization को संग्रहीत करने के बजाय स्वीकार करके अनदेखा कर दिया जाता है, चाहे create हो, replace हो या PATCH। Entra और Okta दोनों इनमें से कुछ को डिफ़ॉल्ट रूप से मैप करते हैं, इसलिए आपको इन्हें अपनी एट्रिब्यूट मैपिंग से हटाने की आवश्यकता नहीं है। किसी उपयोगकर्ता को अपने किसी ग्राहक से आरोपित करने के लिए, इसके बजाय SCIM क्रेडेंशियल पर संगठन सेट करें: enterprise organization एट्रिब्यूट आपके ग्राहक के आइडेंटिटी प्रोवाइडर द्वारा दावा किया जाता है, और वह जानबूझकर उनका org_id नहीं बनता।

OAuth स्कोप

स्कोप क्लाइंट्स को उपयोगकर्ता के डेटा या अनुमतियों के विशिष्ट हिस्से का अनुरोध करने देते हैं। Authagonal मानक OIDC स्कोप और आपके APIs के लिए आपके द्वारा परिभाषित कस्टम स्कोप दोनों का समर्थन करता है।

अंतर्निहित स्कोप

स्कोपविवरण
openidकिसी भी OpenID Connect प्रवाह के लिए आवश्यक। एक ID token जारी करता है।
profileमानक प्रोफ़ाइल क्लेम्स लौटाता है (name, given_name, family_name, locale, org_name)।
emailउपयोगकर्ता का ईमेल पता और सत्यापन स्थिति लौटाता है।
phoneउपयोगकर्ता का फ़ोन नंबर (phone_number) लौटाता है।
offline_accessएक्सेस टोकन के साथ एक रिफ़्रेश टोकन जारी करता है।
rolesउपयोगकर्ता का roles क्लेम जारी करता है। इस स्कोप के बिना, भूमिकाएँ emit नहीं की जातीं।
groupsउपयोगकर्ता का groups क्लेम (SCIM समूह सदस्यता) जारी करता है। इस स्कोप के बिना, groups emit नहीं किए जाते।

कस्टम स्कोप

Scopes पेज पर अपने स्वयं के स्कोप परिभाषित करें। प्रत्येक स्कोप एक अनुमति या संसाधन का वर्णन करता है जिसका एक क्लाइंट अनुरोध कर सकता है (उदाहरण के लिए, billing.read, orders.write)।

Custom scope creation form with name, display name, description and User Claims fields
फ़ील्डविवरण
nameटोकन अनुरोधों में भेजा गया स्कोप पहचानकर्ता (उदा. billing.read)।
displayNameसहमति स्क्रीन पर दिखाया गया मानव-पठनीय लेबल।
descriptionसहमति पर display name के नीचे दिखाया गया लंबा स्पष्टीकरण।
userClaimsइस स्कोप के ग्रांट होने पर एक्सेस टोकन और ID टोकन में जोड़े गए अतिरिक्त क्लेम्स।
showInDiscoveryDocumentयदि चालू है, तो स्कोप /.well-known/openid-configuration में दिखाई देता है।
emphasizeसहमति स्क्रीन पर स्कोप को संवेदनशील के रूप में हाइलाइट करता है।
requiredउपयोगकर्ता को सहमति के दौरान स्कोप को अचयनित करने से रोकता है।
groupसहमति समूह: एक ही शीर्षक साझा करने वाले स्कोप सहमति स्क्रीन पर एक चेकबॉक्स के अंतर्गत एक साथ दिखाई देते हैं। केवल प्रस्तुति के लिए।
allowedRolesवे भूमिकाएँ जो उपयोगकर्ता के पास इस स्कोप को पाने के लिए होनी चाहिए। खाली होने पर सभी को अनुमति है; इनमें से कोई भी भूमिका न रखने वाले उपयोगकर्ता को अस्वीकार नहीं किया जाता, बल्कि उसके टोकन से स्कोप हटा दिया जाता है।

सहमति एकीकरण

RequireConsent: true वाले क्लाइंट पहले अनुरोध पर उपयोगकर्ता को संकेत देते हैं। किसी स्कोप को हटाने से पहले से जारी किए गए टोकन्स रद्द नहीं होते — यदि आवश्यक हो तो उन्हें स्पष्ट रूप से रद्द करें।

टोकन्स पर कस्टम क्लेम्स

कस्टम क्लेम्स के दो हिस्से होते हैं। source प्रति-उपयोगकर्ता डेटा है: प्रत्येक AuthUser में एक customAttributes dictionary होती है जिसे आप पोर्टल से (Users → user → Custom Attributes), SCIM के माध्यम से, या एक TCC प्रोविज़निंग hook के माध्यम से पॉपुलेट कर सकते हैं। release प्रति-स्कोप है: प्रत्येक स्कोप की userClaims सूची उन keys को नाम देती है जिन्हें वह server छोड़ने की अनुमति देता है।

जब एक क्लाइंट स्कोप का अनुरोध करता है, तो Authagonal ग्रांट किए गए स्कोप के माध्यम से चलता है, उनकी userClaims सूचियों का union करता है, और उपयोगकर्ता के customAttributes से केवल उन्हीं keys को emit करता है। अज्ञात keys चुपचाप गिरा दी जाती हैं — एक क्लाइंट नाम का अनुमान लगाकर किसी विशेषता को नहीं पढ़ सकता। मानक OIDC क्लेम्स (sub, email, name, आदि) spec का पालन करते हैं और whitelist के अधीन नहीं हैं।

Example: project-scope claims on an access token
# 1. On the user (Portal → Users → {user} → Custom Attributes)
department = "engineering"
employee_id = "E-1042"
seat_tier = "enterprise"

# 2. On a custom scope (Portal → Scopes → projects.read)
name        = "projects.read"
userClaims  = ["department", "seat_tier"]   # <-- whitelist

# 3. Client requests scope=openid projects.read
# Decoded access token (relevant fields only):
{
  "sub": "u-9b…",
  "scope": "openid projects.read",
  "department": "engineering",
  "seat_tier":  "enterprise"
  // employee_id is NOT emitted; it's not in the whitelist for any granted scope.
}

फ़ेडरेशन क्लेम्स प्रति-सत्र कमियाँ भरते हैं

जब एक उपयोगकर्ता अपस्ट्रीम IdP (SAML/OIDC SSO) के माध्यम से साइन इन करता है, तो IdP से आने वाले प्रति-सत्र क्लेम्स, उदाहरण के लिए एक SAML एसर्शन से मैप किया गया department विशेषता, उसी स्कोप whitelist से गुजरते हैं लेकिन केवल कमियाँ भरते हैं: key टकराव पर persisted customAttributes मान जीतता है। उन्हें इस सत्र के टोकन्स पर emit किया जाता है (और refresh रोटेशन के बाद भी बने रहते हैं) बिना उपयोगकर्ता रिकॉर्ड में वापस लिखे जाने के।

क्लाइंट्स को स्कोप असाइन करना

Clients → Scopes & Grants टैब पर अनुमत स्कोप जोड़ें। एक क्लाइंट केवल उन्हीं स्कोप का अनुरोध कर सकता है जो उसे ग्रांट किए गए हैं; अज्ञात स्कोप invalid_scope के साथ अस्वीकार कर दिए जाते हैं।

ब्रांडिंग

अपने टेनेंट के लॉगिन पेजों का रूप-रंग कस्टमाइज़ करें। ब्रांडिंग सेटिंग्स आपको प्रमाणीकरण अनुभव को अपने उत्पाद की दृश्य पहचान से मिलाने देती हैं — लोगो और रंगों से लेकर उन्नत CSS ओवरराइड तक।

रूप-रंग

सेटिंगविवरण
appNameलॉगिन पेज हेडर में (जब कोई लोगो सेट न हो) और transactional emails में प्रदर्शित एप्लिकेशन नाम
logoUrlआपकी लोगो छवि का URL। लॉगिन पेज के शीर्ष पर प्रदर्शित होता है। अनुशंसित आकार: 200x60px या समान आस्पेक्ट रेशियो।
primaryColorबटन, लिंक और फ़ोकस अवस्थाओं के लिए उपयोग किया जाने वाला प्राथमिक ब्रांड रंग। कलर पिकर या हेक्स इनपुट के माध्यम से सेट करें। मान बदलते ही एक लाइव पूर्वावलोकन अपडेट होता है।
customCssUrlडिफ़ॉल्ट स्टाइल के बाद लोड होने वाली CSS फ़ाइल का URL। इसे लॉगिन पेज वाले ही origin से सर्व किया जाना चाहिए; किसी अन्य origin का URL अनदेखा कर दिया जाता है।
Branding appearance settings with app name input, logo URL field, color picker with hex input, and custom CSS URL field

लाइव रंग पूर्वावलोकन के साथ रूप-रंग सेटिंग्स

संपर्क जानकारी

सेटिंगविवरण
supportEmailलॉगिन पेजों पर प्रदर्शित एक सपोर्ट ईमेल पता। उपयोगकर्ता इसे तब देखते हैं जब उन्हें अपने खाते में सहायता चाहिए होती है।

लॉगिन पेज टॉगल

नियंत्रित करें कि आपके टेनेंट के लॉगिन पेज पर कौन से तत्व दिखाई दें:

टॉगलविवरणडिफ़ॉल्ट
showForgotPasswordलॉगिन फ़ॉर्म पर "पासवर्ड भूल गए?" लिंक प्रदर्शित करेंचालू
showRegistrationस्व-सेवा उपयोगकर्ता पंजीकरण के लिए "साइन अप" लिंक प्रदर्शित करेंचालू
poweredByलॉगिन पेज के नीचे "Powered by Authagonal" बैज प्रदर्शित करेंचालू
A customized login page showing a branded logo, custom primary color on the sign-in button, and support email in the footer

कस्टम ब्रांडिंग लागू किए गए उदाहरण लॉगिन पेज

कस्टम CSS

लॉगिन पेज के रूप-रंग पर पूर्ण नियंत्रण के लिए, अपनी ब्रांडिंग सेटिंग्स में एक CSS फ़ाइल URL दें। फ़ाइल डिफ़ॉल्ट स्टाइल के बाद लोड होती है, इसलिए आपके नियमों को प्राथमिकता मिलती है। URL लॉगिन पेज वाले ही origin पर होना चाहिए; अन्य origins से stylesheets लोड नहीं की जातीं।

CSS कस्टम प्रॉपर्टीज़

लॉगिन पेज सामान्य ओवरराइड के लिए CSS कस्टम प्रॉपर्टीज़ (वेरिएबल) का समर्थन करता है। जटिल सेलेक्टर लिखे बिना रंग, फ़ॉन्ट और आकार बदलने के लिए इन्हें अपनी CSS फ़ाइल में सेट करें।
/* your-custom-styles.css */
:root {
--auth-bg: #1a1a2e;
--auth-card-bg: #16213e;
--auth-heading: #e0e0e0;
--auth-radius: 12px;
--auth-font: 'Inter', sans-serif;
}
वेरिएबलविवरणडिफ़ॉल्ट
--auth-bgपेज पृष्ठभूमि रंग#f3f4f6
--auth-card-bgलॉगिन कार्ड पृष्ठभूमिwhite
--auth-headingशीर्षक टेक्स्ट रंग#111827
--auth-radiusकार्ड बॉर्डर रेडियस0.5rem
--auth-fontफ़ॉन्ट फ़ैमिलीinherit

डार्क मोड

लॉगिन ऐप लाइट, डार्क और सिस्टम थीम के साथ आता है। Branding पेज पर डार्क मोड सेटिंग डिफ़ॉल्ट चुनती है: off, auto (सिस्टम वरीयता का पालन करता है, यही डिफ़ॉल्ट है) या force। उपयोगकर्ता फिर भी लॉगिन पेज पर एक टॉगल से चुन सकते हैं; यह विकल्प सेशनों के बीच बना रहता है। system पर सेट होने पर, SPA prefers-color-scheme को लाइव ट्रैक करता है।

लाइट मान :root पर घोषित होते हैं; डार्क ओवरराइड .dark तक सीमित होते हैं। customCssUrl के माध्यम से सेट की गई टेनेंट ब्रांडिंग हमेशा जीतती है — इसलिए आपके रंग उपयोगकर्ता की थीम की परवाह किए बिना बने रहते हैं।

एलिमेंट सेलेक्टर

अधिक सूक्ष्म नियंत्रण के लिए, data-auth एट्रिब्यूट का उपयोग करके विशिष्ट तत्वों को लक्षित करें। ये सेलेक्टर अपडेट के दौरान स्थिर रहते हैं — जब हम आंतरिक क्लास नाम बदलते हैं तो ये नहीं टूटेंगे।
सेलेक्टरएलिमेंट
[data-auth="page"]पूर्ण-पेज पृष्ठभूमि कंटेनर
[data-auth="header"]लोगो और ऐप नाम क्षेत्र
[data-auth="logo"]लोगो छवि
[data-auth="app-name"]ऐप नाम शीर्षक (जब कोई लोगो सेट न हो)
[data-auth="content"]मुख्य सामग्री क्षेत्र (फ़ॉर्म, संदेश)
[data-auth="login-form"]लॉगिन फ़ॉर्म एलिमेंट
[data-auth="email-field"]ईमेल इनपुट रैपर
[data-auth="password-field"]पासवर्ड इनपुट रैपर
[data-auth="submit-button"]साइन-इन बटन
[data-auth="languages"]भाषा चयनकर्ता बार

सेटिंग्स

टेनेंट-व्यापी सुरक्षा नीतियाँ, वेबहुक और एनवायरनमेंट सेटिंग्स कॉन्फ़िगर करें। ये सेटिंग्स सभी क्लाइंट पर वैश्विक रूप से लागू होती हैं, जब तक कि क्लाइंट स्तर पर ओवरराइड न की जाएँ।

पासवर्ड नीति

उपयोगकर्ता → सेटिंग्स के अंतर्गत, अपने टेनेंट के सभी उपयोगकर्ताओं के लिए पासवर्ड जटिलता आवश्यकताएँ परिभाषित करें:

सेटिंगरेंजडिफ़ॉल्ट
minPasswordLength6 – 1288
requireUppercaseचालू / बंदचालू
requireLowercaseचालू / बंदचालू
requireDigitचालू / बंदचालू
requireSpecialCharचालू / बंदचालू
Password policy settings showing minimum length slider and toggle switches for character requirements

पासवर्ड नीति कॉन्फ़िगरेशन

MFA नीति

टेनेंट-व्यापी MFA नीति, जो उपयोगकर्ता → सेटिंग्स के अंतर्गत सेट की जाती है, डिफ़ॉल्ट मल्टी-फैक्टर प्रमाणीकरण व्यवहार सेट करती है। अलग-अलग क्लाइंट इस सेटिंग को ओवरराइड कर सकते हैं।

नीतिव्यवहार
DisabledMFA उपलब्ध नहीं है। उपयोगकर्ता MFA में नामांकन नहीं कर सकते।
EnabledMFA वैकल्पिक है। उपयोगकर्ता नामांकन करना चुन सकते हैं और नामांकित होने पर लॉगिन के समय संकेत दिया जाएगा।
RequiredMFA अनिवार्य है। सभी उपयोगकर्ताओं को MFA में नामांकन करना होगा और प्रत्येक लॉगिन पर एक दूसरा फैक्टर पूरा करना होगा।

सेशन और लॉकआउट

सेशन अवधि और खाता लॉकआउट व्यवहार को नियंत्रित करें:

सेटिंगरेंजडिफ़ॉल्ट
sessionLifetimeMinutes5 – 43,200 (30 दिन)60
maxFailedAttempts1 – 1005
lockoutDurationMinutes1 – 1,440 (24 घंटे)10
Session and lockout settings with numeric inputs for session lifetime, max failed attempts, and lockout duration

सेशन और लॉकआउट कॉन्फ़िगरेशन

वेबहुक

वेबहुक आपको प्रमाणीकरण इवेंट पर रियल टाइम में प्रतिक्रिया देने देते हैं। दो इवेंट (onUserAuthenticated, onTokenIssued) प्रवर्तनीय हैं — डिफ़ॉल्ट रूप से वे एसिंक्रोनस रूप से फ़ायर होते हैं और उपयोगकर्ता को ब्लॉक नहीं करते, लेकिन आप प्रति इवेंट प्रवर्तन का विकल्प चुन सकते हैं ताकि एक non-2xx प्रतिक्रिया या {"allow": false} बॉडी कार्रवाई को अस्वीकार कर दे। शेष इवेंट सूचनाएँ हैं — हमेशा fire-and-forget, कभी ब्लॉक नहीं करतीं।

इवेंटप्रकारविवरण
onUserAuthenticatedप्रवर्तनीयसफल लॉगिन के बाद फ़ायर होता है। डिफ़ॉल्ट रूप से fire-and-forget होता है ताकि लॉगिन लेटेंसी प्रभावित न हो। इसे ब्लॉकिंग बनाने के लिए <code>webhookEnforceUserAuthenticated</code> टॉगल करें — फिर एक non-2xx प्रतिक्रिया या <code>{"allow": false}</code> बॉडी लॉगिन को अस्वीकार कर देती है।
onTokenIssuedप्रवर्तनीयटोकन मिंट होने से पहले फ़ायर होता है (authorization_code, refresh_token, client_credentials)। डिफ़ॉल्ट रूप से fire-and-forget। इसे ब्लॉकिंग बनाने के लिए <code>webhookEnforceTokenIssued</code> टॉगल करें — फिर एक non-2xx प्रतिक्रिया या <code>{"allow": false}</code> बॉडी टोकन जारी करने से रोक देती है।
onUserCreatedसूचनाजब कोई नया उपयोगकर्ता पंजीकरण करता है या SCIM के माध्यम से प्रोविज़न किया जाता है तो fire-and-forget सूचना।
onUserUpdatedसूचनाजब कोई उपयोगकर्ता रिकॉर्ड अपडेट होता है (प्रोफ़ाइल परिवर्तन, भूमिका परिवर्तन, SCIM अपडेट) तो fire-and-forget सूचना।
onUserDeletedसूचनाजब किसी उपयोगकर्ता को हटाया जाता है, चाहे पोर्टल/SCIM के माध्यम से या रिटेंशन नीति द्वारा, तो fire-and-forget सूचना।
onLoginFailedसूचनाजब गलत क्रेडेंशियल, लॉकआउट या नीति अस्वीकृति के कारण लॉगिन प्रयास विफल होता है तो fire-and-forget सूचना।

अतिरिक्त वेबहुक सेटिंग्स:

सेटिंगरेंजडिफ़ॉल्टविवरण
webhookTimeoutSeconds1 – 305टाइम आउट होने से पहले प्रवर्तन वेबहुक प्रतिक्रिया की प्रतीक्षा करने का अधिकतम समय
webhookFailOpenचालू / बंदचालूसक्षम होने पर, यदि कोई प्रवर्तन वेबहुक पहुँच से बाहर है या टाइम आउट हो जाता है, तो ऑपरेशन को आगे बढ़ने की अनुमति दी जाती है
Webhook configuration section showing URL inputs for each event type, timeout slider, and fail-open toggle

वेबहुक इवेंट कॉन्फ़िगरेशन

प्रवर्तन वेबहुक उपलब्धता

प्रवर्तन वेबहुक प्रमाणीकरण प्रवाह को ब्लॉक कर सकते हैं। यदि आपका वेबहुक एंडपॉइंट डाउन हो जाता है और webhookFailOpen अक्षम है, तो कोई भी उपयोगकर्ता लॉग इन नहीं कर पाएगा। fail-open मोड का उपयोग करें, जब तक कि आपके पास सख्त अनुपालन आवश्यकताएँ न हों जो वेबहुक विफलता पर ब्लॉक करना अनिवार्य करती हों।

वेबहुक का सत्यापन

एक बार कोई वेबहुक URL कॉन्फ़िगर हो जाने पर, Authagonal एक प्रति-टेनेंट साइनिंग सीक्रेट मिंट करता है (एक whsec_… मान जो Settings → Webhooks के अंतर्गत केवल-पढ़ने के लिए दिखाया जाता है)। प्रत्येक आउटबाउंड डिलीवरी एक X-Authagonal-Signature: t=<unix>,v1=<hex> हेडर ले जाती है, जहाँ v1 रॉ रिक्वेस्ट बॉडी पर परिकलित HMAC-SHA256(secret, "{t}.{body}") है। इसे अपने एंडपॉइंट पर पुनः परिकलित करें और constant-time तुलना करें ताकि पुष्टि हो सके कि अनुरोध वास्तव में Authagonal से आया था और इसके साथ छेड़छाड़ नहीं हुई थी — और उन डिलीवरी को अस्वीकार करें जिनका t रीप्ले रोकने के लिए बहुत पुराना है।

वेबहुक सत्यापित करें (Node.js)
import crypto from 'node:crypto';

// rawBody MUST be the exact bytes Authagonal sent: verify before any JSON re-serialization.
function verifyAuthagonalWebhook(signatureHeader, rawBody, signingSecret) {
  const parts = Object.fromEntries(signatureHeader.split(',').map((p) => p.split('=')));
  const { t, v1 } = parts;

  // Replay protection: reject deliveries older than 5 minutes.
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;

  const expected = crypto
    .createHmac('sha256', signingSecret)
    .update(`${t}.${rawBody}`)
    .digest('hex');

  return v1.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}

साइनिंग सीक्रेट को रोटेट करना

साइनिंग सीक्रेट को रोटेट करने के लिए उसके बगल में Regenerate का उपयोग करें — उदाहरण के लिए संदिग्ध लीक के बाद। पिछला सीक्रेट तुरंत अमान्य हो जाता है, इसलिए अपने वेरिफ़ायर को नए मान से अपडेट करें अन्यथा इन-फ्लाइट डिलीवरी अपनी सिग्नेचर जाँच में विफल होने लगेंगी।

मेंटेनेंस विंडो

आपके टेनेंट के डेटा को स्टोरेज shards के बीच स्थानांतरित करने जैसे विघटनकारी ऑपरेशन के लिए एक पसंदीदा मेंटेनेंस विंडो सेट करें। एक UTC घंटा (0–23) चुनें; पोर्टल सुविधा के लिए आपके स्थानीय टाइमज़ोन में समतुल्य समय भी प्रदर्शित करता है।

साइनअप और एक्सेस

आपके टेनेंट में कौन उपयोगकर्ता बन सकता है, और वे किन शर्तों पर साइन इन कर सकते हैं।

सेटिंगडिफ़ॉल्टविवरण
Public signupचालूकोई भी खुद को पंजीकृत कर सकता है या नहीं। इसे बंद करने पर पंजीकरण पेज छिप जाता है और पंजीकरण API अनुरोध अस्वीकार कर देती है, और यही मायने रखता है: सिर्फ़ लिंक छिपाने से एंडपॉइंट खुला रह जाता। इसका उपयोग तब करें जब आप उपयोगकर्ताओं को खुद SCIM, API या आमंत्रणों के ज़रिए प्रोविज़न करते हों।
Require email verification to sign inचालूबिना पुष्टि वाला पता साइन इन नहीं कर सकता। अगर सत्यापन पर रोक आपका अपना ऐप लगाता है तो इसे बंद कर दें; email_verified क्लेम दोनों ही स्थितियों में टोकन के साथ जाता है, इसलिए यह संकेत आपके पास बना रहता है।
Dynamic client registrationबंदकिसी क्लाइंट को RFC 7591 के तहत रनटाइम पर खुद को पंजीकृत करने देता है, और किसी AI एजेंट या MCP कनेक्टर को फ़्लो शुरू करने से पहले यही चाहिए। डिफ़ॉल्ट रूप से बंद, और इसे सक्षम करने पर दरवाज़ा केवल आपके टेनेंट के लिए खुलता है। पंजीकरण चाहे जो हों, rate-limited रहते हैं और उनके लिए PKCE तथा consent अनिवार्य रहते हैं।
Portal MFA policyअक्षमपोर्टल में साइन इन करने वाली आपकी अपनी टीम के लिए मल्टी-फैक्टर, जो आपके एंड उपयोगकर्ताओं की नीति से अलग सेट होता है। अक्षम, लॉगिन पर प्रस्तावित, या आवश्यक।
Maximum usersकोई नहींडिफ़ॉल्ट रूप से कुल उपयोगकर्ताओं पर कोई सीमा नहीं है, और कोई भी प्लान ऐसी सीमा सेट नहीं करता। जब तक टेनेंट owner का ईमेल पता असत्यापित है, 5 उपयोगकर्ताओं की एक अस्थायी सीमा लागू रहती है; पता सत्यापित होते ही यह हमेशा के लिए हट जाती है।

निष्क्रिय उपयोगकर्ता रिटेंशन

वैकल्पिक रूप से उन खातों को निष्क्रिय करें और फिर हटा दें जिनका उपयोग बंद हो चुका है, ताकि डायरेक्टरी में सुप्त पहचानें हमेशा के लिए जमा न होती रहें। जब तक आप इन्हें सेट नहीं करते, दोनों बंद रहते हैं, और हटाना स्थायी होता है।

सेटिंगडिफ़ॉल्टविवरण
Deactivate after (days of inactivity)कभी नहींउस खाते को निष्क्रिय कर देता है जिसने इतने समय से साइन इन नहीं किया है। रिकॉर्ड बना रहता है और उसे फिर से सक्रिय किया जा सकता है।
Delete after (days of inactivity)कभी नहींखाते को स्थायी रूप से हटा देता है। इसे पूर्ववत करने का कोई तरीका नहीं है, इसलिए इसे चालू करने से पहले नीचे दी गई चेतावनी विंडो और वेबहुक सेट करें।
Warning days7निष्क्रियकरण या विलोपन से कितने दिन पहले चेतावनी वेबहुक फ़ायर होता है, जिससे आपको हस्तक्षेप करने का समय मिल जाता है।
Retention webhook-वे चेतावनियाँ और की गई कार्रवाइयाँ कहाँ पोस्ट की जाती हैं, ताकि आप उस व्यक्ति को सूचित कर सकें या खाता खुला रख सकें।

ऑडिट एक्सपोर्ट और रिमोट बैकअप

अपना डेटा अनुरोध पर नहीं, बल्कि एक निर्धारित समय-सारणी पर बाहर निकालने के दो तरीके। ऑडिट एक्सपोर्ट ऑडिट इवेंट्स के हर पूरे हो चुके दिन को आपके बताए गए URL पर भेजता है, हस्ताक्षरित, ताकि आप पुष्टि कर सकें कि यह हमसे आया है, और इसे किसी SIEM या अनुपालन आर्काइव में डाला जा सके। रिमोट बैकअप आपके दैनिक और साप्ताहिक बैकअप की प्रतियाँ आपके नियंत्रण वाले किसी गंतव्य पर भेजते हैं, बिना किसी प्रमाणीकरण के, basic authentication के साथ, या bearer टोकन के साथ। ऑडिट एक्सपोर्ट ऑडिट लॉग पेज के निर्यात टैब पर और रिमोट बैकअप बैकअप पेज पर कॉन्फ़िगर होते हैं; दोनों आपके पास रहते हैं, हमारे रखे बैकअप से स्वतंत्र।

सैंडबॉक्स एनवायरनमेंट

एनवायरनमेंट पेज सैंडबॉक्स एनवायरनमेंट का प्रबंधन करता है: नामित, पृथक एनवायरनमेंट जिनके अपने उपयोगकर्ता, क्लाइंट, signing keys, MFA नामांकन और grants होते हैं, और हर एक अलग URL पर उपलब्ध होता है। Branding, प्लान और बिलिंग live के साथ साझा होते हैं। लाइव उपयोगकर्ताओं को प्रभावित किए बिना कॉन्फ़िगरेशन परिवर्तन, SSO इंटीग्रेशन और वेबहुक एंडपॉइंट का परीक्षण करने के लिए इनका उपयोग करें। आप डिफ़ॉल्ट रूप से अधिकतम 5 बना सकते हैं, और सक्रिय सैंडबॉक्स उपयोगकर्ता आपके MAU में गिने जाते हैं।

कार्रवाईविवरण
एनवायरनमेंट जोड़ेंएक नया एनवायरनमेंट बनाता है। नाम 1 से 20 lowercase अक्षरों और अंकों का होता है, और "live" आरक्षित है। एनवायरनमेंट खाली शुरू होता है: live से कुछ भी कॉपी नहीं किया जाता।
रिफ़्रेश करेंएनवायरनमेंट का डेटा मिटा देता है और उसे खाली स्थिति में रीसेट कर देता है।
मिटाएंसैंडबॉक्स एनवायरनमेंट और उसके सभी डेटा को स्थायी रूप से हटा देता है।

हर एनवायरनमेंट {name}-{slug}.authagonal.io पर उपलब्ध है।

Environments page listing sandbox environments with their URLs and Refresh and Delete actions

सैंडबॉक्स एनवायरनमेंट नियंत्रण

बिलिंग

पोर्टल के बिलिंग पेज के माध्यम से अपनी सब्सक्रिप्शन और बिलिंग प्रबंधित करें। यह पेज आपको आपके वर्तमान प्लान का अवलोकन देता है और भुगतान विधियों, इनवॉइस और प्लान परिवर्तनों को प्रबंधित करने के लिए Stripe बिलिंग पोर्टल तक पहुँच प्रदान करता है।

सब्सक्रिप्शन जानकारी

बिलिंग पेज आपकी वर्तमान सब्सक्रिप्शन का विवरण एक नज़र में प्रदर्शित करता है। आपको आपकी सब्सक्रिप्शन स्थिति दर्शाने वाला एक स्टेटस बैज दिखाई देगा — active, trialing, past_due, canceled, या unpaid — आपके प्लान नाम, वर्तमान बिलिंग अवधि (आरंभ और समाप्ति तिथियाँ), और क्या आपकी सब्सक्रिप्शन वर्तमान अवधि के अंत में रद्द होने के लिए सेट है, के साथ।

सब्सक्रिप्शन प्रबंधित करें

नई विंडो में Stripe बिलिंग पोर्टल खोलने के लिए Manage Subscription बटन पर क्लिक करें। वहाँ से आप अपनी भुगतान विधियाँ अपडेट कर सकते हैं, इनवॉइस देख और डाउनलोड कर सकते हैं, अपना प्लान बदल सकते हैं, या अपनी सब्सक्रिप्शन रद्द कर सकते हैं।

यदि अभी तक कोई सब्सक्रिप्शन मौजूद नहीं है, तो इसके बजाय एक Setup Billing कॉल-टू-एक्शन दिखाया जाता है, जो आपको प्लान चुनने और भुगतान विवरण दर्ज करने में मार्गदर्शन करता है।

Billing page showing subscription status, plan name, billing period, and Manage Subscription button

बिलिंग पेज आपकी वर्तमान सब्सक्रिप्शन का विवरण प्रदर्शित करता है और Stripe तक पहुँच प्रदान करता है

भुगतान सुरक्षा

सभी बिलिंग Stripe के माध्यम से संभाली जाती है। आपकी भुगतान जानकारी कभी भी Authagonal सर्वर पर संग्रहीत नहीं की जाती।

कस्टम डोमेन

डिफ़ॉल्ट {slug}.authagonal.io के बजाय अपने स्वयं के डोमेन (उदा. auth.yourdomain.com) से अपने प्रमाणीकरण पेज सर्व करें। कस्टम डोमेन आपके उपयोगकर्ताओं को एक सहज, ब्रांडेड प्रमाणीकरण अनुभव देते हैं।

डोमेन जोड़ना

ऐड डोमेन फ़ॉर्म में वह होस्टनेम दर्ज करें जिसका आप उपयोग करना चाहते हैं (उदा. auth.yourdomain.com)। जोड़े जाने के बाद, डोमेन आपकी डोमेन सूची में pending_verification स्थिति के साथ दिखाई देगा।

DNS सत्यापन

पोर्टल द्वारा डोमेन के लिए दिखाए गए दो CNAME रिकॉर्ड बनाएँ, दोनों {slug}.authagonal.io की ओर इंगित करते हुए: एक स्वयं hostname पर, जो ट्रैफ़िक सर्व करता है और proxied हो सकता है, और एक _authagonal-challenge. के बाद hostname पर, जो स्वामित्व सिद्ध करता है और DNS-only (proxied नहीं) होना चाहिए। रिकॉर्ड लागू हो जाने के बाद, सत्यापित करने के लिए DNS जाँचें पर क्लिक करें। लंबित डोमेन की स्वचालित रूप से भी दोबारा जाँच की जाती है।

CNAME records
auth.yourdomain.com.                        CNAME  acme.authagonal.io.
_authagonal-challenge.auth.yourdomain.com.  CNAME  acme.authagonal.io.

DNS प्रसार

DNS प्रसार में 48 घंटे तक लग सकते हैं। यदि सत्यापन विफल होता है, तो प्रतीक्षा करें और पुनः प्रयास करें।

TLS प्रमाणपत्र

एक बार आपका डोमेन सत्यापित हो जाने पर, आपको एक TLS प्रमाणपत्र की आवश्यकता होती है ताकि उपयोगकर्ता HTTPS पर सुरक्षित रूप से कनेक्ट कर सकें। Authagonal दो विकल्पों का समर्थन करता है:

स्वचालित (cert-manager) — Authagonal cert-manager का उपयोग करके TLS प्रमाणपत्र स्वचालित रूप से प्रोविज़न और नवीनीकृत करता है। यह अधिकांश उपयोगकर्ताओं के लिए अनुशंसित विकल्प है। किसी अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है।

अपना खुद का लाएँ (BYO) — PEM फ़ॉर्मेट में अपना स्वयं का प्रमाणपत्र और निजी कुंजी अपलोड करें। यह विकल्प तब उपयोगी है जब आपके संगठन को किसी विशिष्ट सर्टिफ़िकेट अथॉरिटी से प्रमाणपत्र की आवश्यकता हो। प्रमाणपत्र समाप्ति को ट्रैक किया जाता है ताकि आप इसके समाप्त होने से पहले नवीनीकरण कर सकें।

डोमेन स्थिति

प्रत्येक डोमेन अपनी वर्तमान स्थिति दर्शाने वाला एक स्टेटस बैज प्रदर्शित करता है: pending_verification (DNS अभी तक पुष्ट नहीं), verified (DNS पुष्ट, TLS लंबित), या active (पूर्णतः चालू)।

Domain list showing domains with status badges and verification controls

डोमेन सूची प्रत्येक कस्टम डोमेन और उसकी वर्तमान स्थिति प्रदर्शित करती है

BYO certificate upload form with certificate and private key PEM fields

PEM फ़ॉर्मेट में अपना स्वयं का TLS प्रमाणपत्र और निजी कुंजी अपलोड करें

BYO प्रमाणपत्र नवीनीकरण

अपने BYO प्रमाणपत्र को नवीनीकृत रखें। समाप्त हो चुके प्रमाणपत्र आपके उपयोगकर्ताओं के लिए ब्राउज़र सुरक्षा चेतावनियाँ उत्पन्न करेंगे।

संगठन

संगठन टेनेंट के भीतर एक ग्राहक होता है। आइसोलेशन की सीमा टेनेंट ही रहता है: एक टेबल प्रीफ़िक्स और एक साइनिंग की, और टेनेंट का हर होस्ट अपना खुद का issuer। संगठन इसके भीतर आइडेंटिटी को बाँटता है, इसलिए हर ग्राहक के लिए अलग टेनेंट बनाए बिना एक टेनेंट कई ग्राहक संगठनों को सेवा दे सकता है।

संगठन कस्टम डोमेन के साथ काम करते हैं (एक डोमेन किसी एक संगठन से पिन किया जा सकता है) और प्रोविज़निंग ऐप्स के साथ भी (एक प्रोविज़निंग ऐप किसी नए उपयोगकर्ता को किसी संगठन से टैग कर सकता है)। "एक टेनेंट, कई ब्रांडेड ग्राहक" वाले जिस एंड-टू-एंड पैटर्न के लिए यह फ़ीचर बना है, उसके लिए मल्टी-कस्टमर ऐप्स गाइड देखें।

मॉडल और ids

हर संगठन का एक स्थिर, अपरिवर्तनीय id होता है (रूप org_<32 hex>) जो org_id टोकन क्लेम के रूप में जारी होता है, और एक अपरिवर्तनीय, टेनेंट-में-अद्वितीय slug जो org_slug के रूप में जारी होता है और organization authorize पैरामीटर में स्वीकार किया जाता है। Ids और slugs एक ही लुकअप नेमस्पेस साझा करते हैं। किसी दूसरे संगठन के id के बराबर slug को ठीक वैसे ही टकराव मानकर अस्वीकार किया जाता है जैसे सामान्य डुप्लिकेट slug को।

फ़ील्डबदला जा सकता हैविवरण
idनहींorg_id क्लेम। org_ + एक GUID के रूप में बनता है। अंडरस्कोर slug में मान्य नहीं है, इसलिए नया id कभी किसी slug से नहीं टकरा सकता।
slugनहींorg_slug क्लेम, और वह जिसे organization पैरामीटर स्वीकार करता है। अपरिवर्तनीय है क्योंकि relying party इसे हार्ड-कोड करती है।
nameहाँ<code>org_name</code> क्लेम। स्वतंत्र रूप से संपादित किया जा सकता है।
metadataहाँफ़्री-फ़ॉर्म, टेनेंट-नियंत्रित key/value जोड़ियाँ। टोकन पर कभी जारी नहीं होतीं, जब तक कोई स्कोप का क्लेम सेट उनमें से किसी को स्पष्ट रूप से रिलीज़ न करे।
brandingJsonहाँJSON ऑब्जेक्ट जो टेनेंट की ब्रांडिंग पर फ़ील्ड दर फ़ील्ड मर्ज होता है। नीचे Branding override देखें।
domainsकेवल डोमेन एंडपॉइंट्स सेवे ईमेल डोमेन जिन्हें संगठन ने क्लेम किया है, हर एक के साथ वह DNS रिकॉर्ड जो उसे प्रमाणित करता है। केवल नीचे दिए गए डोमेन एंडपॉइंट्स से बदले जाते हैं, अपडेट से कभी नहीं।

सदस्यताएँ

सदस्यता उपयोगकर्ता और संगठन के बीच का many-to-many जोड़ है: हर (संगठन, उपयोगकर्ता) जोड़ी के लिए एक पंक्ति। एक उपयोगकर्ता की कई हो सकती हैं। किसी संगठन के रूप में साइन इन करने को अधिकृत करने वाली चीज़ सदस्यता पंक्ति है, पुराना प्रति-उपयोगकर्ता संगठन टैग नहीं।

स्थितिटोकन देता है?
invitedआमंत्रित, पर अभी स्वीकार नहीं किया। टोकन जारी करने को अधिकृत नहीं करता।
activeअच्छी स्थिति वाला सदस्य। टोकन जारी करने को अधिकृत करने वाली एकमात्र स्थिति।
suspendedरिकॉर्ड हटाए बिना सदस्यता वापस ली गई। टोकन जारी करने को अधिकृत नहीं करता।

सदस्यता की roles टेनेंट के मौजूदा role कैटलॉग से ली जाती हैं और roles क्लेम में जोड़ी जाती हैं। लेकिन केवल तब जब अनुरोध ने संगठन को स्पष्ट रूप से चुना हो (Token org selection देखें) और केवल active सदस्यता पंक्ति से। एक संगठन में रखा गया role कभी किसी दूसरे संगठन के लिए जारी टोकन तक नहीं पहुँचता।

संगठन में आमंत्रित करना

POST /api/v1/users/invite वैकल्पिक organizationId और organizationRoles स्वीकार करता है। एक कॉल invited सदस्यता के साथ अकाउंट बनाती है और संगठन की ब्रांडिंग वाला आमंत्रण ईमेल भेजती है। यदि संगठन का पिन किया हुआ कस्टम डोमेन है, तो लिंक उसी पर खुलता है। व्यक्ति के स्वीकार करने पर सदस्यता active हो जाती है। किसी संगठन को नाम देने के लिए owner या admin होना ज़रूरी है।

संगठन में SCIM प्रोविज़निंग

SCIM टोकन को किसी संगठन से जोड़ा जा सकता है (POST /api/v1/scim/tokens पर organizationId, या टोकन बनाते समय संगठन picker)। Id टेनेंट के किसी संगठन का नाम होना चाहिए। उस टोकन से बना हर उपयोगकर्ता active सदस्य बनता है और संगठन को org_id के रूप में साथ रखता है। यह बाइंडिंग केवल निर्माण के समय लागू होती है, और यह सदस्यता तय करती है, एक्सेस नहीं: एक क्लाइंट पर दो टोकन अब भी एक-दूसरे के उपयोगकर्ता देखते हैं। किसी भी रास्ते से उपयोगकर्ता को हटाने पर उसकी सदस्यताएँ हट जाती हैं।

पॉलिसी फ़्लैग

enabled (डिफ़ॉल्ट चालू): अक्षम संगठन अपने लिए कोई टोकन जारी नहीं करता। यह authorize पर और हर refresh पर जाँचा जाता है, इसलिए किसी को अक्षम करने से केवल नए लॉगिन ही नहीं रुकते, चालू सेशन भी अपने अगले rotation पर रुक जाते हैं।

requireMembershipForTokens (डिफ़ॉल्ट चालू): क्या इस संगठन के लिए टोकन जारी होने हेतु उपयोगकर्ता के पास active सदस्यता होना ज़रूरी है। यह केवल स्पष्ट चयन पर लागू होता है (संगठन को नाम देने वाला अनुरोध, उसे साथ रखने वाला refresh, संगठन-स्कोप्ड कनेक्शन, या ठीक एक तक सीमित क्लाइंट)। अकाउंट के अपने पुराने टैग से केवल विरासत में मिला संगठन इस फ़्लैग से कभी गेट नहीं होता।

allowAutoMembership (डिफ़ॉल्ट बंद) उपयोगकर्ता को बिना आमंत्रण के जुड़ने देता है, जब उसका पुष्ट ईमेल पता संगठन के किसी सत्यापित डोमेन पर हो। यह authorize पर और हर refresh पर लागू होता है। नीचे Email domains and automatic सदस्यता देखें।

ईमेल डोमेन और स्वचालित सदस्यता

संगठन एक ईमेल डोमेन क्लेम करता है और DNS TXT रिकॉर्ड से साबित करता है कि वह उसे नियंत्रित करता है। allowAutoMembership चालू होने पर, जिस उपयोगकर्ता का पुष्ट ईमेल पता उस डोमेन पर है, वह संगठन के रूप में पहली बार साइन इन करते ही सदस्य बन जाता है।

  1. इसे क्लेम करें। डोमेन के साथ POST /api/v1/organizations/{id}/domains। रिस्पॉन्स 201 होता है, जिसमें recordName (_authagonal-org.acme.com) और recordValue (authagonal-org-verify=<token>) होते हैं। टोकन यादृच्छिक है और हर क्लेम के लिए अलग।
  2. रिकॉर्ड प्रकाशित करें। डोमेन के DNS में उसी नाम और ठीक उसी मान वाला TXT रिकॉर्ड जोड़ें।
  3. इसे सत्यापित करें। POST /api/v1/organizations/{id}/domains/{domain}/verify रिकॉर्ड को खोजता है। मिलान होने पर 200 और verified: true लौटता है। न मिलने पर 409 verification_failed लौटता है, कभी verified: false के साथ 200 नहीं, ताकि सफलता के लिए पोल करने वाला क्लाइंट चूक को सफलता न समझ ले।
  4. इसे हटाएँ। DELETE /api/v1/organizations/{id}/domains/{domain} 204 लौटाता है। मौजूदा सदस्यताएँ बनी रहती हैं, केवल आगे के auto-join रुकते हैं।
POST /api/v1/organizations/{id}/domains
POST /api/v1/organizations/org_7fa2c9e1.../domains
Content-Type: application/json

{ "domain": "acme.com" }

201 Created
{
  "domain": "acme.com",
  "verified": false,
  "verifiedAt": null,
  "createdAt": "2026-10-03T01:02:03Z",
  "recordName": "_authagonal-org.acme.com",
  "recordValue": "authagonal-org-verify=Qm9...base64url"
}

अस्वीकृतियाँ: 400 domain_invalid (केवल DNS नाम नहीं), 409 domain_exists (इस संगठन पर पहले से है), 409 domain_taken (टेनेंट के किसी दूसरे संगठन के पास है), 404 organization_not_found और 404 domain_not_found। एक डोमेन प्रति टेनेंट अधिकतम एक संगठन का होता है, और यह verify के समय फिर से जाँचा जाता है।

Auto-सदस्यता नियम

Selector ऐसे उपयोगकर्ता को प्रवेश देता है जिसकी कोई active सदस्यता नहीं है, जब इनमें से सभी शर्तें पूरी हों:

  • संगठन स्पष्ट रूप से चुना गया हो: साथ लाया गया refresh grant, संगठन-स्कोप्ड कनेक्शन, organization पैरामीटर (डोमेन पिन इसे उपलब्ध कराता है), या ठीक एक संगठन तक सीमित क्लाइंट। अकाउंट का अपना पुराना टैग कभी auto-join नहीं करता।
  • संगठन enabled हो और allowAutoMembership चालू हो।
  • उपयोगकर्ता का ईमेल पुष्ट हो, क्योंकि कोई भी [email protected] के रूप में रजिस्टर कर सकता है।
  • ईमेल में अंतिम @ के बाद का हिस्सा, lowercase करके, संगठन के किसी सत्यापित डोमेन के ठीक बराबर हो। सबडोमेन मैचिंग नहीं होती: सत्यापित acme.com [email protected] को प्रवेश नहीं देता। हर सबडोमेन को अलग से क्लेम और सत्यापित करें।

सदस्यता गेट चलने से पहले यह क्या लिखता है: पंक्ति न हो तो बिना roles की नई active सदस्यता बनती है; invited पंक्ति roles बनाए रखते हुए active हो जाती है; active पंक्ति को छुआ नहीं जाता; suspended पंक्ति कभी promote नहीं होती।

सदस्य को हटाने से वह बाहर नहीं रहता

जब तक allowAutoMembership चालू है, हटाया गया सदस्य जो अब भी योग्य है, अपने अगले authorize या refresh पर फिर जुड़ जाता है। योग्य उपयोगकर्ता को बाहर रखने के लिए उसकी सदस्यता को suspended करें, यही एकमात्र स्थिति है जिसे यह नियम कभी नहीं बदलता।

Token org selection

अनुरोध किस संगठन पर resolve होता है, यह ठीक एक जगह तय होता है, इसलिए उत्तर /connect/authorize पर, हर refresh पर और device grant पर एक जैसा रहता है। प्राथमिकता, सबसे ऊपर वाली पहले:

#स्रोतव्यवहार
1साथ लाया गया grant (refresh)वह संगठन जिसके लिए पिछला टोकन जारी हुआ था। यदि वह अब मौजूद नहीं है, तो refresh को ही अस्वीकार कर दिया जाता है, किसी और चीज़ पर फ़ॉलबैक नहीं होता।
2संगठन-स्कोप्ड कनेक्शनसेशन ने ऐसे SAML या OIDC कनेक्शन से साइन इन किया जो एक संगठन का है, इसलिए वही संगठन चुना जाता है। यही एकमात्र स्रोत है जो दावा नहीं, प्रमाणित है। किसी दूसरे संगठन को नाम देने वाला अनुरोध अस्वीकार होता है, और वह कनेक्शन भी जिसका संगठन अब मौजूद नहीं है।
3organizationपहले slug से resolve होता है, फिर id से। डोमेन पिन इसी शाखा तक पहुँचता है: अनुरोध का मूल्यांकन होने से पहले middleware उसे जोड़ देता है। नाम दिया गया और नहीं मिला, तो सीधा अस्वीकार, कभी चुपचाप फ़ॉलबैक नहीं।
4ठीक एक org तक सीमित क्लाइंटअपने आप चुना जाता है: प्रति-ग्राहक एप्लिकेशन अपना एक संगठन एक बार रजिस्टर करता है और कभी कोई पैरामीटर नहीं भेजता। <em>एक से अधिक</em> तक सीमित और बिना किसी संकेत के आए अनुरोध को <code>account_selection_required</code> के साथ अस्वीकार किया जाता है।
5अकाउंट का अपना पुराना संगठन टैगएक सपाट स्ट्रिंग, जो एक ही लुकअप में id से resolve होती है, उपयोगकर्ता की सदस्यताओं को स्कैन करके नहीं। यदि वह किसी असली संगठन पंक्ति का नाम नहीं है, तो उसे बिना किसी गेटिंग के ज्यों का त्यों जारी किया जाता है, ठीक वैसे ही जैसे संगठनों के अस्तित्व में आने से पहले होता था। यह कभी स्पष्ट चयन नहीं होता, इसलिए कभी auto-join नहीं करता।
6ऊपर में से कोई नहींटोकन पर कोई संगठन नहीं: कोई <code>org_id</code>, <code>org_slug</code> या <code>org_name</code> क्लेम नहीं।

सदस्यताएँ कभी संकेत नहीं होतीं

कई active सदस्यताओं वाला उपयोगकर्ता, जब अनुरोध किसी को नाम न दे, ठीक वैसे ही व्यवहार करता है जैसे शून्य सदस्यताओं वाला उपयोगकर्ता: डिफ़ॉल्ट चुनने के लिए सदस्यता टेबल कभी नहीं देखी जाती। चयन सीधे अकाउंट के अपने पुराने टैग (पंक्ति 5) पर जाता है, और वह भी खाली हो तो टोकन पर कोई संगठन नहीं होता। सदस्यताएँ तभी मायने रखना शुरू करती हैं जब संगठन को स्पष्ट रूप से नाम दिया जा चुका हो, यानी जब requireMembershipForTokens जाँचा जाता है और, लागू हो तो, auto-join आज़माया जाता है।

डोमेन पिनिंग

कस्टम डोमेन को एक संगठन से पिन किया जा सकता है, जिससे वह डोमेन संगठन का अपना प्रवेश द्वार बन जाता है। पिन को tenant-resolution middleware GET /connect/authorize (क्वेरी स्ट्रिंग में जोड़कर) और POST /connect/par (इसमें भेजी गई body को बदला जाता है, क्योंकि PAR अपने पैरामीटर संग्रहीत payload से पढ़ता है) दोनों के लिए लागू करता है। पूरी प्रक्रिया के लिए कस्टम डोमेन देखें।

PUT /api/v1/custom-domains/{domain}/organization
PUT /api/v1/custom-domains/auth.acme.com/organization
Content-Type: application/json

{ "organizationId": "org_7fa2c9e1..." }

पिन किया हुआ डोमेन टकराने वाले अनुरोध को अस्वीकार करता है

पिन से अलग संगठन को नाम देने वाला अनुरोध किसी भी लॉगिन पेज के दिखने से पहले सीधे 400 access_denied के साथ अस्वीकार कर दिया जाता है। इसके बिना, relying party अपना organization पैरामीटर भेज सकती थी और पिन केवल दिखावटी रह जाता।

संगठन-स्कोप्ड कनेक्शन

SAML या OIDC कनेक्शन किसी एक संगठन का हो सकता है। उससे साइन इन करने पर वह संगठन चुना जाता है और, यदि उपयोगकर्ता की कोई सदस्यता नहीं है, तो active सदस्यता बनती है। invited पंक्ति स्वीकार हो जाती है: वह active बन जाती है और अपने roles तथा आमंत्रणकर्ता बनाए रखती है, इसलिए जो आमंत्रित व्यक्ति अपने IdP से साइन इन करता है उसे ईमेल की कभी ज़रूरत नहीं पड़ती। suspended सदस्य suspended ही रहता है और टोकन जारी करते समय अस्वीकार किया जाता है। यह allowAutoMembership या डोमेन पर निर्भर नहीं करता, क्योंकि संगठन पहले ही कनेक्शन द्वारा चुना जा चुका है।

लॉगिन पेज पर संगठन का नाम

लॉगिन पेज ऐप के नाम के नीचे Signing in to {name} दिखाता है। नाम उसी संगठन से आता है जिससे पेज की ब्रांडिंग आती है: पहले पिन किए गए डोमेन का संगठन, फिर authorize अनुरोध में नामित संगठन, फिर क्लाइंट का एकमात्र सीमित संगठन। जब कोई संगठन न हो, या संगठन का नाम ऐप के नाम के बराबर हो, तब यह छिपा रहता है, ताकि हेडर कभी "Acme / Signing in to Acme" न पढ़े।

Branding override

संगठन का brandingJson लॉगिन पेज के लिए टेनेंट की ब्रांडिंग पर फ़ील्ड दर फ़ील्ड मर्ज होता है: मौजूद और non-null key ओवरराइड करती है, अनुपस्थित या null key विरासत में लेती है, और अज्ञात key को अनदेखा किया जाता है। ख़राब JSON टेनेंट की अपनी ब्रांडिंग पर लौट आता है और एक चेतावनी लॉग होती है, पेज लोड कभी विफल नहीं होता।

Branding टैब सभी 21 मर्ज-योग्य फ़ील्ड संपादित करता है: रूप-रंग (appName, logoUrl, primaryColor, customCssUrl), लाइट और डार्क मोड के रंग, ईमेल के रंग, supportEmail, showForgotPassword, poweredBy और languages। हर फ़ील्ड या तो टेनेंट का मान विरासत में लेता है, जो संकेत के रूप में दिखता है, या उसे ओवरराइड करता है, और Clear कंट्रोल उस key को हटा देता है।

showRegistration को ओवरराइड नहीं किया जा सकता

टेनेंट की सार्वजनिक साइन-अप सेटिंग पहले ही तय कर चुकी है कि रजिस्ट्रेशन दिया जाए या नहीं, और रजिस्ट्रेशन एंडपॉइंट ब्रांडिंग से परे इसे लागू करता है। संगठन इस निर्णय का अधिकारी नहीं है, इसलिए यह एक फ़ील्ड मर्ज से बाहर है और Branding टैब पर इसका कोई कंट्रोल नहीं है।

पुराने संगठन टैग से Backfill

संगठनों के अस्तित्व में आने से पहले, उपयोगकर्ता के पास बिना किसी रिकॉर्ड वाला फ़्री-टेक्स्ट संगठन टैग हो सकता था। POST /api/v1/organizations/backfill उसे असली संगठनों और सदस्यताओं में माइग्रेट करता है, हर अलग पुराने मान के अनुसार समूहित करके। जब तक body { "dryRun": false } न हो, यह केवल dry run होता है।

  • सीमित: प्रति कॉल अधिकतम 50,000 उपयोगकर्ता स्कैन करता है। truncated रिस्पॉन्स का मतलब है इसे फिर चलाएँ। दोबारा चलाने पर पहले से माइग्रेट हो चुके उपयोगकर्ता छोड़ दिए जाते हैं।
  • Idempotent: पहले से माइग्रेट हुआ कोई अलग पुराना मान आंतरिक stamp से मिलाया जाता है, संगठन के (संपादन-योग्य) प्रदर्शन नाम से नहीं, इसलिए बाद में बने संगठन का नाम बदलने से अगले रन में डुप्लिकेट नहीं बनता।
उदाहरण रिस्पॉन्स (dry run)
{
  "dryRun": true,
  "organizationsCreated": 3,
  "membershipsCreated": 41,
  "usersSkipped": 0,
  "organizations": [
    { "legacyValue": "acme-corp", "slug": "acme-corp", "users": 22 }
  ],
  "truncated": false
}

पोर्टल UI वॉकथ्रू

संगठन पेज टेनेंट के हर संगठन को सूचीबद्ध करता है, एक बार में 50, और लोड करें बटन के साथ, और नया संगठन (केवल slug + नाम, पॉलिसी फ़्लैग, डोमेन और ब्रांडिंग बाद में सेट होते हैं) तथा विरासत संगठन फ़ील्ड से भरें फ़्लो देता है, जो ऊपर का backfill पहले preview के रूप में चलाता है, फिर लागू करें।

Organizations list showing slug, name, and created-date columns, with New Organisation and Backfill from legacy organisation field controls

संगठन सूची टेनेंट के हर ग्राहक संगठन को उसके slug, नाम और निर्माण तिथि के साथ दिखाती है

हर संगठन के विवरण पेज पर तीन टैब हैं: सामान्य (नाम, केवल-पढ़ने योग्य slug, तीन पॉलिसी टॉगल, ईमेल डोमेन जोड़ने, सत्यापित करने, हटाने और TXT रिकॉर्ड कॉपी करने के लिए ईमेल डोमेन कार्ड, और slug टाइप करके पुष्टि वाला डिलीट), Branding (हर ओवरराइड-योग्य फ़ील्ड, जो टेनेंट का मान विरासत में लेता है या उसे ओवरराइड करता है), और सदस्य (ईमेल से जोड़ें, खाता न होने पर आमंत्रण का विकल्प मिलता है, प्रति पंक्ति स्थिति बदलें और हटाएँ, और लोड करें के साथ)।

Organization detail page's Members tab showing invited, active, and suspended member rows with per-row status control

Members टैब हर सदस्यता को उसकी स्थिति और बदलने या हटाने के प्रति-पंक्ति कंट्रोल के साथ दिखाता है

Organization detail page's Branding tab with each overridable field showing either the tenant's inherited value or an override with a Clear control

Branding टैब इस संगठन के लिए टेनेंट की लॉगिन-पेज ब्रांडिंग को फ़ील्ड दर फ़ील्ड ओवरराइड करता है

Domains पेज में डोमेन → संगठन selector है: हर डोमेन कार्ड में इनलाइन ड्रॉपडाउन है जो टेनेंट के संगठनों को सूचीबद्ध करता है, साथ में "टेनेंट (कोई नहीं)" विकल्प जो पिन हटा देता है, और बदलते ही तुरंत लागू हो जाता है। डोमेन जोड़ते समय भी यही selector दिखाई देता है।

Domain card showing the inline organisation selector that pins a custom domain to one organisation

डोमेन कार्ड पर इनलाइन संगठन selector उस कस्टम डोमेन को एक संगठन से पिन करता है

ऑडिट इवेंट

organization.created · organization.updated · organization.deleted · organization.member.added · organization.member.invited · organization.member.joined · organization.member.updated · organization.member.removed · organization.domain_added · organization.domain_verified · organization.domain_removed · organization.backfill · domain.organization_set

पेजिंग

संगठन सूची और सदस्य सूची cursor-पेज्ड हैं और { items, nextCursor } लौटाती हैं। limit दें (डिफ़ॉल्ट 50, 1 से 200 तक सीमित) और पहले पेज के बाद पिछले रिस्पॉन्स का nextCursor बिना बदले cursor के रूप में दें। Null nextCursor आख़िरी पेज है। Cursor संगठन id (या सदस्यों के लिए user id) पर एक अपारदर्शी keyset स्थिति है, इसलिए कॉल के बीच पंक्तियाँ जोड़ने या हटाने से कोई पेज खिसकता या दोहराया नहीं जाता। जो cursor सूची ने जारी नहीं किया, वह 400 invalid_cursor है।

AI असिस्टेंट से संगठन प्रबंधित करना

होस्टेड पोर्टल MCP तेरह संगठन टूल देता है, सभी के लिए टेनेंट admin भूमिका ज़रूरी है: संगठनों की सूची, get, create, update और delete; सदस्यों की सूची, जोड़ना, अपडेट और हटाना; ईमेल डोमेन जोड़ना, सत्यापित करना और हटाना; और किसी उपयोगकर्ता के संगठनों की सूची। ये ऊपर के API जैसे ही ऑपरेशन कॉल करते हैं, इसलिए कोई टूल अपने route से अलग नहीं हो सकता। अपना पोर्टल AI असिस्टेंट से चलाएँ देखें।

प्रति होस्ट एक issuer

टेनेंट का हर होस्ट अपना खुद का OIDC issuer है। जब अनुरोध का होस्ट टेनेंट की डोमेन टेबल से resolve हुआ हो, तब issuer और discovery द्वारा विज्ञापित हर एंडपॉइंट URL https://{host} होता है, इसलिए हर active कस्टम डोमेन अपना iss घोषित करता है और टेनेंट का canonical होस्ट अपरिवर्तित रहता है। साइनिंग keys प्रति टेनेंट होती हैं, इसलिए हर होस्ट वही key सेट परोसता है। इसी से एक टेनेंट कई ग्राहकों को सँभाल पाता है, हर एक अपने ब्रांडेड डोमेन पर, जो अपने संगठन से पिन है। कस्टम डोमेन देखें।

ईमेल कॉन्फ़िगरेशन

कॉन्फ़िगर करें कि आपका टेनेंट ट्रांज़ैक्शनल ईमेल कैसे भेजता है, जैसे सत्यापन, पासवर्ड रीसेट, और आमंत्रण ईमेल। डिफ़ॉल्ट साझा प्रेषक, Resend के माध्यम से सत्यापित कस्टम डोमेन, या अपने स्वयं के SMTP सर्वर में से चुनें।

Email settings showing provider options (default, Resend domain, custom SMTP) and a test-send

स्थानीयकृत ईमेल

ट्रांज़ैक्शनल ईमेल प्राप्तकर्ता की पसंदीदा भाषा में भेजे जाते हैं। सत्यापन, पासवर्ड-रीसेट, account-exists, स्वागत, आमंत्रण, खाता हटाना, सहायता, और बिलिंग ईमेल ग्यारह लोकेल में टेम्पलेट किए गए हैं: अंग्रेज़ी, जर्मन, फ़्रेंच, स्पेनिश, पुर्तगाली, वियतनामी, सरलीकृत चीनी, जापानी, अरबी, हिंदी, और अफ़्रीकान्स। जब प्राप्तकर्ता की भाषा के लिए कोई टेम्पलेट मौजूद नहीं होता, तो ईमेल अंग्रेज़ी पर फ़ॉलबैक करता है।

भाषा भेजने के समय प्राप्तकर्ता की संग्रहीत प्राथमिकता से तय की जाती है। वह प्राथमिकता कई स्थानों से आ सकती है:

  • साइन-अप और पंजीकरण — होस्टेड साइन-इन स्क्रीन पर उपयोगकर्ता द्वारा चुनी गई भाषा से कैप्चर किया गया।
  • पोर्टल Users पेज — उपयोगकर्ता बनाते या संपादित करते समय एडमिन द्वारा सेट किया गया।
  • SCIM प्रोविज़निंग: जब उपयोगकर्ता SCIM के माध्यम से सिंक किए जाते हैं तो IdP के preferredLanguage (या locale) से मैप किया गया।
  • स्व-सेवा खाता पेज — उपयोगकर्ता द्वारा स्वयं /login/account पर चुना गया।

किसी कॉन्फ़िगरेशन की आवश्यकता नहीं

स्थानीयकरण स्वचालित है और प्रत्येक प्रोवाइडर मोड (डिफ़ॉल्ट, Resend कस्टम डोमेन, और SMTP) पर लागू होता है। सक्षम करने के लिए कुछ नहीं है।

ईमेल प्रोवाइडर

प्रोवाइडरविवरणसेटअप
Authagonal (Default)हमारे साझा Resend इन्फ्रास्ट्रक्चर का उपयोग करके [email protected] से भेजे गए ईमेल।किसी कॉन्फ़िगरेशन की आवश्यकता नहीं — सीधे काम करता है।
Custom Domain (Resend)Resend के माध्यम से आपके स्वयं के सत्यापित डोमेन से भेजे गए ईमेल।अपना डोमेन पंजीकृत करें, DNS रिकॉर्ड जोड़ें, स्वामित्व सत्यापित करें।
Custom SMTPआपके स्वयं के SMTP सर्वर के माध्यम से भेजे गए ईमेल।SMTP होस्ट, पोर्ट, क्रेडेंशियल और TLS सेटिंग्स दें।

प्रेषक पहचान

प्रेषक ईमेल और नाम सभी प्रोवाइडर मोड में साझा होते हैं। कस्टम डोमेन (Resend) और कस्टम SMTP प्रोवाइडर के लिए प्रेषक ईमेल आवश्यक है; खाली होने पर प्रेषक नाम branding app नाम पर फ़ॉलबैक करता है।

फ़ील्डविवरण
emailSenderEmailआउटबाउंड ईमेल पर From पता। कस्टम डोमेन (Resend) मोड के लिए एक सत्यापित डोमेन पर होना चाहिए।
emailSenderNameप्राप्तकर्ता के इनबॉक्स में दिखाया जाने वाला प्रदर्शन नाम।

Resend Custom Domain

अपने सेंडिंग डोमेन को Resend के साथ एक बार सत्यापित करें, फिर इसे इस टेनेंट के लिए From पते के रूप में उपयोग करें। DNS रिकॉर्ड (SPF, DKIM) सेटिंग्स → ईमेल पर कस्टम भेजने वाला डोमेन पैनल में दिखाए जाते हैं; जब आप <strong>सत्यापन जाँचें</strong> पर क्लिक करते हैं तो Resend उनकी जाँच करता है।

कस्टम SMTP

अपना स्वयं का SMTP सर्वर लाएँ — आंतरिक रिले, Resend द्वारा कवर न किए गए विक्रेताओं, या नियामक पिनिंग के लिए उपयोगी।

फ़ील्डविवरण
smtpHostSMTP सर्वर होस्टनेम (उदा. smtp.example.com)।
smtpPortकनेक्शन पोर्ट, डिफ़ॉल्ट 587। TLS को STARTTLS के साथ negotiate किया जाता है; पोर्ट 465 पर implicit TLS समर्थित नहीं है। अप्रमाणित आंतरिक रिले के लिए 25 का उपयोग करें।
smtpUsernameAuth उपयोगकर्ता नाम (वैकल्पिक — अप्रमाणित रिले के लिए खाली छोड़ें)।
smtpPasswordAuth पासवर्ड। टेनेंट सेटिंग्स सीक्रेट में एन्क्रिप्टेड संग्रहीत।
smtpUseTlsTLS आवश्यक करें। चालू रहने दें, जब तक कि आप किसी विश्वसनीय आंतरिक रिले को लक्षित न कर रहे हों।

कस्टम सेंडिंग डोमेन

कस्टम डोमेन (Resend) प्रोवाइडर का उपयोग करते समय, आप अपना स्वयं का डोमेन पंजीकृत कर सकते हैं ताकि ईमेल @authagonal.io के बजाय आपके ब्रांड से आएँ (उदा. [email protected])।

  1. सेटिंग्स → ईमेल पर जाएँ और कस्टम डोमेन (Resend) प्रोवाइडर चुनें।
  2. अपना डोमेन नाम दर्ज करें और डोमेन पंजीकृत करें पर क्लिक करें।
  3. दिखाए गए DNS रिकॉर्ड (DKIM, SPF, और return path) को अपने डोमेन के DNS में जोड़ें।
  4. Check Verification पर क्लिक करें — एक बार DNS प्रसारित हो जाने पर (आमतौर पर 1–10 मिनट), डोमेन स्थिति verified में बदल जाएगी।

DNS प्रसार

DNS परिवर्तन वैश्विक रूप से प्रसारित होने में 48 घंटे तक लग सकते हैं, हालाँकि अधिकांश प्रोवाइडर कुछ मिनटों में अपडेट हो जाते हैं। आप जितनी बार आवश्यक हो सत्यापन जाँच सकते हैं।

परीक्षण

अपना कॉन्फ़िगरेशन सत्यापित करने के लिए Settings → Email में Send Test Email बटन का उपयोग करें। वर्तमान में सहेजी गई सेटिंग्स का उपयोग करके आपके एडमिन ईमेल पते पर एक परीक्षण ईमेल भेजा जाएगा।

ऑडिट लॉग

ऑडिट लॉग आपके टेनेंट पर की गई सभी प्रशासनिक कार्रवाइयों का केवल-पढ़ने योग्य रिकॉर्ड प्रदान करता है। पोर्टल या API के माध्यम से किया गया प्रत्येक परिवर्तन पूर्ण संदर्भ के साथ कैप्चर किया जाता है, जो आपको अनुपालन और समस्या निवारण के लिए एक पूर्ण ट्रेल देता है।

लॉग कॉलम

कॉलमविवरण
टाइमस्टैम्पवह तिथि और समय जब कार्रवाई हुई
एक्टरउस एडमिन का ईमेल पता जिसने कार्रवाई की, या स्वचालित कार्रवाइयों के लिए "system"
कार्रवाईकी गई कार्रवाई का प्रकार (उदा. Client Created, Settings Updated)
एंटिटीtype:id फ़ॉर्मेट में कार्रवाई का लक्ष्य (उदा. client:my-app)
विवरणपरिवर्तन के बारे में अतिरिक्त संदर्भ

ट्रैक की गई कार्रवाइयाँ

निम्नलिखित प्रशासनिक कार्रवाइयाँ ऑडिट लॉग में दर्ज की जाती हैं:

श्रेणीकार्रवाइयाँ
क्लाइंटक्लाइंट बनाया गया, क्लाइंट अपडेट किया गया, क्लाइंट हटाया गया
SSO कनेक्शनSAML कनेक्शन बनाया गया, SAML कनेक्शन हटाया गया, OIDC कनेक्शन बनाया गया, OIDC कनेक्शन हटाया गया
उपयोगकर्ताउपयोगकर्ता बनाया गया, उपयोगकर्ता अपडेट किया गया
सेटिंग्ससेटिंग्स अपडेट की गईं, ब्रांडिंग अपडेट की गई
डोमेनडोमेन जोड़ा गया, डोमेन सत्यापित किया गया, डोमेन हटाया गया
SCIMSCIM टोकन बनाया गया, SCIM टोकन रद्द किया गया
भूमिकाएँभूमिका बनाई गई, भूमिका अपडेट की गई, भूमिका हटाई गई
समूहग्रुप बनाया गया, ग्रुप हटाया गया
टीमटीम सदस्य आमंत्रित किया गया, टीम सदस्य हटाया गया
Audit log table showing timestamped administrative actions with actor, action, entity, and detail columns

ऑडिट लॉग सभी प्रशासनिक कार्रवाइयों का पूर्ण रिकॉर्ड प्रदान करता है

रिटेंशन

ऑडिट लॉग 365 दिनों तक रखे जाते हैं और इन्हें संशोधित या हटाया नहीं जा सकता। इन्हें अधिक समय तक रखने के लिए, ऑडिट लॉग पेज के निर्यात टैब से स्वचालित निर्यात चालू करें।

बैकअप

Authagonal स्वचालित रूप से आपके टेनेंट डेटा का प्रति घंटा शेड्यूल पर बैकअप लेता है। बैकअप में सभी उपयोगकर्ता, समूह, भूमिकाएँ, क्लाइंट, SSO कनेक्शन, SCIM टोकन, ब्रांडिंग, और सेटिंग्स शामिल होते हैं। आप बैकअप इतिहास देख सकते हैं और Backups पेज से नवीनतम पूर्ण बैकअप डाउनलोड कर सकते हैं।

Backups page showing backup history with timestamps, types, and entity counts

बैकअप कैसे काम करते हैं

  • दिन में एक बार प्रति घंटे के incremental बैकअप को मिलाकर एक नया पूर्ण बैकअप बनाया जाता है, और रविवार को दैनिक पूर्ण बैकअप को मिलाकर एक साप्ताहिक बैकअप बनाया जाता है। सात दैनिक और चार साप्ताहिक बैकअप रखे जाते हैं।
  • इंक्रीमेंटल बैकअप प्रति घंटा चलते हैं, जो केवल पिछले बैकअप के बाद से बदली गई पंक्तियों को कैप्चर करते हैं।
  • बैकअप आपके टेनेंट द्वारा उपयोग की जाने वाली समान मैनेज्ड आइडेंटिटी के साथ Azure Blob Storage में संग्रहीत होते हैं।
  • हटाए गए रिकॉर्ड tombstones के माध्यम से ट्रैक किए जाते हैं और ऑडिट पूर्णता के लिए बैकअप में शामिल किए जाते हैं।

बैकअप डाउनलोड करना

सबसे हाल के पूर्ण बैकअप को सभी बाद के इंक्रीमेंटल बैकअप के साथ मर्ज करके एक ZIP फ़ाइल प्राप्त करने के लिए Download Latest पर क्लिक करें। प्रत्येक टेबल को एक JSONL फ़ाइल के रूप में निर्यात किया जाता है (प्रति पंक्ति एक JSON ऑब्जेक्ट)।

बैकअप फ़ॉर्मेट

बैकअप JSONL (JSON Lines) के रूप में निर्यात किए जाते हैं — प्रति टेबल प्रति पंक्ति एक एंटिटी। इस फ़ॉर्मेट को पार्स करना, डिफ़ करना, और अन्य सिस्टम में इम्पोर्ट करना आसान है।

प्रोविज़निंग ऐप्स

प्रोविज़निंग ऐप्स आपकी अपनी सेवाएँ हैं, जिन्हें Authagonal हर बार किसी उपयोगकर्ता के बनने पर कॉल करता है, ताकि वे खाता तैयार कर सकें, लाइसेंस दे सकें, तय कर सकें कि उपयोगकर्ता किस संगठन का है, या साइनअप को सीधे अस्वीकार कर सकें।

यह कैसे काम करता है

जब कोई उपयोगकर्ता बनाया जाता है, तो Authagonal आपके प्रोविज़निंग ऐप के कॉलबैक URL को TCC (Try/Confirm/Cancel) पैटर्न से कॉल करता है। किसी भी ऐप को कमिट करने से पहले हर ऐप को Try चरण में स्वीकृति देनी होती है, ताकि कई डाउनस्ट्रीम सिस्टम सहमत हो सकें, या कोई एक वीटो कर सके, और आधे बने खाते पीछे न छूटें।

फेज़एंडपॉइंटउद्देश्य
/tryPOST {callbackUrl}/tryजाँचता है कि क्या ऐप उपयोगकर्ता को संभाल सकता है। स्वीकार करने के लिए 200 या अस्वीकार करने के लिए 4xx लौटाएँ।
/confirmPOST {callbackUrl}/confirmसभी ऐप्स द्वारा /try फेज़ स्वीकार करने के बाद ऑपरेशन को कमिट करता है।
/cancelPOST {callbackUrl}/cancelयदि /try फेज़ के दौरान कोई अन्य ऐप विफल होता है तो ऑपरेशन को रोलबैक करता है।

प्रोविज़निंग कब चलती है

प्रोविज़निंग हर उस पथ पर चलती है जो उपयोगकर्ता बनाता है, केवल सेल्फ-सर्विस साइनअप पर नहीं। जिन ऐप और उपयोगकर्ता संयोजनों की प्रोविज़निंग पहले हो चुकी है, उन्हें छोड़ दिया जाता है, इसलिए ऐप हर उपयोगकर्ता को एक ही बार देखता है।

निर्माण पथयह कब चलता है
POST /api/auth/registerसेल्फ-सर्विस पंजीकरण
SAML ACS कॉलबैकनए उपयोगकर्ता का पहला SSO लॉगिन (JIT)
OIDC कॉलबैकनए उपयोगकर्ता का पहला SSO लॉगिन (JIT)
POST /scim/v2/Usersकोई कनेक्टर ग्राहक की डायरेक्टरी से उपयोगकर्ता प्रोविज़न करता है
पोर्टल और एडमिन से उपयोगकर्ता बनानाकोई ऑपरेटर हाथ से उपयोगकर्ता बनाता है या आमंत्रित करता है

Try अनुरोध

Authagonal यह JSON <code>{callbackUrl}/try</code> पर POST करता है। जिन फ़ील्ड्स का कोई मान नहीं होता, उन्हें null के रूप में भेजने के बजाय छोड़ दिया जाता है।

फ़ील्डप्रकारविवरण
transactionIdstringयह इस प्रोविज़निंग ट्रांज़ैक्शन की पहचान करता है। यही मान /confirm और /cancel को भी भेजा जाता है, इसलिए अपना काम इसी के सापेक्ष तैयार रखें और वह कॉल आने पर उसे कमिट करें या रद्द कर दें।
userIdstringउपयोगकर्ता की Authagonal आईडी। यही वह subject है जो आपको उनके टोकन में दिखेगा।
emailstringउपयोगकर्ता का ईमेल पता।
firstNamestringपहला नाम, जब निर्माण पथ ने यह दिया हो।
lastNamestringकुलनाम, जब निर्माण पथ ने यह दिया हो।
organizationIdstringवह संगठन जिसमें उपयोगकर्ता पहले से है, यदि कोई हो। यह तभी मौजूद होता है जब पहले किसी ने संगठन सौंपा हो; पहली बार साइनअप पर यह अनुपस्थित रहता है, और यही आपके लिए संकेत है कि आप इसे सौंपें।
customAttributesobjectउपयोगकर्ता के संग्रहीत कस्टम एट्रिब्यूट। SSO से बने उपयोगकर्ता के लिए इनमें federated_connection शामिल होता है, यानी उस कनेक्शन का नाम जिसने उनकी ज़मानत ली।

SSO से आने वाला उपयोगकर्ता वह सामान्य स्थिति है जिसकी योजना बनानी चाहिए: उनके पास अभी कोई संगठन नहीं होता, और federated_connection बताता है कि वे आपके किस ग्राहक से आए हैं।

SSO कनेक्शन से आने वाले उपयोगकर्ता के लिए Try अनुरोध
{
  "transactionId": "8f14e45fceea167a5a36dedd4bea2543",
  "userId": "0f6b1c8e-3d2a-4f51-9e77-2c1a4b5d6e7f",
  "email": "[email protected]",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "customAttributes": {
    "federated_connection": "acme-okta"
  }
}

Try प्रतिक्रिया

आपका ऐप 200 और एक JSON बॉडी के साथ उत्तर देता है। यह बॉडी केवल पावती नहीं है: यही वह तरीका है जिससे कोई डाउनस्ट्रीम ऐप वह संगठन और एट्रिब्यूट सौंपता है जो अंततः उपयोगकर्ता के टोकन पर आते हैं।

फ़ील्डप्रकारविवरण
approvedbooleanक्या यह ऐप उपयोगकर्ता को स्वीकार करता है। छोड़ने पर डिफ़ॉल्ट true है। false साइनअप को अस्वीकार कर देता है और नया खाता हटा दिया जाता है।
reasonstringउपयोगकर्ता को क्यों अस्वीकार किया गया। यह निर्माण पथ के कॉलर को दिखाया जाता है।
organizationIdstringवह संगठन जिससे यह उपयोगकर्ता संबंधित है। इसे उपयोगकर्ता पर संग्रहीत किया जाता है और उनके टोकन पर org_id क्लेम के रूप में जारी किया जाता है। यह केवल तभी लागू होता है जब उपयोगकर्ता के पास पहले से कोई संगठन न हो, इसलिए सबसे पहले उत्तर देने वाला ऐप जीतता है और बाद के ऐप वही असाइनमेंट देखते हैं।
customAttributesobjectउपयोगकर्ता पर एक-एक की करके मर्ज किए जाने वाले एट्रिब्यूट। ये किसी scope के UserClaims कॉन्फ़िगरेशन के ज़रिए टोकन पर जारी होते हैं।
emailVerifiedbooleanआपका ऐप गारंटी देता है कि उसने इस पते की पुष्टि की है, उदाहरण के लिए इस पर भेजे गए आमंत्रण को भुनाकर। Authagonal खाते को पुष्ट चिह्नित कर देता है और अपना सत्यापन ईमेल नहीं भेजता।
संगठन सौंपने वाली Try प्रतिक्रिया
{
  "approved": true,
  "organizationId": "org_acme",
  "customAttributes": { "org_role": "member" }
}

org_id यहीं से आता है

खाते का संगठन टैग, और इसलिए जब कोई अनुरोध किसी संगठन का नाम नहीं देता तब org_id क्लेम, वही होता है जो आपके प्रोविज़निंग ऐप ने organizationId के रूप में लौटाया। जब यह टेनेंट के किसी संगठन की id होती है, तो टोकन उस संगठन के org_id, org_slug और org_name रखते हैं, और निष्क्रिय (disabled) संगठन साइन-इन अस्वीकार कर देता है। कोई भी अन्य मान org_id के रूप में ज्यों का त्यों जारी होता है, बिना किसी विशिष्टता नियम और बिना किसी फ़ॉर्मैट शर्त के। संगठन id लौटाने से सदस्यता नहीं बनती। आप इसे सीधे PUT /api/v1/users/{userId} से भी सेट कर सकते हैं, और GET /api/v1/users?organizationId= से इस पर फ़िल्टर कर सकते हैं।

उपयोगकर्ताओं को सही संगठन से चिह्नित करना

संगठन का निर्णय यहीं, एक ही जगह पर लें, हर निर्माण पथ पर अलग-अलग नहीं। SSO उपयोगकर्ता के साथ federated_connection आता है, जो उस कनेक्शन की पहचान करता है जिसने उन्हें प्रमाणित किया और इसलिए ग्राहक की भी पहचान करता है, और यह तब भी सही रहता है जब एक ग्राहक कई ईमेल डोमेन फ़ेडरेट करता है। आमंत्रित उपयोगकर्ता के पास कोई कनेक्शन नहीं होता, इसलिए उन्हें उस आमंत्रण से मिलाएँ जो आपने जारी किया था। दोनों पथ उपयोगकर्ता के अस्तित्व में आने से पहले /try तक पहुँचते हैं, इसलिए एक ही तर्क दोनों को कवर करता है और दो नियम अलग-अलग दिशा में भटकते नहीं।

Try कॉलबैक में संगठन तय करना
// POST {callbackUrl}/try
app.post('/provisioning/try', async (req, res) => {
  const { email, customAttributes } = req.body;

  // An SSO user carries the connection that vouched for them. That is the
  // customer, and it stays right when one customer has several domains.
  const connection = customAttributes?.federated_connection;

  const org = connection
    ? await orgByConnection(connection)
    : await orgByPendingInvite(email);

  if (!org) return res.json({ approved: false, reason: 'No organization for this user' });

  // Stamped on the user and emitted as org_id on every token from now on.
  res.json({ approved: true, organizationId: org.id });
});

अस्वीकृति खाता हटा देती है

यदि कोई भी ऐप approved: false लौटाता है, तो अभी-अभी बनाया गया उपयोगकर्ता हटा दिया जाता है ताकि कोई आधा-प्रोविज़न किया खाता पीछे न रह जाए। API के निर्माण पथ आपके reason के साथ 422 लौटाते हैं; SAML और OIDC कॉलबैक 400 लौटाते हैं। जिस उपयोगकर्ता के लिए आपको कुछ नहीं करना है, उसके लिए approved: true लौटाएँ।

प्रोविज़निंग ऐप जोड़ना

प्रोविज़निंग ऐप जोड़ने के लिए, एक ऐप नाम, एक Callback URL, एक वैकल्पिक API Key, और एक वैकल्पिक Try टाइमआउट (सेकंड, डिफ़ॉल्ट 60, सीमा 5 से 300; Confirm और Cancel एक निश्चित छोटे टाइमआउट का उपयोग करते हैं) दें। API key प्रत्येक वेबहुक अनुरोध के Authorization हेडर में Bearer टोकन के रूप में भेजी जाती है, जो आपके ऐप को Authagonal से अनुरोधों को प्रमाणित करने की अनुमति देती है।

परीक्षण

अपने कॉलबैक URL पर एक परीक्षण अनुरोध भेजने के लिए किसी भी प्रोविज़निंग ऐप के बगल में Test पर क्लिक करें। परीक्षण परिणाम HTTP स्टेटस कोड और रिस्पॉन्स बॉडी प्रदर्शित करते हैं, जो आपको सत्यापित करने में मदद करते हैं कि आपका ऐप वेबहुक को सही ढंग से प्राप्त और संसाधित कर रहा है।

Provisioning apps page showing configured apps with test results displaying HTTP status and response body

वेबहुक डिलीवरी और रिस्पॉन्स हैंडलिंग सत्यापित करने के लिए प्रोविज़निंग ऐप्स का परीक्षण करें

प्लान सीमाएँ

प्रोविज़निंग ऐप्स की अधिकतम संख्या प्रति टेनेंट कॉन्फ़िगर करने योग्य है, जिसकी डिफ़ॉल्ट सीमा 6 है। यदि आपके वर्कफ़्लो को अतिरिक्त प्रोविज़निंग लक्ष्यों की आवश्यकता हो तो इस सीमा को एक एडमिन द्वारा समायोजित किया जा सकता है।

API Key प्रमाणीकरण

यदि कोई API key सेट है, तो इसे Authorization हेडर में Bearer टोकन के रूप में भेजा जाता है। Authagonal से वेबहुक अनुरोधों को प्रमाणित करने के लिए इसका उपयोग करें।

टीम

Team पेज पोर्टल एडमिनिस्ट्रेटर का प्रबंधन करता है: वे लोग जो मैनेजमेंट पोर्टल के माध्यम से आपके टेनेंट तक पहुँच और उसे कॉन्फ़िगर कर सकते हैं। हर टीम सदस्य की एक भूमिका (मालिक, एडमिन, डेवलपर या सपोर्ट) होती है जो तय करती है कि वे क्या बदल सकते हैं।

एडमिन सूची

एडमिन सूची प्रत्येक टीम सदस्य का नाम, ईमेल पता, भूमिका, और उन्हें जोड़े जाने की तिथि प्रदर्शित करती है। वर्तमान उपयोगकर्ता की पंक्ति के बगल में एक "आप" संकेतक दिखाया जाता है ताकि आप आसानी से अपना खाता पहचान सकें।

एडमिन को आमंत्रित करना

नए टीम सदस्य को आमंत्रित करने के लिए, उनका ईमेल पता, नाम, और भूमिका दें। उन्हें एक ईमेल मिलता है जिसमें अपना पासवर्ड सेट करने और अपना खाता सक्रिय करने का लिंक होता है; लिंक 7 दिनों तक मान्य रहता है।

आमंत्रण फ़ील्ड

एडमिन आमंत्रण एक लंबित खाता बनाते हैं और आमंत्रित व्यक्ति को एक सक्रियण लिंक ईमेल करते हैं।

फ़ील्डविवरण
emailनए एडमिन का ईमेल पता। टेनेंट में अद्वितीय होना चाहिए।
nameएडमिन सूची में दिखाया जाने वाला प्रदर्शन नाम।
roleदी जाने वाली भूमिका: tenant:admin, tenant:developer या tenant:support। डिफ़ॉल्ट tenant:admin है। owner भूमिका आमंत्रण द्वारा नहीं दी जा सकती।

एडमिन को हटाना

टेनेंट का मालिक किसी भी टीम सदस्य की पहुँच रद्द करने के लिए उसके बगल में हटाएं पर क्लिक कर सकता है। हटाने को अंतिम रूप देने से पहले एक पुष्टिकरण डायलॉग दिखाया जाता है। आप स्वयं को नहीं हटा सकते, और टेनेंट का मालिक हमेशा बना रहता है।

Team page showing the admin list with name, email, date added columns, a You indicator, and invite/remove controls

Team पेज से पोर्टल एडमिनिस्ट्रेटर प्रबंधित करें

स्वामित्व

हर टेनेंट का एक मालिक होता है। केवल मालिक ही टीम सदस्यों को हटा सकता है या किसी अन्य सदस्य पर मालिक बनाएं का उपयोग करके स्वामित्व स्थानांतरित कर सकता है; पिछला मालिक एडमिन बन जाता है।

सपोर्ट

पोर्टल छोड़े बिना Authagonal टीम के साथ एक सपोर्ट टिकट खोलें। प्रत्येक टिकट एक थ्रेडेड बातचीत है, इसलिए आप और हमारी टीम पहली रिपोर्ट से समाधान तक एक ही पृष्ठ पर रहते हैं।

आपके टिकट

सपोर्ट पेज आपके द्वारा उठाए गए हर टिकट को सूचीबद्ध करता है, नवीनतम गतिविधि पहले। एक नज़र में यह देखने के लिए स्टेटस बैज का उपयोग करें कि क्या आप पर प्रतीक्षारत है और क्या हम पर।

Support ticket list showing each ticket's subject, status badge, priority, and last-activity time, with a New ticket button

विषय, स्थिति, प्राथमिकता, और अंतिम गतिविधि के साथ आपके सपोर्ट टिकट

  • प्रत्येक पंक्ति विषय, वर्तमान स्थिति (open, pending, resolved, या closed), प्राथमिकता, और अंतिम गतिविधि का समय दिखाती है।
  • एक टिकट खोलने के लिए New ticket पर क्लिक करें, फिर उसे एक विषय, प्राथमिकता, और अपना पहला संदेश दें।
  • रंग-कोडित स्टेटस बैज उन टिकटों के लिए सूची को स्कैन करना आसान बनाते हैं जिन्हें आपके ध्यान की आवश्यकता है।

एक टिकट थ्रेड

किसी टिकट को खोलने पर पूरी बातचीत दिखती है। उत्तर क्रम में पोस्ट होते हैं, और हमारी टीम के नए संदेश पेज रीलोड किए बिना दिखाई देते हैं।

Support ticket thread showing the conversation between the customer and the Authagonal team with a reply box and file attachment control

आपके और Authagonal टीम के बीच एक टिकट थ्रेड

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

उत्तर आप तक कैसे पहुँचते हैं

Authagonal स्टाफ़ एडमिन साइड से टिकटों पर काम करता है। जब भी टीम उत्तर देती है तो आपको ईमेल द्वारा सूचित किया जाता है, इसलिए किसी बातचीत पर नज़र रखने के लिए आपको पोर्टल खुला रखने की आवश्यकता नहीं है।

आपके उपयोगकर्ताओं के लिए सपोर्ट डेस्क

हमसे मिलने वाले सपोर्ट से अलग, Authagonal आपके एंड उपयोगकर्ताओं के लिए एक सपोर्ट डेस्क चला सकता है। वे आपके टेनेंट के अपने ब्रांडेड host पर मौजूद अपने खाता पेजों से टिकट उठाते हैं, और आपकी टीम पोर्टल से उनका जवाब देती है।

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

इसे चालू करना

पोर्टल में ग्राहक सहायता खोलें, उसके सेटिंग्स टैब पर जाएँ और ग्राहक सहायता सक्षम करें चालू करें। यह टैब owners और admins के लिए उपलब्ध है। जब तक आप ऐसा नहीं करते, आपके उपयोगकर्ताओं को कुछ भी दिखाई नहीं देता।

सेटिंगयह क्या करता है
ग्राहक सहायता सक्षम करेंमुख्य स्विच। बंद होने पर, एंड उपयोगकर्ताओं के पेज और आपका ऑपरेटर इनबॉक्स दोनों छिप जाते हैं और उनकी APIs 404 लौटाती हैं।
साइन-आउट आगंतुकों से अनुरोधों की अनुमति देंसाइन आउट किसी विज़िटर को टिकट उठाने देता है, यानी लॉक-आउट वाली स्थिति। यह एक बॉट जाँच से सुरक्षित रहता है, और आगे की बातचीत ईमेल तथा एक निजी लिंक के ज़रिए चलती है, क्योंकि साइन इन करने के लिए कोई खाता होता ही नहीं।
ईमेल सूचनाएंटिकट आने या किसी उपयोगकर्ता के जवाब देने पर किसे ईमेल किया जाए: किसी को नहीं, विशिष्ट पतों को, या आपकी पूरी सपोर्ट टीम (owners, admins और support) को, ताकि किसी को इनबॉक्स पर नज़र गड़ाए बैठा न रहना पड़े।
Default customer languageकिसी उपयोगकर्ता के लिए मानी जाने वाली भाषा, जब हमें उनकी भाषा पहले से पता न हो, उनके टिकटों और ईमेल के लिए। उपयोगकर्ता की अपनी सहेजी गई भाषा हमेशा प्राथमिकता पाती है, और कुछ भी सेट न होने पर यह English होती है। यह सेटिंग्स के <strong>सामान्य</strong> टैब पर है।
सहायता Webhook URLवह URL जिस पर टिकट इवेंट्स POST किए जाएँ, ताकि उन्हें आपके अपने टूलिंग में भेजा जा सके।

Free प्लान पर उपलब्ध नहीं

सपोर्ट डेस्क वही एक क्षमता है जो Free प्लान में शामिल नहीं है, क्योंकि इनबाउंड ईमेल और अनुवाद पर हर उपयोग की असली लागत आती है। हर पेड प्लान में यह मौजूद है। प्रमाणीकरण सुविधाओं को कभी इस तरह सीमित नहीं किया जाता: single sign-on, SCIM, मल्टी-फैक्टर, कस्टम डोमेन, ब्रांडिंग और ऑडिट हर प्लान में हैं, Free में भी।

आपके उपयोगकर्ता क्या देखते हैं

साइन इन किए हुए उपयोगकर्ताओं को आपके टेनेंट host पर अपने खाता पेजों में एक सपोर्ट क्षेत्र मिलता है, जिस पर आपकी ब्रांडिंग होती है। वे टिकट उठा सकते हैं, अपने उठाए हुए सभी टिकट देख सकते हैं, और थ्रेड में जवाब दे सकते हैं। आपकी टीम के जवाब ईमेल से भी पहुँचते हैं, इसलिए उपयोगकर्ता को बार-बार जाँचते रहने की ज़रूरत नहीं पड़ती।

अनाम टिकट सक्षम होने पर, जो व्यक्ति साइन इन नहीं कर सकता वह भी टिकट उठा सकता है। वह एक ईमेल पता और अपना संदेश देता है, और बदले में उसे बातचीत का एक निजी लिंक मिलता है। अंदर आने का यही एकमात्र रास्ता है, इसलिए इसे एक क्रेडेंशियल की तरह मानें: इसका अंदाज़ा नहीं लगाया जा सकता, और जिसके पास यह होगा वह उस एक थ्रेड को पढ़ भी सकता है और उसका जवाब भी दे सकता है।

ऑपरेटर इनबॉक्स

आपकी टीम पोर्टल के साइड मेनू में ग्राहक सहायता से जवाब देती है। यह हमारे साथ चल रहे आपके अपने टिकटों से अलग जगह है, और यह tenant:support भूमिका तथा उससे ऊपर वालों के लिए उपलब्ध है, इसलिए आप किसी एजेंट को बाकी पोर्टल दिए बिना इस डेस्क तक पहुँच दे सकते हैं।

कार्रवाईयह क्या करता है
Replyथ्रेड में पोस्ट करें। उपयोगकर्ता को ईमेल भेजा जाता है, और अगर उसका पेज खुला है तो वह इसे लाइव देख लेता है।
Assignकिसी टिकट को अपनी टीम के किसी नामित सदस्य को सौंपें, ताकि दो लोग एक ही टिकट का जवाब न दें।
Status and priorityकिसी टिकट को open, pending, resolved और closed से होकर आगे बढ़ाएँ, और यह चिह्नित करें कि वह कितना अत्यावश्यक है। बंद किए गए टिकट हमेशा के लिए रखे जाने के बजाय एक रिटेंशन अवधि के बाद हटा दिए जाते हैं।
Internal notesऐसे नोट्स जो केवल आपकी टीम को दिखते हैं, उपयोगकर्ता को कभी नहीं। संपादन और विलोपन ऑडिट लॉग में दर्ज होते हैं।
Open on behalf of a userअपनी डायरेक्टरी से किसी उपयोगकर्ता को चुनकर उसके साथ थ्रेड शुरू करें, उन मामलों के लिए जहाँ बातचीत कहीं और शुरू हुई थी।
Escalate to Authagonalअगर कोई टिकट आपके उत्पाद के बजाय Authagonal से जुड़ा निकले, तो उसे escalate करें। इससे हमारी टीम के साथ एक जुड़ा हुआ टिकट खुलता है, जिसमें आप चाहें तो अब तक की थ्रेड भी भेज सकते हैं, और दोनों को आपस में लिंक कर दिया जाता है ताकि आप दोनों पर नज़र रख सकें। एक टिकट केवल एक बार escalate किया जा सकता है।

उपयोगकर्ता अपनी भाषा में लिखते हैं

टिकट उसी भाषा में संग्रहीत होता है जिसमें उपयोगकर्ता ने उसे लिखा था, और थ्रेड में शामिल हर व्यक्ति उसे अपनी भाषा में पढ़ता है। आपका एजेंट संदेश को अपनी पोर्टल भाषा में अनूदित देखता है, उपयोगकर्ता आपका जवाब अपनी भाषा में अनूदित देखता है, और मूल पाठ हमेशा साथ रखा जाता है। भाषा पहले संदेश से पहचानी जाती है और टिकट के साथ तय कर दी जाती है। अनुवाद हर भाषा के लिए एक बार गणना करके दोबारा उपयोग किए जाते हैं, इसलिए लंबी थ्रेड बार-बार खुद का अनुवाद नहीं करती।

टाइमज़ोन

टिकट यह दर्ज करता है कि उपयोगकर्ता ने उसे किस टाइमज़ोन से उठाया था। इसके बाद हर संदेश आपके समय के बगल में उसका स्थानीय समय भी दिखाता है, ताकि 14:32 पर दिया गया जवाब वैसे ही 02:32 के रूप में पढ़ा जाए जैसा वह उस व्यक्ति के लिए वास्तव में था जो उसका इंतज़ार कर रहा था। जब टाइमज़ोन अज्ञात हो, जैसे ईमेल से आए किसी टिकट में, या जब वह आपके ही टाइमज़ोन जैसा हो, तब कुछ नहीं दिखाया जाता।

वेबहुक

टिकट इवेंट्स को घटित होते ही पाने के लिए एक सपोर्ट वेबहुक URL सेट करें, ताकि अलर्ट उठाया जा सके या टिकटों को अपने सिस्टम में मिरर किया जा सके। पेलोड हस्ताक्षरित होते हैं, इसलिए आप पुष्टि कर सकते हैं कि वे हमसे आए हैं।

इवेंटयह क्या करता है
support.ticket.createdकिसी उपयोगकर्ता ने टिकट उठाया।
support.ticket.messageथ्रेड में एक संदेश पोस्ट किया गया, किसी उपयोगकर्ता द्वारा या आपके किसी ऑपरेटर द्वारा। payload में fromStaff बताता है कि किसने।
support.ticket.status_changedकिसी टिकट की स्थिति बदली, उदाहरण के लिए resolved में।
support.ticket.assignedकोई टिकट किसी टीम सदस्य को सौंपा गया।

इम्पोर्ट और माइग्रेट

किसी मौजूदा identity सिस्टम को अपने Authagonal टेनेंट में माइग्रेट करें। दो स्रोत समर्थित हैं — Duende IdentityServer (एक SQL Server डेटाबेस) और Auth0 (Management API)। प्रत्येक एक read-only प्रीव्यू चलाता है ताकि कमिट करने से पहले आप ठीक-ठीक समीक्षा कर सकें कि क्या कॉपी किया जाएगा।

Duende IdentityServer से इम्पोर्ट करें

किसी मौजूदा Duende IdentityServer SQL Server डेटाबेस से क्लाइंट, स्कोप, उपयोगकर्ता, और भूमिकाओं को अपने Authagonal टेनेंट में माइग्रेट करें। इम्पोर्ट दो चरणों में चलता है — प्रीव्यू और कमिट — ताकि कोई भी बदलाव होने से पहले आप समीक्षा कर सकें कि क्या कॉपी किया जाएगा।

क्या इम्पोर्ट होता है

इम्पोर्टर Duende की ConfigurationDb और ASP.NET Identity तालिकाओं से पढ़ता है और मैप की गई पंक्तियों को आपके टेनेंट में लिखता है। persisted ग्रांट्स, device codes, और साइनिंग keys जैसे अल्पकालिक artifacts को छोड़ दिया जाता है।

एंटिटीस्रोत तालिकाएँटिप्पणियाँ
ClientsClients, ClientSecrets, ClientGrantTypes, ClientScopes, ClientRedirectUrisअक्षम किए गए क्लाइंट अक्षम अवस्था में इम्पोर्ट होते हैं। समाप्त हो चुके सीक्रेट्स को छोड़ दिया जाता है।
ScopesApiScopes, ApiResources, IdentityResourcesजहाँ पहचाने जाते हैं, वहाँ user-क्लेम मैपिंग संरक्षित रहती हैं।
UsersAspNetUsers, AspNetUserClaimsPassword hashes (ASP.NET Identity V3) यथावत कॉपी होते हैं और पहले लॉगिन पर rehash होते हैं।
RolesAspNetRoles, AspNetUserRolesभूमिका असाइनमेंट संरक्षित रहती हैं।
External LoginsAspNetUserLoginsसंदर्भ के लिए संग्रहीत; इम्पोर्ट के बाद SSO के माध्यम से अपस्ट्रीम IdP को पुनः कनेक्ट करें।

कमिट से पहले प्रीव्यू

अपनी Duende ConfigurationDb / IdentityDb connection string पेस्ट करें और पूर्वावलोकन चलाएं पर क्लिक करें। प्रीव्यू एक read-only कनेक्शन खोलता है और हर उस पंक्ति को गिनता है जो इम्पोर्ट की जाएगी। कोई write नहीं होता।

  • क्लाइंट, स्कोप, उपयोगकर्ता, भूमिकाओं, और भूमिका असाइनमेंट के लिए एंटिटी गणना।
  • जब लक्ष्य टेनेंट में पहले से क्लाइंट (मेल खाने वाले ClientIds ओवरराइट हो जाते हैं), भूमिकाएँ, या स्कोप (मेल खाने वाले नाम छोड़ दिए जाते हैं) होते हैं तो टकराव (collision) चेतावनियाँ।
  • अज्ञात तालिकाओं और बिना मैप किए गए कॉलम के लिए चेतावनियाँ ताकि आपको पता रहे कि क्या छोड़ा जाएगा।
Import preview panel showing entity counts and warnings before committing the import

गणना और चेतावनियों के साथ प्रीव्यू पैनल

Password Hashes

Duende पासवर्ड को ASP.NET Identity V3 (PBKDF2) का उपयोग करके संग्रहीत करता है। Authagonal का PasswordHasher उस प्रारूप को सीधे सत्यापित करता है और पहले सफल साइन-इन पर मूल प्रारूप में rehash करता है — उपयोगकर्ता बिना किसी reset प्रवाह के अपने मौजूदा पासवर्ड बनाए रखते हैं।

उपयोगकर्ता ID सुलह

यदि इस टेनेंट में पहले से मौजूद किसी उपयोगकर्ता का ईमेल किसी आने वाले रिकॉर्ड के समान है, तो इम्पोर्ट उस खाते के userId को इम्पोर्ट करने से पहले स्रोत sub में बदल देता है, ताकि इम्पोर्ट की गई भूमिकाएँ, लॉगिन, और क्लेम मौजूदा खाते से जुड़ जाएँ और वे ऐप जो पहले से उपयोगकर्ता को उसके स्रोत sub द्वारा संदर्भित करते हैं, cutover के बाद भी resolve होते रहें। खाते का मौजूदा पासवर्ड और प्रोफ़ाइल संरक्षित रहते हैं; स्रोत भूमिकाएँ उसके ऊपर merge हो जाती हैं। प्रीव्यू हर उस खाते की सूची देता है जिसे आपके कमिट करने से पहले reconcile किया जाएगा।

इम्पोर्ट चलाना

प्रीव्यू की समीक्षा करने के बाद आयात शुरू करें पर क्लिक करें। कमिट चरण क्लाइंट, स्कोप, उपयोगकर्ता, भूमिकाओं, और external-login संदर्भों को आपके टेनेंट स्टोर में लिखता है। मेल खाने वाले clientId वाले क्लाइंट ओवरराइट हो जाते हैं; मेल खाने वाले scope name, email, या role name वाली पंक्तियों को छोड़ दिया जाता है, इसलिए इम्पोर्टर को पुनः चलाना सुरक्षित है।

क्या इम्पोर्ट नहीं होता

  • Persisted grants, device codes, server-side sessions — अल्पकालिक, स्वचालित रूप से पुनः जनरेट होते हैं।
  • Signing keys — Authagonal अपनी स्वयं की प्रति-टेनेंट कुंजियाँ जारी करता है।
  • कस्टम कॉलम और तालिकाएँ — Duende के मानक स्कीमा के बाहर की कोई भी चीज़ एक चेतावनी के रूप में सामने आती है ताकि आपको पता रहे कि डेटा छोड़ दिया गया था।
  • अक्षम किए गए क्लाइंट — अक्षम अवस्था में इम्पोर्ट होते हैं; तैयार होने पर उन्हें Clients पेज से पुनः सक्षम करें।

सैंडबॉक्स में उपलब्ध नहीं

इम्पोर्ट केवल लाइव टेनेंट पर चलता है। इम्पोर्ट करने से पहले सैंडबॉक्स मोड से बाहर निकलें।

Auth0 से इम्पोर्ट करें

Authagonal को अपने Auth0 टेनेंट की Management API से कनेक्ट करें और अपने एप्लिकेशन, API, भूमिकाओं, उपयोगकर्ताओं, और enterprise connections को ले आएँ। इम्पोर्ट किए गए उपयोगकर्ता और एप्लिकेशन ID संरक्षित रहते हैं, ताकि मौजूदा sub और client_id संदर्भ cutover के बाद भी resolve होते रहें।

आपको क्या चाहिए होगा

Auth0 में Management API के लिए अधिकृत एक Machine-to-Machine application बनाएँ, जिसे ये read स्कोप दिए गए हों: read:users, read:clients, read:resource_servers, read:roles, read:connections, read:client_grants। इसके domain, client ID, और client सीक्रेट को इम्पोर्ट फ़ॉर्म में पेस्ट करें — इनका उपयोग केवल इम्पोर्ट के लिए किया जाता है।

क्या इम्पोर्ट होता है

एंटिटीस्रोत तालिकाएँटिप्पणियाँ
Applicationsclients, client-grantsPublic बनाम गोपनीय स्वचालित रूप से पहचाना जाता है। Client सीक्रेट्स को re-hash किया जाता है ताकि वे काम करते रहें।
APIs और स्कोप्सresource-serversऑडियंस और स्कोप्स प्रत्येक क्लाइंट को उसके ग्रांट्स से असाइन किए जाते हैं।
Rolesroles + assignmentsप्रति-उपयोगकर्ता भूमिका असाइनमेंट संरक्षित रहती हैं।
Usersusers + identitiesप्रोफ़ाइल और मेटाडेटा स्थानांतरित होते हैं; social/enterprise identities linked logins बन जाते हैं।
Connectionsconnections (OIDC)Enterprise OIDC connections federated providers बन जाते हैं। SAML, social, और database connections को एक चेतावनी के साथ छोड़ दिया जाता है।

Passwords

Auth0 की Management API कभी password hashes नहीं लौटाती। यदि आपके पास Auth0 का support-assisted bulk password export (NDJSON) है, तो उसे प्रदान करें — bcrypt hashes यथावत इम्पोर्ट होते हैं और आपके उपयोगकर्ता बिना किसी reset के अपने पासवर्ड बनाए रखते हैं। वह फ़ाइल आपका पूरा उपयोगकर्ता सेट भी वहन करती है, जो Auth0 की 1,000-उपयोगकर्ता API सूचीकरण सीमा को हटा देती है। इसके बिना, उपयोगकर्ता प्रोफ़ाइल के रूप में इम्पोर्ट होते हैं और पहले साइन-इन पर एक नया पासवर्ड सेट करते हैं।

वही प्रीव्यू, रोटेशन, और सीमाएँ

ऊपर वर्णित प्रीव्यू, owner-userId रोटेशन, पुनः-चलाने योग्य कमिट, और सैंडबॉक्स प्रतिबंध Auth0 इम्पोर्ट पर भी लागू होते हैं।

API संदर्भ

प्रत्येक टेनेंट https://{slug}.authagonal.io पर एक मानक-अनुरूप OIDC सर्वर उपलब्ध कराता है। सभी एंडपॉइंट OAuth 2.0 और OpenID Connect विनिर्देशों का पालन करते हैं। यह संदर्भ हर उस एंडपॉइंट को कवर करता है जिससे आपके एप्लिकेशन को इंटरैक्ट करने की आवश्यकता हो सकती है।

OIDC Authorization Code Flow with PKCE: sequence diagram showing the 9-step flow between your app, the browser, and Authagonal

PKCE के साथ Authorization Code Flow

OIDC डिस्कवरी और JWKS

डिस्कवरी दस्तावेज़ OIDC क्लाइंट लाइब्रेरीज़ को स्वयं को स्वचालित रूप से कॉन्फ़िगर करने देता है। किसी भी एंडपॉइंट के लिए प्रमाणीकरण आवश्यक नहीं है।

GET /.well-known/openid-configuration

OpenID Provider Configuration दस्तावेज़ लौटाता है। प्रतिक्रिया में वह सारा मेटाडेटा शामिल होता है जो आपके क्लाइंट को इस टेनेंट के साथ इंटरैक्ट करने के लिए चाहिए।

फ़ील्डविवरण
issuerटेनेंट जारीकर्ता URL
authorization_endpointप्राधिकरण अनुरोधों के लिए URL
token_endpointटोकन एक्सचेंज के लिए URL
userinfo_endpointउपयोगकर्ता क्लेम प्राप्त करने के लिए URL
jwks_uriJSON Web Key Set के लिए URL
revocation_endpointटोकन रिवोकेशन के लिए URL
introspection_endpointटोकन इंट्रोस्पेक्शन के लिए URL
end_session_endpointलॉगआउट / end-session के लिए URL
device_authorization_endpointdevice authorization अनुरोधों के लिए URL
pushed_authorization_request_endpointPushed Authorization Request एंडपॉइंट (RFC 9126) का URL।
require_pushed_authorization_requestsक्या टेनेंट वैश्विक रूप से PAR की आवश्यकता रखता है। जब यह false हो तब भी, अलग-अलग क्लाइंट RequirePushedAuthorizationRequests = true सेट कर सकते हैं।
scopes_supportedसमर्थित स्कोप की सूची
response_types_supportedसमर्थित प्रतिक्रिया प्रकार
grant_types_supportedसमर्थित ग्रांट प्रकार
code_challenge_methods_supportedसमर्थित PKCE विधियाँ (S256)
backchannel_logout_supportedक्या बैक-चैनल logout समर्थित है

GET /.well-known/openid-configuration/jwks

टोकन हस्ताक्षरों को सत्यापित करने के लिए उपयोग किया जाने वाला JSON Web Key Set लौटाता है। प्रतिक्रिया में EC P-256 सार्वजनिक कुंजियों का एक keys array होता है (टोकन ES256 से हस्ताक्षरित होते हैं), जिनमें से प्रत्येक में kty (EC), use, kid, alg, crv, x, और y फ़ील्ड शामिल होते हैं।

Fetch discovery document
curl https://acme.authagonal.io/.well-known/openid-configuration

Authorization एंडपॉइंट

GET /connect/authorize

एक authorization code flow आरंभ करता है। उपयोगकर्ता के पास एक सक्रिय सत्र होना चाहिए, अन्यथा उन्हें लॉगिन पेज पर रीडायरेक्ट कर दिया जाएगा। सफल होने पर, उपयोगकर्ता को एक authorization code के साथ वापस आपके एप्लिकेशन पर रीडायरेक्ट किया जाता है।

पैरामीटरआवश्यकविवरण
response_typeहाँ"code" होना चाहिए
client_idहाँआपका पंजीकृत क्लाइंट पहचानकर्ता
redirect_uriहाँएक पंजीकृत redirect URI से बिल्कुल मेल खाना चाहिए
scopeहाँस्कोप की स्पेस-पृथक सूची (उदा. "openid profile email")
stateअनुशंसितCSRF सुरक्षा के लिए अपारदर्शी मान, रीडायरेक्ट में अपरिवर्तित लौटाया जाता है
code_challengePKCE होने पर आवश्यकcode_verifier का Base64url-एन्कोडेड SHA-256 hash
code_challenge_methodPKCE होने पर आवश्यक"S256" होना चाहिए
nonceवैकल्पिकरीप्ले सुरक्षा के लिए ID टोकन से बंधा मान
login_hintवैकल्पिकलॉगिन पेज पर ईमेल फ़ील्ड को पहले से भरें

सफलता प्रतिक्रिया: code और state क्वेरी पैरामीटर के साथ redirect_uri पर 302 रीडायरेक्ट।

त्रुटि प्रतिक्रिया: error, error_description, और state क्वेरी पैरामीटर के साथ 302 रीडायरेक्ट।

PKCE आवश्यक

सभी क्लाइंट के लिए डिफ़ॉल्ट रूप से PKCE आवश्यक है। एक code_verifier (43 या अधिक वर्णों की एक यादृच्छिक स्ट्रिंग) जनरेट करें, इसे SHA-256 से hash करें, और code_challenge बनाने के लिए परिणाम को base64url-एन्कोड करें।

Pushed Authorization Requests (PAR)

RFC 9126। हर authorize पैरामीटर को URL पर रखने के बजाय, आपका क्लाइंट सामान्य क्लाइंट प्रमाणीकरण के साथ उन्हें /connect/par पर POST करता है और एक अल्पकालिक अपारदर्शी request_uri वापस पाता है। फिर ब्राउज़र /connect/authorize?client_id=...&request_uri=... पर जाता है — और कुछ भी ब्राउज़र इतिहास, सर्वर लॉग, या Referer हेडर में नहीं पहुँचता, और सर्वर पहले ही क्लाइंट auth के तहत पैरामीटर की अखंडता जाँच चुका होता है।

POST /connect/par

क्लाइंट प्रमाणीकरण /connect/token के समान है: client_id/client_secret के साथ HTTP Basic, या form-एन्कोडेड क्रेडेंशियल। Public क्लाइंट बिना सीक्रेट के पोस्ट करते हैं। body में वही पैरामीटर होते हैं जो आप सामान्यतः /connect/authorize पर भेजते हैं; request_uri स्वयं अस्वीकृत कर दिया जाता है (PAR को chain करना विनिर्देश के §2.1 द्वारा निषिद्ध है)। 201 Created लौटाता है।

पैरामीटरआवश्यकविवरण
client_idहाँआपका क्लाइंट ID। प्रमाणित क्लाइंट से मेल खाना चाहिए।
client_secretगोपनीय क्लाइंटआपका क्लाइंट सीक्रेट। गोपनीय क्लाइंट के लिए आवश्यक।
response_typeहाँ"code" होना चाहिए
redirect_uriहाँएक पंजीकृत redirect URI से बिल्कुल मेल खाना चाहिए
scopeहाँस्कोप की स्पेस-पृथक सूची (उदा. "openid profile email")
code_challengePKCE होने पर आवश्यकcode_verifier का Base64url-एन्कोडेड SHA-256 hash
code_challenge_methodPKCE होने पर आवश्यक"S256" होना चाहिए
stateअनुशंसितCSRF सुरक्षा के लिए अपारदर्शी मान, रीडायरेक्ट में अपरिवर्तित लौटाया जाता है
nonceवैकल्पिकरीप्ले सुरक्षा के लिए ID टोकन से बंधा मान

प्रतिक्रिया

फ़ील्डविवरण
request_uriएकल-उपयोग अपारदर्शी संदर्भ, उदा. <code>urn:ietf:params:oauth:request_uri:abc123…</code>। इसे <code>request_uri</code> के रूप में <code>/connect/authorize</code> पर पास करें।
expires_in<code>request_uri</code> का जीवनकाल सेकंड में। डिफ़ॉल्ट 90 है — विशिष्ट reference-IdP मान।

फ़ॉलो-अप GET /connect/authorize?client_id=…&request_uri=… पर, अन्य सभी पैरामीटर pushed payload से लिए जाते हैं और कोई भी अतिरिक्त क्वेरी पैरामीटर अनदेखा कर दिया जाता है। authorize कॉल पर client_id उस क्लाइंट से मेल खाना चाहिए जिसने अनुरोध push किया था। एक बार उपयोग होने पर (या expires_in बीत जाने पर), request_uri स्टोर से हटा दिया जाता है।

प्रति क्लाइंट PAR अनिवार्य करना

किसी क्लाइंट से सादे /connect/authorize कॉल अस्वीकार करने के लिए उस क्लाइंट पर pushed authorization requests आवश्यक करें टॉगल करें (पोर्टल, क्लाइंट, क्लाइंट खोलें, सुरक्षा टैब)। उच्च-जोखिम वाले क्लाइंट के लिए अनुशंसित दृष्टिकोण RequirePushedAuthorizationRequests = true को PKCE के साथ जोड़ता है, जो URL बार को पूरी तरह से एक आक्रमण सतह के रूप में हटा देता है।
Push an authorization request and follow up
# 1. Push parameters (server returns request_uri + expires_in)
curl -X POST https://acme.authagonal.io/connect/par \
  -u "my-app:CLIENT_SECRET" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "response_type=code" \
  -d "redirect_uri=https://app.example.com/callback" \
  -d "scope=openid profile email" \
  -d "state=$(openssl rand -hex 16)" \
  -d "code_challenge=YOUR_CODE_CHALLENGE" \
  -d "code_challenge_method=S256"

# 2. Send the user to /authorize with only client_id + request_uri
# https://acme.authagonal.io/connect/authorize?client_id=my-app&request_uri=urn:ietf:params:oauth:request_uri:abc123...

Token एंडपॉइंट

POST /connect/token

क्रेडेंशियल को टोकन के लिए एक्सचेंज करता है। अनुरोधों को Content-Type: application/x-www-form-urlencoded का उपयोग करना चाहिए। क्लाइंट प्रमाणीकरण HTTP Basic auth (Authorization: Basic base64(client_id:client_secret)) के माध्यम से या form body पैरामीटर (client_id + client_secret) के रूप में प्रदान किया जा सकता है।

Authorization Code Grant

पैरामीटरआवश्यकविवरण
grant_typeहाँ"authorization_code"
codeहाँरीडायरेक्ट से प्राप्त authorization code
redirect_uriहाँप्राधिकरण अनुरोध में उपयोग किए गए URI से मेल खाना चाहिए
code_verifierPKCE होने पर आवश्यकcode_challenge जनरेट करने के लिए उपयोग की गई मूल यादृच्छिक स्ट्रिंग
client_idहाँआपका क्लाइंट पहचानकर्ता (यदि Basic auth का उपयोग नहीं कर रहे हैं)
client_secretगोपनीय क्लाइंटआपका क्लाइंट सीक्रेट (यदि Basic auth का उपयोग नहीं कर रहे हैं)

Refresh Token Grant

पैरामीटरआवश्यकविवरण
grant_typeहाँ"refresh_token"
refresh_tokenहाँएक्सचेंज करने के लिए रिफ़्रेश टोकन
client_idहाँआपका क्लाइंट पहचानकर्ता
client_secretगोपनीय क्लाइंटआपका क्लाइंट सीक्रेट

Client Credentials Grant

पैरामीटरआवश्यकविवरण
grant_typeहाँ"client_credentials"
client_idहाँआपका क्लाइंट पहचानकर्ता
client_secretहाँआपका क्लाइंट सीक्रेट
scopeवैकल्पिकअनुरोध करने के लिए स्पेस-पृथक स्कोप

Device Code Grant

पैरामीटरआवश्यकविवरण
grant_typeहाँ"urn:ietf:params:oauth:grant-type:device_code"
device_codeहाँdevice authorization प्रतिक्रिया से प्राप्त device code
client_idहाँआपका क्लाइंट पहचानकर्ता
client_secretगोपनीय क्लाइंटआपका क्लाइंट सीक्रेट

Token प्रतिक्रिया:

फ़ील्डविवरण
access_tokenAPI कॉल के लिए एक्सेस टोकन
token_type"Bearer"
expires_inसेकंड में टोकन जीवनकाल
id_tokenOpenID Connect ID token (जब openid स्कोप का अनुरोध किया जाता है)
refresh_tokenRefresh टोकन (जब offline_access स्कोप प्रदान किया जाता है)
Exchange authorization code with PKCE
curl -X POST https://acme.authagonal.io/connect/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "code=AUTHORIZATION_CODE" \
  -d "redirect_uri=https://app.example.com/callback" \
  -d "client_id=my-app" \
  -d "code_verifier=YOUR_CODE_VERIFIER"

UserInfo एंडपॉइंट

GET /connect/userinfo

प्रमाणित उपयोगकर्ता के बारे में क्लेम लौटाता है। openid स्कोप के साथ एक वैध एक्सेस टोकन की आवश्यकता होती है।

फ़ील्डप्रकारविवरण
substringअद्वितीय उपयोगकर्ता पहचानकर्ता
emailstringउपयोगकर्ता ईमेल पता
email_verifiedbooleanक्या ईमेल सत्यापित किया गया है
given_namestringपहला नाम
family_namestringअंतिम नाम
namestringपूरा प्रदर्शन नाम
phone_numberstringफ़ोन नंबर (यदि प्रदान किया गया हो)। <code>phone</code> scope के अंतर्गत जारी होता है।
org_idstringवह संगठन जिससे उपयोगकर्ता संबंधित है। इसे आपका अपना प्रोविज़निंग ऐप सौंपता है (देखें प्रोविज़निंग ऐप्स) या PUT /api/v1/users/{userId} से सेट किया जाता है; Authagonal इसे कभी व्युत्पन्न नहीं करता। यह profile scope के तहत जारी होता है, और उपयोगकर्ता के पास कोई संगठन न हो तो अनुपस्थित रहता है।
rolesstring[]असाइन की गई भूमिकाओं का array। केवल तभी जारी होता है जब टोकन में <code>roles</code> scope हो।
groupsobject[]समूह सदस्यताओं का array, प्रत्येक में id और name के साथ। केवल तभी जारी होता है जब टोकन में <code>groups</code> scope हो।
Fetch user info
curl https://acme.authagonal.io/connect/userinfo \
  -H "Authorization: Bearer ACCESS_TOKEN"

Token Introspection (RFC 7662)

POST /connect/introspect

एक टोकन को सत्यापित करता है और उसका मेटाडेटा लौटाता है। क्लाइंट क्रेडेंशियल (Basic auth या form body पैरामीटर) की आवश्यकता होती है।

पैरामीटरआवश्यकविवरण
tokenहाँइंट्रोस्पेक्ट करने के लिए टोकन
token_type_hintवैकल्पिकटोकन प्रकार के बारे में संकेत (उदा. "refresh_token")

सक्रिय टोकन प्रतिक्रिया:

फ़ील्डविवरण
activetrue
subSubject (उपयोगकर्ता ID)
client_idवह क्लाइंट जिसे टोकन जारी किया गया था
scopeप्रदान किए गए स्पेस-पृथक स्कोप
issजारीकर्ता
expसमाप्ति समय (Unix timestamp)
iatजारी-किए-जाने का समय (Unix timestamp)
audऑडियंस
token_typeटोकन प्रकार (उदा. "Bearer")

निष्क्रिय टोकन प्रतिक्रिया: { "active": false }

हमेशा 200 OK

RFC 7662 के अनुसार, इंट्रोस्पेक्शन एंडपॉइंट किसी भी टोकन के लिए 200 OK उत्तर देता है, ताकि इसका उपयोग टोकन एन्युमरेट करने के लिए न किया जा सके। एक अमान्य, समाप्त या रद्द टोकन बस active: false लौटाता है। एकमात्र अपवाद स्वयं कॉलर है: प्रमाणीकरण में विफल होने वाले क्लाइंट को 401 invalid_client मिलता है।
Introspect a token
curl -X POST https://acme.authagonal.io/connect/introspect \
  -u "my-app:CLIENT_SECRET" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "token=ACCESS_OR_REFRESH_TOKEN"

Token Revocation (RFC 7009)

POST /connect/revocation

पहले जारी किए गए टोकन को रद्द करता है। क्लाइंट क्रेडेंशियल की आवश्यकता होती है।

पैरामीटरआवश्यकविवरण
tokenहाँरद्द करने के लिए टोकन
token_type_hintवैकल्पिकटोकन प्रकार के बारे में संकेत (उदा. "refresh_token")

RFC 7009 विनिर्देश के अनुसार, एंडपॉइंट हमेशा 200 OK लौटाता है, यहाँ तक कि अमान्य या पहले से रद्द किए गए टोकन के लिए भी।

Access और refresh टोकन

Refresh टोकन और access टोकन दोनों रद्द किए जा सकते हैं। किसी refresh टोकन को रद्द करने से उससे बनाए गए access टोकन भी रद्द हो जाते हैं। रद्द किया गया access टोकन introspection और userinfo द्वारा अस्वीकार कर दिया जाता है, लेकिन JWT को स्थानीय रूप से सत्यापित करने वाला resource server उसे समाप्त होने तक स्वीकार करता रहता है, इसलिए access टोकन की अवधि छोटी रखें।

Device Authorization (RFC 8628)

POST /connect/deviceauthorization

इनपुट-सीमित उपकरणों (CLI, स्मार्ट TV, IoT उपकरण) के लिए device authorization flow आरंभ करता है। डिवाइस उपयोगकर्ता को एक कोड दिखाता है, जो फिर ब्राउज़र वाले एक अलग डिवाइस पर अनुरोध को स्वीकृत करता है।

पैरामीटरआवश्यकविवरण
client_idहाँआपका क्लाइंट पहचानकर्ता
client_secretगोपनीय क्लाइंटआपका क्लाइंट सीक्रेट
scopeवैकल्पिकस्पेस-पृथक स्कोप (डिफ़ॉल्ट "openid")

प्रतिक्रिया:

फ़ील्डविवरण
device_codeडिवाइस सत्यापन कोड (पोलिंग के लिए उपयोग किया जाता है)
user_codeXXXX-XXXX प्रारूप में उपयोगकर्ता-सम्मुख कोड
verification_uriवह URL जिस पर उपयोगकर्ता कोड दर्ज करने के लिए जाता है
verification_uri_completeuser_code पहले से भरा हुआ URL
expires_inडिफ़ॉल्ट रूप से 300 (सेकंड, यानी कोड 5 मिनट तक वैध है)। प्रति क्लाइंट सेट किया जाता है।
interval5 (सेकंड — न्यूनतम पोलिंग अंतराल)

स्वीकृति प्रवाह: उपयोगकर्ता verification_uri पर जाता है, user_code दर्ज करता है, और अनुरोध स्वीकृत करता है। इस बीच, डिवाइस device_code के साथ टोकन एंडपॉइंट को poll करता है।

पोलिंग त्रुटि कोड:

त्रुटिअर्थ
authorization_pendingउपयोगकर्ता ने अभी तक स्वीकृत नहीं किया — पोलिंग जारी रखें
expired_tokendevice code समाप्त हो गया है — प्रवाह पुनः आरंभ करें
access_deniedउपयोगकर्ता ने प्राधिकरण अनुरोध अस्वीकार कर दिया
Request device authorization
curl -X POST https://acme.authagonal.io/connect/deviceauthorization \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=my-cli" \
  -d "scope=openid profile email"

End Session / Logout

GET POST /connect/endsession

वर्तमान उपयोगकर्ता सत्र को साइन आउट करता है, पंजीकृत back-channel या front-channel logout URI वाले हर क्लाइंट को सूचित करता है, और उस सत्र से जुड़े ग्रांट्स रद्द करता है। वर्तमान सत्र से मेल खाने वाले id_token_hint के बिना, उपयोगकर्ता से पहले साइन-आउट की पुष्टि करने के लिए कहा जाता है।

पैरामीटरआवश्यकविवरण
id_token_hintवैकल्पिकID टोकन — post_logout_redirect_uri को सत्यापित करने के लिए उपयोग किया जाता है
post_logout_redirect_uriवैकल्पिकलॉगआउट के बाद कहाँ रीडायरेक्ट करना है (पंजीकृत होना चाहिए)
stateवैकल्पिकरीडायरेक्ट में लौटाया गया अपारदर्शी मान

यदि एक वैध post_logout_redirect_uri प्रदान किया जाता है और एक पंजीकृत URI से मेल खाता है, तो उपयोगकर्ता को 302 रीडायरेक्ट प्राप्त होता है। अन्यथा, एक JSON प्रतिक्रिया पुष्टि करती है कि सत्र समाप्त कर दिया गया है।

Back-Channel Logout

जब कोई उपयोगकर्ता साइन आउट करता है, तो Authagonal प्रत्येक क्लाइंट के BackChannelLogoutUri पर एक हस्ताक्षरित JWT भेजता है। JWT में sub, aud, iss, और http://schemas.openid.net/event/backchannel-logout event क्लेम शामिल होते हैं। यह सूचना प्राप्त होने पर आपके एप्लिकेशन को उपयोगकर्ता के स्थानीय सत्र को अमान्य कर देना चाहिए।

SCIM 2.0 API संदर्भ

Authagonal स्वचालित उपयोगकर्ता और समूह प्रोविज़निंग के लिए SCIM 2.0 प्रोटोकॉल का समर्थन करता है। Okta, Azure AD, और OneLogin जैसे आइडेंटिटी प्रोवाइडर आपके Authagonal टेनेंट को आपकी कॉर्पोरेट डायरेक्टरी के साथ सिंक में रखने के लिए इस API का उपयोग कर सकते हैं।

Base URL: https://{slug}.authagonal.io/scim/v2

प्रमाणीकरण: सभी अनुरोधों के लिए एक Bearer टोकन आवश्यक है। पोर्टल में SCIM पेज पर एक SCIM टोकन जनरेट करें: वह क्लाइंट चुनें जिसके लिए आपका IdP प्रोविज़न करता है, फिर टोकन बनाएं।

सामान्य हेडर:

हेडरमान
AuthorizationBearer SCIM_TOKEN
Content-Typeapplication/scim+json

List एंडपॉइंट count (डिफ़ॉल्ट 100, अधिकतम 200; 0 केवल कुल संख्या लौटाता है) लेते हैं, और filter पैरामीटर (उदा. userName eq "[email protected]") के माध्यम से फ़िल्टरिंग करते हैं। Users cursor से पेज होते हैं: पिछली प्रतिक्रिया का nextCursor पास करें। Groups या तो startIndex (1-आधारित) या cursor स्वीकार करते हैं।

Users

GET /scim/v2/Users: वैकल्पिक पेजिनेशन और फ़िल्टरिंग के साथ उपयोगकर्ताओं की सूची बनाएँ।

क्वेरी पैरामीटरविवरण
startIndexUsers के लिए केवल 1 स्वीकार किया जाता है; इसके बजाय cursor से पेज करें। बड़ा मान 400 invalidValue लौटाता है।
cursorअपारदर्शी (opaque) पेजिंग cursor: अगला पेज पाने के लिए पिछले पेज का nextCursor पास करें
countप्रति पेज परिणामों की अधिकतम संख्या (डिफ़ॉल्ट: 100, अधिकतम: 200; 0 केवल कुल संख्या लौटाता है)
filterSCIM filter अभिव्यक्ति (उदा. userName eq "[email protected]")

GET /scim/v2/Users/{id}: किसी एक उपयोगकर्ता को उसके Authagonal उपयोगकर्ता ID द्वारा प्राप्त करें।

POST /scim/v2/Users: एक नया उपयोगकर्ता बनाएँ। 201 Created लौटाता है।

फ़ील्डआवश्यकविवरण
userNameहाँईमेल पता (टेनेंट के भीतर अद्वितीय होना चाहिए)
name.givenNameनहींपहला नाम
name.familyNameनहींअंतिम नाम
displayNameनहींपूरा प्रदर्शन नाम
activeनहींक्या उपयोगकर्ता सक्रिय है (डिफ़ॉल्ट: true)
externalIdनहींअपस्ट्रीम आइडेंटिटी प्रोवाइडर से पहचानकर्ता

PUT /scim/v2/Users/{id}: किसी उपयोगकर्ता संसाधन का पूर्ण प्रतिस्थापन। सभी फ़ील्ड प्रदान किए जाने चाहिए।

PATCH /scim/v2/Users/{id}: SCIM PatchOp का उपयोग करके आंशिक अपडेट।

ऑपरेशनसमर्थित पथउदाहरण मान
replaceuserName, active, name.givenName, name.familyName, displayName, externalId, preferredLanguagetrue / false, या एक string मान
adduserName, active, name.givenName, name.familyName, displayName, externalId, preferredLanguagetrue / false, या एक string मान
removename.givenName, name.familyName, displayName, externalId, preferredLanguage(किसी मान की आवश्यकता नहीं)

DELETE /scim/v2/Users/{id}: उपयोगकर्ता को soft delete करता है (खाता निष्क्रिय करता है और सभी टोकन रद्द करता है)। 204 No Content लौटाता है।

Create a user via SCIM
curl -X POST https://acme.authagonal.io/scim/v2/Users \
  -H "Authorization: Bearer SCIM_TOKEN" \
  -H "Content-Type: application/scim+json" \
  -d '{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "userName": "[email protected]",
    "name": {
      "givenName": "Jane",
      "familyName": "Smith"
    },
    "displayName": "Jane Smith",
    "active": true,
    "externalId": "ext-12345"
  }'

Groups

GET /scim/v2/Groups: वैकल्पिक पेजिनेशन और फ़िल्टरिंग के साथ सभी समूहों की सूची बनाएँ।

GET /scim/v2/Groups/{id}: किसी एक समूह को ID द्वारा प्राप्त करें, उसकी सदस्य सूची सहित।

POST /scim/v2/Groups: एक नया समूह बनाएँ। 201 Created लौटाता है।

फ़ील्डआवश्यकविवरण
displayNameहाँसमूह प्रदर्शन नाम
membersनहींसदस्य ऑब्जेक्ट का array, प्रत्येक में उपयोगकर्ता ID वाला एक value फ़ील्ड
externalIdनहींअपस्ट्रीम आइडेंटिटी प्रोवाइडर से पहचानकर्ता

PUT /scim/v2/Groups/{id}: किसी समूह संसाधन का पूर्ण प्रतिस्थापन (उसकी सदस्य सूची सहित)।

PATCH /scim/v2/Groups/{id}: आंशिक अपडेट: सदस्य जोड़ें, हटाएँ या बदलें, या displayName और externalId बदलें।

DELETE /scim/v2/Groups/{id}: समूह को hard delete करता है। 204 No Content लौटाता है।

Add members to a group via PATCH
curl -X PATCH https://acme.authagonal.io/scim/v2/Groups/GROUP_ID \
  -H "Authorization: Bearer SCIM_TOKEN" \
  -H "Content-Type: application/scim+json" \
  -d '{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [
      {
        "op": "add",
        "path": "members",
        "value": [
          { "value": "USER_ID_1" },
          { "value": "USER_ID_2" }
        ]
      }
    ]
  }'

SCIM त्रुटि प्रतिक्रियाएँ

जब कोई SCIM अनुरोध विफल होता है, तो प्रतिक्रिया body SCIM त्रुटि स्कीमा का पालन करती है: { "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"], "status": "400", "detail": "..." }। सामान्य स्थिति कोड में 400 (bad request), 404 (resource not found), 409 (conflict / duplicate), और 429 (rate limited) शामिल हैं।

Portal API (ऑटोमेशन)

Portal API आपके अपने बैकएंड को वह सब कुछ ऑटोमेट करने देता है जो आप पोर्टल में कर सकते हैं — उपयोगकर्ता, क्लाइंट, ग्रुप, रोल, स्कोप, SSO कनेक्शन और सेटिंग्स प्रबंधित करना — एक machine-to-machine क्रेडेंशियल का उपयोग करके। यह वही API है जिसे पोर्टल UI कॉल करता है।

Base URL: https://portal-api.<your-domain>/api/v1. अनुरोध एक Bearer एक्सेस टोकन के साथ प्रमाणित होते हैं; टेनेंट को URL से नहीं, टोकन से लिया जाता है।

एक API क्रेडेंशियल बनाना

पोर्टल में, Clients → Create API credential खोलें, एक एक्सेस स्तर चुनें, और उसे एक नाम दें। Authagonal Portal API के लिए तैयार एक OAuth client_credentials क्लाइंट जनरेट करता है और एक client ID व सीक्रेट लौटाता है।

सीक्रेट तुरंत कॉपी करें

client सीक्रेट केवल एक बार दिखाया जाता है, बनाने के तुरंत बाद। डायलॉग बंद करने से पहले इसे अपने सीक्रेट manager में स्टोर करें — यदि आप इसे खो देते हैं, तो क्रेडेंशियल हटाएँ और एक नया बनाएँ।

एक्सेस स्तर

स्कोपग्रांट्स
tenant:ownerपूर्ण एक्सेस, जिसमें पूरे टेनेंट को हटाने जैसी विनाशकारी केवल-Owner क्रियाएँ शामिल हैं।
tenant:adminकेवल-Owner क्रियाओं को छोड़कर सब कुछ प्रबंधित करें — उपयोगकर्ता, क्लाइंट, SSO, ग्रुप, रोल, ब्रांडिंग और सेटिंग्स।
tenant:developerक्लाइंट, स्कोप, ब्रांडिंग और प्रोविज़निंग ऐप्स प्रबंधित करें।
tenant:supportसपोर्ट कार्यों के लिए उपयोगकर्ताओं को पढ़ें और प्रबंधित करें, और ऑडिट लॉग पढ़ें।

आप केवल वही ग्रांट कर सकते हैं जो आपके पास है

कोई क्रेडेंशियल उसे बनाने वाले व्यक्ति से अधिक विशेषाधिकार-प्राप्त नहीं हो सकता। एक admin owner-स्कोप वाला क्रेडेंशियल नहीं बना सकता, और प्लेटफ़ॉर्म प्रशासनिक स्कोप कभी किसी क्रेडेंशियल को ग्रांट नहीं किया जा सकता।

एक टोकन प्राप्त करना

अपने टेनेंट के टोकन एंडपॉइंट — https://<your-tenant>.<your-domain>/connect/token — पर क्रेडेंशियल को एक एक्सेस टोकन के बदले प्राप्त करें, फिर टोकन को Portal API पर Bearer header के रूप में भेजें। टोकन एक घंटे के लिए मान्य होते हैं।

एक टोकन प्राप्त करें, फिर API कॉल करें
# 1. Exchange the credential for an access token (your tenant's token endpoint)
curl -X POST https://acme.authagonal.io/connect/token \
  -d grant_type=client_credentials \
  -d client_id=api-3f2a... \
  -d client_secret=YOUR_CLIENT_SECRET \
  -d scope=tenant:admin

# Response: { "access_token": "ey...", "token_type": "Bearer", "expires_in": 3600 }

# 2. Call the Portal API with the access token
curl https://portal-api.authagonal.io/api/v1/users \
  -H "Authorization: Bearer $ACCESS_TOKEN"

एंडपॉइंट्स

सभी पाथ base URL के सापेक्ष हैं और एक Bearer एक्सेस टोकन की आवश्यकता होती है। प्रत्येक समूह के बगल में दिया गया स्कोप उसके लिए आवश्यक न्यूनतम क्रेडेंशियल एक्सेस स्तर है। पेजिंग resource के अनुसार भिन्न होती है: उपयोगकर्ता और ऑडिट लॉग count (1 से 200, डिफ़ॉल्ट 50) और after लेते हैं, जिसे पिछली प्रतिक्रिया के continuationToken पर सेट किया जाता है; समूह startIndex और count लेते हैं; संगठन limit और cursor लेते हैं; क्लाइंट, भूमिकाएँ और स्कोप हर पंक्ति लौटाते हैं।

क्लाइंटtenant:developer

GET/api/v1/clientsOAuth क्लाइंट सूचीबद्ध करें।

GET/api/v1/clients/{id}ID द्वारा एक क्लाइंट प्राप्त करें।

POST/api/v1/clientsएक क्लाइंट बनाएँ। क्लाइंट रिकॉर्ड के साथ 201 लौटाता है। सीक्रेट यहाँ नहीं लौटाए जाते: POST /api/v1/clients/{clientId}/secrets से एक सीक्रेट बनाएँ, जो उसे एक बार दिखाता है।

PUT/api/v1/clients/{id}एक क्लाइंट अपडेट करें (redirect URIs, ग्रांट प्रकार, टोकन जीवनकाल, PKCE/PAR आवश्यकताएँ)।

DELETE/api/v1/clients/{id}एक क्लाइंट हटाएँ।

POST/api/v1/clients/api-credentialएक machine-to-machine Portal API क्रेडेंशियल बनाएँ।

उपयोगकर्ताtenant:support

GET/api/v1/usersउपयोगकर्ताओं की सूची. count, search (ईमेल या नाम उपसर्ग), किसी एक संगठन पर फ़िल्टर करने के लिए organizationId, और कर्सर पेजिंग के लिए after का समर्थन करता है.

GET/api/v1/users/countटेनेंट के लिए कुल उपयोगकर्ता संख्या।

GET/api/v1/users/stats/mfaMFA एनरोलमेंट आँकड़े।

GET/api/v1/users/{id}एक उपयोगकर्ता प्राप्त करें।

POST/api/v1/users/inviteईमेल द्वारा एक उपयोगकर्ता को आमंत्रित करें। एक लंबित खाता बनाता है और एक लिंक ईमेल करता है जहाँ आमंत्रित व्यक्ति अपना पासवर्ड खुद सेट करता है। वैकल्पिक organizationId और organizationRoles एक संगठन सदस्यता भी जोड़ते हैं।

PUT/api/v1/users/{id}उपयोगकर्ता अपडेट करें (प्रोफ़ाइल, ईमेल, isActive, emailConfirmed, organizationId)। email या emailConfirmed बदलने के लिए tenant:admin आवश्यक है।

DELETE/api/v1/users/{id}एक उपयोगकर्ता हटाएँ।

GET/api/v1/users/{id}/mfaGet a user's enrolled MFA methods.

DELETE/api/v1/users/{id}/mfaReset a user's MFA enrollment. Needs tenant:admin.

रोलtenant:admin

GET/api/v1/rolesरोल सूचीबद्ध करें।

POST/api/v1/rolesएक रोल बनाएँ।

DELETE/api/v1/roles/{id}एक रोल हटाएँ।

POST/api/v1/roles/assignकिसी उपयोगकर्ता को एक रोल असाइन करें।

POST/api/v1/roles/unassignकिसी उपयोगकर्ता से एक रोल हटाएँ।

ग्रुपtenant:admin

GET/api/v1/groupsग्रुप सूचीबद्ध करें।

GET/api/v1/groups/{id}एक ग्रुप उसके सदस्यों सहित प्राप्त करें।

POST/api/v1/groupsएक ग्रुप बनाएँ।

POST/api/v1/groups/{id}/membersएक ग्रुप में सदस्य जोड़ें।

DELETE/api/v1/groups/{groupId}/members/{userId}एक ग्रुप से एक सदस्य हटाएँ।

DELETE/api/v1/groups/{id}एक ग्रुप हटाएँ।

GET/api/v1/group-role-mappingsग्रुप-से-रोल मैपिंग सूचीबद्ध करें (ग्रुप सदस्यता द्वारा टोकन जारी करते समय ग्रांट किए गए रोल)।

स्कोपtenant:developer

GET/api/v1/scopesAPI स्कोप सूचीबद्ध करें।

POST/api/v1/scopesएक स्कोप बनाएँ।

DELETE/api/v1/scopes/{name}एक स्कोप हटाएँ।

SSO कनेक्शनtenant:admin

GET/api/v1/saml/connectionsSAML कनेक्शन सूचीबद्ध करें।

POST/api/v1/saml/connectionsएक SAML कनेक्शन बनाएँ।

DELETE/api/v1/saml/connections/{id}एक SAML कनेक्शन हटाएँ।

GET/api/v1/oidc/connectionsOIDC कनेक्शन सूचीबद्ध करें।

POST/api/v1/oidc/connectionsएक OIDC कनेक्शन बनाएँ।

DELETE/api/v1/oidc/connections/{id}एक OIDC कनेक्शन हटाएँ।

GET/api/v1/sso/domainsSSO कनेक्शन पर रूट किए गए डोमेन सूचीबद्ध करें (home-realm डिस्कवरी)।

ब्रांडिंगtenant:developer

GET/api/v1/brandingटेनेंट ब्रांडिंग प्राप्त करें (रंग, लोगो, समर्थित भाषाएँ)।

PUT/api/v1/brandingटेनेंट ब्रांडिंग अपडेट करें।

सेटिंग्सtenant:admin

GET/api/v1/settingsटेनेंट सेटिंग्स प्राप्त करें (वेबहुक, सार्वजनिक sign-up, टोकन नीति)।

PUT/api/v1/settingsटेनेंट सेटिंग्स अपडेट करें।

POST/api/v1/settings/webhook-secret/regenerateवेबहुक साइनिंग सीक्रेट रोटेट करें।

POST/api/v1/settings/test-emailवर्तमान ईमेल कॉन्फ़िगरेशन के साथ एक परीक्षण ईमेल भेजें।

कस्टम डोमेन और ईमेलtenant:admin

GET/api/v1/custom-domainsकस्टम लॉगिन डोमेन और उनकी सत्यापन स्थिति सूचीबद्ध करें।

POST/api/v1/custom-domainsएक कस्टम डोमेन जोड़ें।

POST/api/v1/custom-domains/{domain}/verifyएक कस्टम डोमेन के लिए DNS सत्यापन ट्रिगर करें।

DELETE/api/v1/custom-domains/{domain}एक कस्टम डोमेन हटाएँ।

GET/api/v1/email/domains/{domainId}किसी प्रेषक ईमेल डोमेन के DNS रिकॉर्ड और सत्यापन स्थिति प्राप्त करें।

ऑडिट लॉगtenant:support

GET/api/v1/auditटेनेंट ऑडिट लॉग क्वेरी करें।

SCIM के माध्यम से उपयोगकर्ताओं का प्रोविज़निंग

किसी IdP (Entra, Okta) से बल्क उपयोगकर्ता और ग्रुप प्रोविज़निंग के लिए, इन एंडपॉइंट्स के बजाय SCIM 2.0 API का उपयोग करें।

उदाहरण: एक उपयोगकर्ता को आमंत्रित करें

POST /api/v1/users/invite
curl -X POST https://portal-api.authagonal.io/api/v1/users/invite \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "firstName": "Ada",
    "lastName": "Lovelace"
  }'

# 200 OK
# { "userId": "8f3a...", "email": "[email protected]" }

जो कुछ भी UI कर सकता है

Portal API वही एंडपॉइंट उजागर करता है जिनका उपयोग पोर्टल UI करता है, इसलिए कोई भी ऑपरेशन जो आप पोर्टल में कर सकते हैं उसे ऑटोमेट किया जा सकता है — क्रेडेंशियल के एक्सेस स्तर के अधीन।

संगठन API

नीचे के सभी routes के लिए TenantAdmin पॉलिसी ज़रूरी है और, जहाँ अलग से न बताया गया हो, ये /api/v1/organizations के अंतर्गत हैं। क्रेडेंशियल बनाने के तरीके के लिए पोर्टल API देखें। दोनों list routes cursor-पेज्ड हैं: limit दें (डिफ़ॉल्ट 50, 1 से 200) और पिछला nextCursor cursor के रूप में दें। वे { items, nextCursor } लौटाते हैं, और गलत cursor 400 invalid_cursor है। संगठन ऑब्जेक्ट में केवल-पढ़ने योग्य domains सूची होती है।

मेथडपाथBodyटिप्पणियाँ
GET/api/v1/organizations–संगठन का एक पेज, id के क्रम में। Query: cursor?, limit? (डिफ़ॉल्ट 50, 1 से 200)। { items, nextCursor } लौटाता है; null nextCursor आख़िरी पेज है।
POST/api/v1/organizationsslug, name, brandingJson?, enabled?, requireMembershipForTokens?, allowAutoMembership?, metadata?201 + संगठन। 409 slug_taken।
GET/api/v1/organizations/{idOrSlug}–पहले id से खोजा जाता है, फिर slug से।
PUT/api/v1/organizations/{id}name?, brandingJson?, slug?, enabled?, requireMembershipForTokens?, allowAutoMembership?, metadata?केवल नामित फ़ील्ड बदलते हैं। अलग slug अस्वीकार होता है: बनने के बाद वह अपरिवर्तनीय है। domains यहाँ से नहीं बदले जा सकते।
DELETE/api/v1/organizations/{id}–पहले संगठन की हर सदस्यता हटाता है, फिर संगठन को।
GET/api/v1/organizations/{id}/members–सदस्यताओं का एक पेज, user id के क्रम में, सदस्य का live ईमेल/नाम user store से resolve करके। Query: cursor?, limit?।
POST/api/v1/organizations/{id}/membersuserId? | email?, status?, roles?201 + सदस्यता। 404 user_not_found। 409 membership_exists। आरक्षित tenant:* और platform:* roles 400 invalid_role के साथ अस्वीकार होते हैं, हटाए नहीं जाते।
PUT/api/v1/organizations/{id}/members/{userId}status?, roles?status को active करने पर joinedAt स्टैम्प होता है, यदि पहले से सेट न हो।
DELETE/api/v1/organizations/{id}/members/{userId}–पंक्ति को पूरी तरह हटाता है, status बदलना नहीं।
POST/api/v1/organizations/{id}/domainsdomainईमेल डोमेन क्लेम करता है, असत्यापित। 201 + { domain, verified, verifiedAt, createdAt, recordName, recordValue }। 400 domain_invalid। 409 domain_exists, domain_taken।
POST/api/v1/organizations/{id}/domains/{domain}/verify–recordName पर TXT रिकॉर्ड खोजता है और recordValue से ठीक मिलाता है। सत्यापित होने पर 200 + डोमेन (दोहराने पर no-op 200); न मिलने पर 409 verification_failed; 409 domain_taken; 404 domain_not_found।
DELETE/api/v1/organizations/{id}/domains/{domain}–204। क्लेम हटाता है, सत्यापित हो या नहीं। मौजूदा सदस्य बने रहते हैं। 404 domain_not_found।
POST/api/v1/organizations/backfilldryRun? = trueपुराने AuthUser.संगठनId टैग को असली संगठन/संगठनसदस्यता पंक्तियों में माइग्रेट करता है।
GET/api/v1/users/{userId}/organizations–वे सभी संगठन जिनका यह उपयोगकर्ता सदस्य है, हर एक में उसकी status/roles के साथ।

लॉगिन स्क्रीन

ये वे होस्टेड स्क्रीन हैं जो आपके अंतिम उपयोगकर्ता आपके टेनेंट के auth server पर देखते हैं। Authagonal हर स्क्रीन उपयोग के लिए तैयार भेजता है, इसलिए आपको कोई UI बनाए बिना एक संपूर्ण, सुरक्षित sign-in अनुभव मिलता है। यह पेज प्रत्येक स्क्रीन के बारे में बताता है और दिखाता है कि कौन-सी पोर्टल सेटिंग्स इसे नियंत्रित करती हैं।

पूरी तरह व्हाइट-लेबल

यहाँ हर स्क्रीन आपके टेनेंट की Branding सेटिंग्स द्वारा रंगी जाती है — आपका लोगो, रंग, ऐप नाम और कस्टम CSS। स्क्रीन prefers-color-scheme का भी सम्मान करती हैं, इसलिए वे उपयोगकर्ता के डिवाइस से मेल खाने के लिए light और dark के बीच स्विच करती हैं।

साइन इन

Hosted sign-in screen with an email field, Continue button, single sign-on provider buttons, and forgot-password and create-account links
  • ईमेल-पहले, दो-चरण प्रवाह: उपयोगकर्ता अपना ईमेल दर्ज करता है और Continue पर क्लिक करता है, फिर पासवर्ड फ़ील्ड दिखाई देता है।
  • "Continue with {provider}" single sign-on बटन SSO कनेक्शन मौजूद होने पर स्वतः दिखाई देते हैं।
  • Forgot password और create account लिंक, जिनमें से प्रत्येक को दिखाया या छिपाया जा सकता है।
  • स्वचालित sign-in प्रयासों को रोकने के लिए वैकल्पिक Cloudflare Turnstile captcha।

पोर्टल admin में नियंत्रित

  • Branding लोगो, रंग, ऐप नाम, सपोर्ट ईमेल और कस्टम CSS सेट करती है।
  • forgot-password और registration लिंक दिखाएँ या छिपाएँ (Branding)।
  • SSO connections सोशल sign-in बटन जोड़ते हैं (SSO पेज)।
  • सत्र जीवनकाल और लॉकआउट थ्रेशोल्ड (सेटिंग्स → सेशन)।

रजिस्ट्रेशन

Account registration screen with first and last name fields, email, password, and a live password-policy checklist
  • पहला और अंतिम नाम (वैकल्पिक), ईमेल, और एक पासवर्ड एकत्र करता है।
  • उपयोगकर्ता के टाइप करते ही एक लाइव password-policy चेकलिस्ट अपडेट होती है, इसलिए सबमिट करने से पहले आवश्यकताएँ स्पष्ट होती हैं।
  • वैकल्पिक Cloudflare Turnstile captcha।
  • उन उपयोगकर्ताओं के लिए एक "Sign in" लिंक जिनके पास पहले से एक खाता है।

पोर्टल admin में नियंत्रित

  • registration लिंक दिखाएँ या छिपाएँ (Branding)। पंजीकरण को पूरी तरह बंद करने के लिए, सार्वजनिक साइन-अप की अनुमति दें बंद करें (सेटिंग्स → सेशन)।
  • आपके टेनेंट की password policy चेकलिस्ट को संचालित करती है।
  • Branding पूरी स्क्रीन को स्टाइल करती है।

पासवर्ड भूल गए

Forgot-password screen with an email field and a neutral check-your-email confirmation state
  • उपयोगकर्ता अपना ईमेल दर्ज करता है, फिर एक तटस्थ "check your email" पुष्टि देखता है।
  • स्क्रीन कभी प्रकट नहीं करती कि कोई खाता मौजूद है या नहीं, जो अकाउंट एन्युमरेशन जाँच को विफल करती है।
  • एक "Back to sign in" लिंक उपयोगकर्ता को sign-in स्क्रीन पर लौटाता है।

पोर्टल admin में नियंत्रित

  • forgot-password लिंक दिखाएँ या छिपाएँ (Branding)।
  • आपके टेनेंट की email delivery रीसेट संदेश भेजती है।
  • Branding पूरी स्क्रीन को स्टाइल करती है।

पासवर्ड रीसेट करें

Reset-password screen with new and confirm password fields and a live per-rule requirement checklist
  • नया पासवर्ड और पासवर्ड पुष्टि करें फ़ील्ड एक लाइव प्रति-नियम आवश्यकता चेकलिस्ट के साथ।
  • जब रीसेट टोकन अब मान्य नहीं रहता तो एक स्पष्ट अमान्य या समाप्त लिंक स्थिति।
  • एक सफलता स्थिति जो पुष्टि करती है कि पासवर्ड बदल दिया गया है।

पोर्टल admin में नियंत्रित

  • आपके टेनेंट की password policy चेकलिस्ट को संचालित करती है।
  • Branding पूरी स्क्रीन को स्टाइल करती है।

MFA चैलेंज

MFA challenge screen with a method switcher, a six-digit authenticator code field, recovery-code entry, and a passkey button
  • authenticator app, passkey, और recovery code के बीच एक method switcher।
  • एक 6-अंकीय TOTP फ़ील्ड जो सभी अंक दर्ज होते ही स्वतः सबमिट हो जाता है।
  • उन उपयोगकर्ताओं के लिए recovery-code प्रविष्टि जिन्होंने अपने authenticator तक पहुँच खो दी है।
  • हार्डवेयर-समर्थित सत्यापन के लिए एक passkey बटन।

पोर्टल admin में नियंत्रित

  • MFA policy प्रति एप्लिकेशन सेट की जाती है (Clients → Security)।
  • किसी भी enrolled factor वाले उपयोगकर्ता को नीति की परवाह किए बिना हमेशा चैलेंज किया जाता है।

MFA सेटअप

MFA setup screen showing enrolled-method status, authenticator QR code and manual key, passkey enrolment, and recovery-code generation
  • enrolled methods की स्थिति दिखाता है ताकि उपयोगकर्ता जान सके कि क्या पहले से कॉन्फ़िगर है।
  • QR code के माध्यम से Authenticator सेटअप, एक मैनुअल key फ़ॉलबैक, और एक पुष्टि चरण।
  • हार्डवेयर-समर्थित प्रमाणीकरण के लिए Passkey एनरोलमेंट।
  • खाता रिकवरी के लिए Recovery-code जनरेशन।
  • जब MFA आवश्यक के बजाय स्वयं-सेवा हो तो एक वैकल्पिक skip।

पोर्टल admin में नियंत्रित

  • MFA policy प्रति एप्लिकेशन सेट की जाती है; Required लॉगिन पर सेटअप को बाध्य करता है (Clients → Security)।
  • Branding पूरी स्क्रीन को स्टाइल करती है।

डिवाइस प्राधिकरण

Device authorization screen with a centered user-code entry field, an Approve button, and an approved confirmation state
  • डिवाइस पर दिखाए गए कोड के लिए एक केंद्रित user-code प्रविष्टि फ़ील्ड।
  • डिवाइस को अधिकृत करने के लिए एक approve चरण।
  • जब उपयोगकर्ता अभी प्रमाणित नहीं हुआ है तो एक sign-in interstitial।
  • डिवाइस अधिकृत होने के बाद एक approved पुष्टि।

पोर्टल admin में नियंत्रित

  • एप्लिकेशन पर device-code grant सक्षम करें (क्लाइंट → स्कोप और ग्रांट)।
  • device-code lifetime सेट करें (Clients → Tokens)।
Consent screen showing the requesting application's logo and name, a per-scope permission list, and Allow and Deny buttons
  • अनुरोध करने वाले क्लाइंट का लोगो और नाम दिखाता है।
  • प्रत्येक अनुमति के लिए मित्रवत, मानव-पठनीय लेबल के साथ एक प्रति-स्कोप सूची।
  • एक्सेस ग्रांट या अस्वीकार करने के लिए Allow और Deny बटन।
  • एक consent hint footer जो समझाता है कि निर्णय का क्या अर्थ है।

पोर्टल admin में नियंत्रित

  • प्रति एप्लिकेशन सहमति आवश्यक करें चालू करें (क्लाइंट → सामान्य)।
  • लोगो, नाम और URL एप्लिकेशन के अपने मेटाडेटा से आते हैं।
  • Branding सहमति कार्ड को रंगती है।

कनेक्टेड ऐप्स (ग्रांट्स)

Connected apps screen listing the applications a user has authorized with their scopes and granted date, plus a revoke control
  • उपयोगकर्ता द्वारा अधिकृत प्रत्येक ऐप को उसके नाम, स्कोप और ग्रांट की तारीख के साथ सूचीबद्ध करता है।
  • किसी ऐप का एक्सेस Revoke करें, इसके प्रभावी होने से पहले एक पुष्टि चरण के साथ।
  • जब उपयोगकर्ता ने किसी ऐप को अधिकृत नहीं किया हो तो एक मित्रवत empty state।

पोर्टल admin में नियंत्रित

  • सूची consent-required एप्लिकेशन द्वारा भरी जाती है।
  • Branding पूरी स्क्रीन को स्टाइल करती है।

खाता

/login/account पर एक होस्टेड स्वयं-सेवा खाता पेज जहाँ साइन-इन उपयोगकर्ता बिना किसी पोर्टल एक्सेस की आवश्यकता के अपनी प्रोफ़ाइल और पसंदीदा भाषा प्रबंधित करते हैं।

Self-service account screen with editable profile fields and a preferred Language selector
  • पहला और अंतिम नाम, कंपनी और फ़ोन संपादित करें; ईमेल पता केवल-पढ़ने के लिए दिखाया जाता है।
  • समर्थित locales में से एक पसंदीदा भाषा चुनें; UI तुरंत चयन का पूर्वावलोकन दिखाता है और सहेजने पर इसे बनाए रखता है।
  • सहेजी गई भाषा उपयोगकर्ता के होस्टेड UI और उन्हें प्राप्त होने वाले transactional ईमेल की भाषा को संचालित करती है।

पोर्टल admin में नियंत्रित

  • Branding पूरी स्क्रीन को स्टाइल करती है।
  • वही पसंदीदा भाषा पोर्टल के Users पेज पर एक admin द्वारा संपादन योग्य है।

प्रमाणीकरण प्रवाह

प्रमाणीकरण प्रवाह यह कवर करते हैं कि अंतिम उपयोगकर्ता आपके Authagonal टेनेंट के साथ कैसे इंटरैक्ट करते हैं — लॉगिन करना, रजिस्टर करना, पासवर्ड रीसेट करना और MFA सेट अप करना। इन एंडपॉइंट्स का उपयोग होस्टेड लॉगिन पेज द्वारा किया जाता है और यदि आप एक कस्टम लॉगिन UI बना रहे हैं तो इन्हें सीधे कॉल किया जा सकता है।

लॉगिन

POST /api/auth/login

ईमेल और पासवर्ड के साथ एक उपयोगकर्ता को प्रमाणित करता है। सफलता पर, एक सत्र कुकी साइन करता है और उपयोगकर्ता प्रोफ़ाइल लौटाता है। यदि MFA कॉन्फ़िगर है, तो प्रतिक्रिया इंगित करती है कि सत्र पूरी तरह स्थापित होने से पहले एक second factor आवश्यक है।

अनुरोध बॉडी:

Login request
{
  "email": "[email protected]",
  "password": "correct-horse-battery-staple"
}

सफलता प्रतिक्रिया:

फ़ील्डप्रकारविवरण
userIdstringविशिष्ट उपयोगकर्ता पहचानकर्ता
emailstringउपयोगकर्ता ईमेल पता
namestringपूर्ण प्रदर्शन नाम
mfaAvailablebooleanक्या उपयोगकर्ता के पास MFA विधियाँ enrolled हैं

MFA required प्रतिक्रिया: जब उपयोगकर्ता के पास MFA enrolled होता है, तो प्रतिक्रिया में mfaRequired: true के साथ एक challengeId और उपलब्ध MFA विधियों को सूचीबद्ध करने वाला एक methods array शामिल होता है।

MFA setup required प्रतिक्रिया: जब एप्लिकेशन की MFA policy आवश्यक (Required) होती है लेकिन उपयोगकर्ता ने अभी तक enroll नहीं किया है, तो प्रतिक्रिया में enrollment प्रवाह के लिए एक setupToken के साथ mfaSetupRequired: true शामिल होता है।

त्रुटि प्रतिक्रियाएँ:

त्रुटि कोडHTTP Statusविवरण
invalid_credentials401ईमेल या पासवर्ड गलत है
account_disabled403खाता एक admin द्वारा निष्क्रिय कर दिया गया है
email_not_confirmed403उपयोगकर्ता ने अपना ईमेल पता सत्यापित नहीं किया है
locked_out423खाता अस्थायी रूप से लॉक है (सेकंड में retryAfter शामिल है)। केवल तब लौटाया जाता है जब पासवर्ड सही हो; लॉक रहते गलत पासवर्ड invalid_credentials लौटाता है
sso_required409ईमेल डोमेन में SSO कॉन्फ़िगर है (redirectUrl शामिल है)
too_many_attempts429इस IP से या इस ईमेल के लिए बहुत अधिक लॉगिन प्रयास; बाद में फिर से प्रयास करें
captcha_failed400Turnstile चुनौती विफल रही या मौजूद नहीं है (केवल तब जब Turnstile सक्षम हो)

SSO check: यदि उपयोगकर्ता के ईमेल डोमेन में एक SSO कनेक्शन कॉन्फ़िगर है, तो login एंडपॉइंट एक redirectUrl के साथ sso_required लौटाता है। क्लाइंट को उपयोगकर्ता को SSO प्रदाता पर रीडायरेक्ट करना चाहिए।

Account lockout: maxFailedAttempts लगातार विफल लॉगिन प्रयासों के बाद, खाता lockoutDurationMinutes के लिए लॉक हो जाता है। दोनों मान टेनेंट सेटिंग्स में कॉन्फ़िगर करने योग्य हैं।

होस्टेड लॉगिन पेज

login एंडपॉइंट को आमतौर पर होस्टेड लॉगिन पेज द्वारा कॉल किया जाता है, सीधे आपके एप्लिकेशन द्वारा नहीं। प्रमाणीकरण शुरू करने के लिए OIDC authorization code प्रवाह का उपयोग करें — आपके उपयोगकर्ता स्वतः होस्टेड लॉगिन पेज पर रीडायरेक्ट हो जाएँगे।

रजिस्ट्रेशन

POST /api/auth/register

एक नया उपयोगकर्ता खाता बनाता है और एक सत्यापन ईमेल भेजता है। जब तक <strong>Require verified email to sign in</strong> (सेटिंग्स &rarr; सेशन) चालू है, जो कि डिफ़ॉल्ट है, उपयोगकर्ता को लॉगिन करने से पहले अपना ईमेल सत्यापित करना होगा।

अनुरोध बॉडी:

Registration request
{
  "email": "[email protected]",
  "password": "a-strong-password-here",
  "firstName": "Jane",
  "lastName": "Smith"
}
फ़ील्डआवश्यकविवरण
emailहाँईमेल पता (अद्वितीय होना चाहिए)
passwordहाँटेनेंट password policy को पूरा करना चाहिए
firstNameनहींपहला नाम
lastNameनहींअंतिम नाम

सफलता: नए खाते के userId के साथ 201 Created। पहले से लिए गए ईमेल के साथ रजिस्टर करने पर भी 201 लौटता है: हम कभी प्रकट नहीं करते कि कोई ईमेल मौजूद है या नहीं (अकाउंट एन्युमरेशन रोकने के लिए), और इसके बजाय वास्तविक खाताधारक को ईमेल द्वारा सूचित करते हैं।

त्रुटि प्रतिक्रियाएँ:

त्रुटि कोडHTTP Statusविवरण
weak_password400पासवर्ड टेनेंट password policy को पूरा नहीं करता
rate_limited429बहुत अधिक रजिस्ट्रेशन प्रयास
provisioning_rejected422एक प्रोविज़निंग वेबहुक ने रजिस्ट्रेशन को अस्वीकार कर दिया
invalid_email400ईमेल पता मान्य नहीं है
captcha_failed400Turnstile चुनौती विफल रही या मौजूद नहीं है (केवल तब जब Turnstile सक्षम हो)
public_signup_disabled403इस टेनेंट के लिए सार्वजनिक साइन-अप बंद है (सेटिंग्स &rarr; सेशन)

Password Policy

सबमिशन से पहले GET /api/auth/password-policy के माध्यम से टेनेंट की पासवर्ड आवश्यकताएँ जाँचें। यह एक rules सूची लौटाता है: न्यूनतम लंबाई और आवश्यक वर्ण वर्ग।

पासवर्ड रीसेट

POST /api/auth/forgot-password

एक पासवर्ड रीसेट ईमेल का अनुरोध करता है। ईमेल एन्युमरेशन रोकने के लिए, एंडपॉइंट हमेशा एक सफलता प्रतिक्रिया लौटाता है, चाहे ईमेल मौजूद हो या नहीं।

Forgot password request
{
  "email": "[email protected]"
}

POST /api/auth/reset-password

ईमेल लिंक से टोकन का उपयोग करके उपयोगकर्ता का पासवर्ड रीसेट करता है।

Reset password request
{
  "token": "RESET_TOKEN_FROM_EMAIL",
  "newPassword": "new-strong-password"
}

एक सफल पासवर्ड रीसेट के दुष्प्रभाव:

  • विफल लॉगिन प्रयास काउंटर शून्य पर रीसेट हो जाता है
  • सभी मौजूदा रिफ़्रेश टोकन्स रद्द कर दिए जाते हैं
  • एक नया security stamp जनरेट होता है (सभी मौजूदा सत्र को अमान्य करते हुए)

MFA सेटअप और सत्यापन

Authagonal तीन MFA विधियों का समर्थन करता है: TOTP (authenticator apps), WebAuthn (security keys और biometrics), और एकल-उपयोग recovery codes।

TOTP सेटअप

POST /api/auth/mfa/totp/setup: एक <code>setupToken</code>, एक QR code data URI और एक मैनुअल entry key लौटाता है। उपयोगकर्ता अपने authenticator app (Google Authenticator, Authy, 1Password, आदि) से QR code स्कैन करता है, फिर enrollment की पुष्टि करता है।

POST /api/auth/mfa/totp/confirm: setup से मिले <code>setupToken</code> को authenticator app के एक 6-अंकीय कोड के साथ भेजकर TOTP enrollment की पुष्टि करता है।

Confirm TOTP enrollment
{
  "setupToken": "SETUP_TOKEN_FROM_SETUP_RESPONSE",
  "code": "123456"
}

WebAuthn सेटअप

POST /api/auth/mfa/webauthn/setup — WebAuthn API के लिए क्रेडेंशियल creation options लौटाता है। ब्राउज़र इन options के साथ navigator.credentials.create() कॉल करता है।

POST /api/auth/mfa/webauthn/confirm: ब्राउज़र से attestation प्रतिक्रिया सबमिट करके WebAuthn enrollment की पुष्टि करता है।

Recovery Codes

POST /api/auth/mfa/recovery/generate: 10 एकल-उपयोग 10-वर्ण recovery codes (फ़ॉर्मैट <code>XXXXX-XXXXX</code>) जनरेट करता है। प्रत्येक कोड MFA को बायपास करने के लिए ठीक एक बार उपयोग किया जा सकता है। पहले एक authenticator app या passkey नामांकित होना चाहिए।

Recovery Codes केवल एक बार दिखाए जाते हैं

Recovery codes केवल जनरेशन के समय प्रदर्शित होते हैं और बाद में पुनर्प्राप्त नहीं किए जा सकते। यदि कोई उपयोगकर्ता अपना authenticator डिवाइस और अपने recovery codes दोनों खो देता है, तो उनके फिर से लॉगिन कर पाने से पहले एक admin को पोर्टल से उनका MFA क्रेडेंशियल मैन्युअल रूप से हटाना होगा।

MFA सत्यापन

POST /api/auth/mfa/verify: एक सफल पासवर्ड लॉगिन के बाद MFA चैलेंज पूरा करता है।

फ़ील्डआवश्यकविवरण
challengeIdहाँlogin प्रतिक्रिया से challenge ID
methodहाँ"totp", "recovery", या "webauthn"
codeTOTP / Recovery6-अंकीय TOTP कोड या recovery कोड (XXXXX-XXXXX)
assertionWebAuthnnavigator.credentials.get() से एसर्शन प्रतिक्रिया

MFA स्थिति

GET /api/auth/mfa/status: उपयोगकर्ता की वर्तमान में enrolled MFA विधियाँ लौटाता है।

SSO लॉगिन प्रवाह

Authagonal SAML 2.0 और OIDC-आधारित दोनों SSO कनेक्शन का समर्थन करता है। डोमेन-आधारित रूटिंग स्वतः पता लगाता है कि उपयोगकर्ता के ईमेल पते के आधार पर किस SSO प्रदाता का उपयोग करना है।

SSO Check

GET /api/auth/[email protected]

फ़ील्डप्रकारविवरण
ssoRequiredbooleanक्या ईमेल डोमेन को SSO की आवश्यकता है
providerTypestring"saml" या "oidc"
connectionIdstringSSO कनेक्शन पहचानकर्ता
redirectUrlstringSSO लॉगिन के लिए उपयोगकर्ता को रीडायरेक्ट करने का URL

SAML प्रवाह

उपयोगकर्ता को GET /saml/{connectionId}/login पर रीडायरेक्ट किया जाता है जो आइडेंटिटी प्रोवाइडर को एक SAML AuthnRequest भेजता है। IdP उपयोगकर्ता को प्रमाणित करता है और एक SAML प्रतिक्रिया वापस Assertion Consumer Service (ACS) एंडपॉइंट पर पोस्ट करता है। Authagonal एसर्शन को मान्य करता है, उपयोगकर्ता बनाता या अपडेट करता है, और एक सत्र कुकी साइन करता है।

आपके IdP को कॉन्फ़िगर करने के लिए SAML मेटाडेटा GET /saml/{connectionId}/metadata पर उपलब्ध है।

OIDC प्रवाह

उपयोगकर्ता को GET /oidc/{connectionId}/login पर रीडायरेक्ट किया जाता है जो PKCE के साथ अपस्ट्रीम आइडेंटिटी प्रोवाइडर पर रीडायरेक्ट करता है। उपयोगकर्ता के प्रमाणित होने के बाद, /oidc/callback पर callback authorization code का आदान-प्रदान करता है, ID टोकन को मान्य करता है, और उपयोगकर्ता बनाता या अपडेट करता है।

JIT Provisioning: SAML और OIDC दोनों प्रवाह just-in-time प्रोविज़निंग का समर्थन करते हैं, जो हर कनेक्शन पर डिफ़ॉल्ट रूप से बंद होती है (JIT प्रोविज़निंग चालू करें)। जब यह चालू हो और उपयोगकर्ता टेनेंट में पहले से मौजूद न हो, तो उन्हें आइडेंटिटी प्रोवाइडर के क्लेम्स से स्वतः बनाया जाता है। यदि वे मौजूद हैं, तो उनकी प्रोफ़ाइल विशेषताएँ प्रदाता से नवीनतम मानों से मेल खाने के लिए अपडेट की जाती हैं।

डोमेन-आधारित रूटिंग

डोमेन-आधारित रूटिंग का मतलब है कि आपके उपयोगकर्ताओं को यह जानने की आवश्यकता नहीं है कि वे किस SSO प्रदाता का उपयोग करते हैं। उनका ईमेल पता दर्ज करना पर्याप्त है — Authagonal डोमेन को सही SSO कनेक्शन से मिलाता है और स्वतः रीडायरेक्ट करता है।

Backend-for-Frontend (BFF)

एक BFF, OAuth टोकन को ब्राउज़र से पूरी तरह बाहर रखता है। आपका single-page app एक httpOnly सेशन कुकी के अलावा कुछ नहीं रखता, और आपके अपने बैकएंड पर मौजूद एक confidential client, OpenID Connect फ़्लो चलाता है तथा टोकन सर्वर साइड पर रखता है।

जो कुछ भी एक single-page app पढ़ सकता है, उसे cross-site scripting चुरा सकता है, और इसमें मेमोरी में रखा एक्सेस टोकन तथा localStorage में रखा रिफ़्रेश टोकन, दोनों शामिल हैं। ब्राउज़र में टोकन रखने से उनका जीवनकाल भी सीमित करना पड़ता है, क्योंकि स्क्रिप्ट्स की पहुँच में मौजूद लंबे जीवनकाल वाला रिफ़्रेश टोकन एक स्थायी जोखिम है। IETF की OAuth 2.0 for Browser-Based Apps best current practice ठीक इसी वजह से यह पैटर्न सुझाती है।

बदले में आपको एक ऐसा सेशन मिलता है जो पेज रीलोड के बाद भी बना रहता है और कहीं कोई टोकन दिखाई नहीं देता, रिफ़्रेश आपके लिए सर्वर साइड पर संभाला जाता है, back-channel logout के ज़रिए तुरंत revocation मिलता है, और एक प्रमाणीकृत प्रॉक्सी मिलती है ताकि आपकी API को कभी ऐसा टोकन पार्स न करना पड़े जिससे ब्राउज़र छेड़छाड़ कर सकता था।

क्लाइंट बनाएँ

पोर्टल में क्लाइंट खोलें और BFF ऐप बनाएँ चुनें। वह base URL दें जिससे आपका ऐप सर्व होता है, उदाहरण के लिए https://app.acme.com, और Authagonal आपके लिए एक सही ढंग से कॉन्फ़िगर किया गया confidential client पंजीकृत कर देता है, बजाय इसके कि उसे जोड़ने का काम आप पर छोड़ दे:

सेटिंगमान
Redirect URI{appBaseUrl}/bff/callback
Post-logout redirect URI{appBaseUrl}/
Back-channel logout URI{appBaseUrl}/bff/backchannel-logout
Grant typesauthorization_code, refresh_token
Scopesopenid, profile, email, offline_access
PKCE और client secretदोनों आवश्यक

सीक्रेट केवल एक बार दिखाया जाता है

प्रतिक्रिया में clientId, clientSecret और authority आते हैं, और उसके बाद सीक्रेट कभी वापस नहीं पाया जा सकता, क्योंकि केवल उसका hash संग्रहीत होता है। इसे सीधे अपने बैकएंड के कॉन्फ़िगरेशन या सीक्रेट स्टोर में डालें। अगर यह खो जाए, तो इसे वापस पाने की कोशिश करने के बजाय दूसरा क्लाइंट बनाएँ।

इसे अपने बैकएंड में जोड़ें

दो रनटाइम समर्थित हैं और दोनों एक ही core protocol साझा करते हैं: .NET के लिए Authagonal.Bff और Node के लिए @authagonal/bff, जिसमें Express तथा Next.js के लिए अडैप्टर भी शामिल हैं। इनमें से किसी को भी उन मानों की ओर इंगित करें जो पोर्टल ने अभी आपको दिए हैं। Node पैकेज को आपका अपना एक cookieSecret भी चाहिए, जिसका उपयोग वह अपनी कुकीज़ को एन्क्रिप्ट करने के लिए करता है।

.NET
// dotnet add package Authagonal.Bff
builder.Services.AddAuthagonalBff(o =>
{
    o.Authority    = "https://acme.authagonal.io";       // your tenant auth host
    o.ClientId     = builder.Configuration["Bff:ClientId"]!;
    o.ClientSecret = builder.Configuration["Bff:ClientSecret"]!;
    o.Scope        = ["openid", "profile", "email", "offline_access"];
    o.PostLogoutRedirectUri = "https://app.acme.com/";
});

// Trust X-Forwarded-Proto from your ingress. With no options, UseForwardedHeaders() changes nothing.
builder.Services.Configure<ForwardedHeadersOptions>(o =>
{
    o.ForwardedHeaders = ForwardedHeaders.XForwardedProto;
    o.KnownNetworks.Clear();
    o.KnownProxies.Clear();
});

var app = builder.Build();

app.UseForwardedHeaders();   // required behind a proxy or ingress, see the note below
app.MapAuthagonalBff();
app.MapFallbackToFile("index.html");   // your SPA
app.Run();
Node (Express)
// npm install @authagonal/bff
import express from 'express';
import { authagonalBff } from '@authagonal/bff/express';

const app = express();

app.use(authagonalBff({
  authority: 'https://acme.authagonal.io',
  clientId: process.env.BFF_CLIENT_ID,
  clientSecret: process.env.BFF_CLIENT_SECRET,
  cookieSecret: process.env.BFF_COOKIE_SECRET,   // encrypts the session and login cookies
  scope: ['openid', 'profile', 'email', 'offline_access'],
  postLogoutRedirectUri: 'https://app.acme.com/',
}));

app.listen(8080);

प्रॉक्सी के पीछे, forwarded हेडर पर भरोसा करें

लगभग हर deployment में BFF किसी ingress या load balancer के पीछे रहता है, जो TLS समाप्त करता है और आपकी प्रोसेस से सादे HTTP में बात करता है। forwarded-header हैंडलिंग के बिना BFF यह मान लेता है कि अनुरोध असुरक्षित है और अपनी __Host- सेशन कुकी को Secure एट्रिब्यूट के बिना भेजता है, जिसे ब्राउज़र फिर चुपचाप हटा देते हैं। लक्षण यह होता है कि लॉगिन साफ़-सुथरे ढंग से पूरा होता है और सेशन कभी दिखाई नहीं देता। .NET में ForwardedHeadersOptions में XForwardedProto सक्षम करें और ऊपर की तरह MapAuthagonalBff() से पहले app.UseForwardedHeaders() कॉल करें: बिना विकल्पों वाला कॉल किसी भी हेडर पर भरोसा नहीं करता। Node अडैप्टर X-Forwarded-Proto खुद पढ़ते हैं और __Host- कुकी को हमेशा Secure चिह्नित करते हैं; अपने फ़्रेमवर्क की trust-proxy सेटिंग सेट करें ताकि आपके API को अग्रेषित क्लाइंट पता असली हो।

एंडपॉइंट्स

डिफ़ॉल्ट रूप से /bff के अंतर्गत माउंट होते हैं। इन्हें आपके SPA के समान ओरिजिन से सर्व किया जाना चाहिए, क्योंकि सेशन कुकी httpOnly और same-origin है: इन्हें किसी अलग API डोमेन के बजाय उसी hostname के पीछे रखें।

रूटउद्देश्य
GET /bff/login?returnUrl=/लॉगिन शुरू करता है और Authagonal पर रीडायरेक्ट करता है। उसके बाद उपयोगकर्ता को returnUrl पर वापस भेजता है।
GET /bff/callbackOIDC redirect URI। यह आपके लिए संभाला जाता है; इसे आपको कभी लिखना नहीं पड़ता।
GET /bff/userisAuthenticated, सेशन क्लेम्स, और sessionExpiresAt लौटाता है। इसके लिए anti-forgery हेडर आवश्यक है।
GET|POST /bff/logoutसेशन को स्थानीय रूप से और Authagonal पर, दोनों जगह समाप्त करता है।
POST /bff/backchannel-logoutAuthagonal से logout सूचनाएँ प्राप्त करता है, ताकि कहीं और किया गया sign-out इस सेशन को भी समाप्त कर दे।

ब्राउज़र से

हर non-navigation अनुरोध में एक स्थिर anti-forgery हेडर होना चाहिए। यह कुकी के SameSite एट्रिब्यूट के साथ मिलकर cross-site request forgery से बचाव करता है: कोई cross-site form post कस्टम हेडर सेट नहीं कर सकता, इसलिए उसके बिना आया अनुरोध अस्वीकार कर दिया जाता है।

यह जाँचना कि कौन साइन इन है
const me = await fetch('/bff/user', {
  headers: { 'X-Authagonal-Bff': '1' },
}).then(r => r.json());

if (!me.isAuthenticated) {
  // Navigate, do not fetch: this is a redirect to your identity provider.
  window.location.href = '/bff/login?returnUrl=' + encodeURIComponent(location.pathname);
}

लॉगिन और लॉगआउट नेविगेट करके करें, fetch करके नहीं: location.href = '/bff/login'। वे रूट आपके आइडेंटिटी प्रोवाइडर पर रीडायरेक्ट के साथ जवाब देते हैं, और रीडायरेक्ट की ऐसी श्रृंखला को fetch उपयोगी ढंग से फ़ॉलो नहीं कर सकता।

अपनी API को कॉल करना

BFF आपकी API को अपने base path के अंतर्गत फ़ॉरवर्ड कर सकता है और रास्ते में सेशन का एक्सेस टोकन जोड़ सकता है। ब्राउज़र एक कुकी भेजता है, आपकी API को एक bearer टोकन मिलता है जिसे वह सामान्य ढंग से मान्य करती है, और उस टोकन के बारे में कुछ भी पेज को दिखाई नहीं देता और न ही पेज उसे गढ़ सकता है। एक upstream रजिस्टर करें, और /bff/api/** पर आने वाले अनुरोध प्रमाणीकृत होकर उस तक पहुँचते हैं। सूची खाली छोड़ दें, तो प्रॉक्सी पूरी तरह अक्षम रहती है।

किसी upstream API को फ़ॉरवर्ड करना
o.Upstreams.Add(new BffUpstream
{
    Prefix        = "/orders",                        // matches /bff/api/orders/**
    TargetBaseUrl = "https://api.internal.acme.com",
    StripPrefix   = false,                            // keep /orders in the forwarded path
});
विकल्पडिफ़ॉल्टयह क्या करता है
Upstreams[]वे APIs जिन पर प्रॉक्सी फ़ॉरवर्ड करती है। खाली रहने पर प्रॉक्सी एंडपॉइंट अक्षम हो जाता है।
Prefix//bff/api के बाद वह path प्रीफ़िक्स जिसे यह upstream संभालता है, उदाहरण के लिए /orders।
TargetBaseUrl-वह base URL जिस पर अनुरोध फ़ॉरवर्ड किए जाते हैं।
StripPrefixfalseफ़ॉरवर्ड करने से पहले मेल खाए प्रीफ़िक्स को हटा दें। इससे आप एक कृत्रिम routing प्रीफ़िक्स का उपयोग करके एक ही BFF को कई ऐसे बैकएंड तक फैला सकते हैं जो एक ही path namespace साझा करते हैं।
AllowAnonymousProxyRequestsfalseजिस अनुरोध के पास उपयोग करने योग्य सेशन नहीं है, उसे अस्वीकार करने के बजाय Authorization हेडर के बिना फ़ॉरवर्ड करें। यह उस API के लिए है जो साइन-इन और अनाम, दोनों तरह के कॉलर्स को सर्व करती है।
RequiredAuthority[]type:action जोड़ों के रूप में एक authority गेट, उदाहरण के लिए email:send। सेट होने पर, प्रॉक्सी फ़ॉरवर्ड करने से पहले बाहर जाने वाले टोकन के RFC 9396 authorization details जाँचती है।
AuthorityLocation-वह RFC 9396 locations रूट जिससे यह upstream जाना जाता है, तब जब authority किसी ऐसे सार्वजनिक resource identifier के विरुद्ध दी गई हो जो प्रॉक्सी द्वारा कॉल किए जाने वाले आंतरिक पते से अलग है।
StrictAuthorityfalseऐसे कॉल को फ़ॉरवर्ड करने के बजाय अस्वीकार करें जिसमें ऐसी grant constraint हो जिसका मूल्यांकन प्रॉक्सी नहीं कर सकती। प्रॉक्सी बिना देखे फ़ॉरवर्ड करती है और कोई constraint संदर्भ नहीं निकालती, इसलिए यह डिफ़ॉल्ट रूप से बंद है।
ExchangeRoutes[]वे प्रॉक्सी रूट जिनके upstream कॉल, सेशन के प्राथमिक एक्सेस टोकन के बजाय एक context-bound exchanged टोकन पर चलते हैं। पहला मेल खाने वाला पैटर्न लागू होता है।

WebSockets

एक WebSocket handshake कोई कस्टम हेडर या bearer टोकन नहीं ले जा सकता, इसलिए न anti-forgery हेडर काम आता है और न प्रॉक्सी। tickets सक्षम करें, और फिर SPA GET /bff/ws-ticket कॉल कर सकता है, अल्पकालिक single-use ticket को connect URL पर रख सकता है, और आपकी API उसे भुना सकती है। हर connect से ठीक पहले एक ticket बनाएँ: यह पहले ही उपयोग पर हट जाता है और कुछ सेकंड में समाप्त हो जाता है।

विकल्पडिफ़ॉल्टयह क्या करता है
WsTicketsEnabledfalsews-ticket एंडपॉइंट सक्षम करता है। डिफ़ॉल्ट रूप से बंद।
WsTicketLifetime30sएक ticket कितने समय तक मान्य रहता है। इसे जानबूझकर छोटा रखा गया है, क्योंकि यह URL में यात्रा करता है।
TicketExchangeParams[]वे query parameters जिन्हें कोई ticket अनुरोध किसी token exchange में फ़ॉरवर्ड कर सकता है, ताकि ticket हर चीज़ के लिए मान्य होने के बजाय उसी संदर्भ से बँधा रहे।

ब्राउज़र को टोकन सौंपना, वह भी जानबूझकर

BFF का पूरा मक़सद ही यह है कि ब्राउज़र कोई टोकन न रखे, इसलिए यह opt-in है और बहुत सीमित है। यह उस एक स्थिति के लिए मौजूद है जहाँ कुकी मॉडल नहीं पहुँच सकता: किसी दूसरे ओरिजिन पर मौजूद एक resource server, जैसे कोई ऐप जिसे आप iframe में एम्बेड करते हैं, जिसे bearer के साथ कॉल करना ज़रूरी हो। सक्षम होने पर, GET /bff/token?resource=… एक exchanged टोकन लौटाता है: सेशन का टोकन, जिसे अनुमति-सूची में शामिल एक ही resource तक सीमित किया गया है और किसी भी अनुमति-सूची वाले context parameter से बाँधा गया है। ब्राउज़र सेशन का अपना टोकन कभी नहीं देखता, और उसे जो मिलता है वह अल्पकालिक तथा एकल-audience वाला होता है। अनुमति-सूची से बाहर के resource का नाम लेने वाला अनुरोध अस्वीकार कर दिया जाता है, और यही इसे सर्वसामान्य टोकन-मिंट बनने से रोकता है।

विकल्पडिफ़ॉल्टयह क्या करता है
TokenEndpointEnabledfalsetoken एंडपॉइंट सक्षम करता है। डिफ़ॉल्ट रूप से बंद।
TokenEndpointResources[]वे resource मान जिनके लिए कोई टोकन जारी किया जा सकता है। बाकी कुछ भी अस्वीकार कर दिया जाता है।
TokenEndpointExchangeParams[]वे query parameters जो context bindings के रूप में exchange में फ़ॉरवर्ड किए जाते हैं, उदाहरण के लिए project_id।

एक ही BFF से कई टेनेंट्स को सर्व करना

एक tenant query parameter सेट करें और फिर एक ही deployment कई टेनेंट्स को सर्व करता है: /bff/login?slug=acme टेनेंट चुनता है, एक resolver उस टेनेंट का authority और client credentials देता है, key correlation कुकी के साथ सेशन तक पहुँचती है, और back-channel logout टेनेंट को टोकन के issuer से हल करता है। डिफ़ॉल्ट resolver, single-tenant व्यवहार को byte के स्तर तक अपरिवर्तित रखता है, इसलिए जब तक आप इसका उपयोग नहीं करते, इसकी कोई क़ीमत नहीं चुकानी पड़ती।

एक से अधिक इंस्टेंस चलाना

सेशन IBffSessionStore के पीछे रहते हैं, जो डिफ़ॉल्ट रूप से एक in-process कैश होता है। एक ही इंस्टेंस के लिए यह ठीक है और कई इंस्टेंस के लिए ग़लत: जिस उपयोगकर्ता का अगला अनुरोध किसी दूसरे रेप्लिका पर पहुँचता है, वह साइन आउट हो जाता है। BFF जोड़ने से पहले एक साझा स्टोर रजिस्टर करें, उदाहरण के लिए IDistributedCache के माध्यम से Redis।

अकेला साझा स्टोर पर्याप्त नहीं है

आपको एक cross-replica रिफ़्रेश लॉक की भी ज़रूरत है। रिफ़्रेश का single-flight केवल प्रोसेस तक सीमित रहता है, जबकि सेशन और उसका rotating रिफ़्रेश टोकन उस स्टोर में रहते हैं जिसे हर रेप्लिका साझा करता है। दो रेप्लिका एक ही सेशन पढ़ सकते हैं, दोनों तय कर सकते हैं कि उसे रिफ़्रेश की ज़रूरत है, और दोनों एक ही रिफ़्रेश टोकन भुना सकते हैं। इसे चुराए गए टोकन के replay से अलग नहीं पहचाना जा सकता, और replay का सही जवाब पूरे grant family को रद्द करना है, इसलिए बिना लॉक वाला multi-instance BFF रोज़मर्रा की बात के तौर पर उपयोगकर्ताओं को साइन आउट कर सकता है। इसे दोनों में से किसी भी तरीके से दिया जा सकता है: क्लस्टरिंग के ज़रिए एक ILeaseProvider रजिस्टर करें, या अपने सेशन स्टोर पर IBffRefreshLockStore लागू करें, जो time to live वाला एक conditional write है और आप पहले से Redis चला रहे हों तो यही छोटा रास्ता है। जिस BFF का स्टोर साझा लगता है और जिसमें लॉक नहीं है, वह स्टार्टअप पर ही इसकी चेतावनी देता है, ताकि आपको यह किसी सपोर्ट टिकट से पता न चले।

जानने लायक विकल्प

पूरा सेट, .NET वाली वर्तनी में। Node पैकेज core विकल्पों को camelCase में लेता है, इसलिए BasePath वहाँ basePath है और SessionLifetime वहाँ sessionLifetimeSeconds है। PersistentCookie, CorrelationLifetime (Node में 15 मिनट पर स्थिर) और LoginPassthroughParams केवल .NET में हैं।

विकल्पडिफ़ॉल्टयह क्या करता है
Authority-आपका टेनेंट auth host। OIDC मेटाडेटा इसी से खोजा जाता है। यह आवश्यक है, सिवाय multi-tenant स्थिति के, जहाँ resolver इसे देता है।
ClientId-इस BFF के लिए पंजीकृत confidential client id।
ClientSecret-client secret। BFF एक confidential client है, इसलिए यह आवश्यक है।
Scopeopenid profile offline_accessअनुरोध किए गए scopes। offline_access शामिल करें, वरना कोई रिफ़्रेश टोकन नहीं होता और एक्सेस टोकन के समाप्त होते ही सेशन भी समाप्त हो जाते हैं।
BasePath/bffBFF के रूट कहाँ माउंट होते हैं।
CallbackPath/bff/callbackOIDC redirect URI का path। यह उसी से मेल खाना चाहिए जिसके साथ क्लाइंट पंजीकृत है।
CookieName__Host-agbffसेशन कुकी का नाम। __Host- प्रीफ़िक्स के लिए HTTPS आवश्यक है, इसलिए सादे HTTP पर लोकल डेवलपमेंट के लिए कोई दूसरा नाम चाहिए।
SessionLifetime8hएक सेशन कितने समय तक चल सकता है। इसे अपने रिफ़्रेश टोकन के absolute जीवनकाल के बराबर सेट करें, वरना निष्क्रिय उपयोगकर्ता तब साइन आउट हो जाता है जबकि उसके पास ऐसा क्रेडेंशियल होता है जो अब भी मान्य था।
PersistentCookiefalseब्राउज़र बंद करने के बाद कुकी बनी रहती है या नहीं। रिफ़्रेश टोकन दोनों ही स्थितियों में सर्वर साइड पर रहता है।
CorrelationLifetime30mलॉगिन शुरू होने से callback तक उसमें कितना समय लग सकता है। यह उस कुकी की सीमा तय करता है जो state, nonce और PKCE verifier ले जाती है, इसलिए जो उपयोगकर्ता लॉगिन स्क्रीन खुली छोड़कर बाद में लौटता है, यही वह स्थिति है जिसे इसे झेलना होता है।
RefreshThresholdSeconds60समाप्ति से कितने सेकंड पहले एक्सेस टोकन रिफ़्रेश किया जाता है।
AntiForgeryHeaderX-Authagonal-Bffवह हेडर नाम जो ब्राउज़र को non-navigation अनुरोधों पर भेजना चाहिए।
PostLogoutRedirectUri-logout पूरा होने के बाद ब्राउज़र कहाँ पहुँचता है।
ReturnUrlAllowlist[]वे absolute ओरिजिन्स जिन्हें कोई non-relative returnUrl लक्ष्य बना सकता है। relative path हमेशा अनुमत हैं और बाकी सब कुछ / पर बदल दिया जाता है, इसलिए लॉगिन रूट के ज़रिए कोई open redirect संभव नहीं है।
LoginPassthroughParams[]वे query parameters जो /bff/login से authorize अनुरोध तक फ़ॉरवर्ड किए जाते हैं, उदाहरण के लिए prompt, ताकि get-started लिंक साइन-इन के बजाय पंजीकरण पर भेज सके।
TenantQueryParam-एक ही BFF से कई टेनेंट्स को सर्व करने के लिए इसे सेट करें। ऊपर देखें।

दोनों रनटाइम एक जैसा व्यवहार करते हैं

.NET और Node पैकेज एक ही core protocol contract लागू करते हैं, इसलिए login, callback, user, logout और back-channel logout, कुकी, anti-forgery हेडर, रिफ़्रेश व्यवहार और बुनियादी upstream proxy एक जैसे हैं। WebSocket tickets, token endpoint, exchange routes, StripPrefix, authority gates और anonymous proxying केवल .NET में हैं। ऊपर दिए गए नाम .NET वाली वर्तनी हैं; Node उनके camelCase समकक्ष उपयोग करता है।

हर हिस्सा बदला जा सकता है

इसके हिस्से interfaces हैं, इसलिए आप BFF को fork किए बिना अपने इन्फ्रास्ट्रक्चर पर ले जा सकते हैं: IBffSessionStore तय करता है कि सेशन कहाँ रहते हैं, ICookieProtector कुकी एन्क्रिप्शन के लिए है (डिफ़ॉल्ट रूप से ASP.NET Data Protection), और ITokenClient टोकन तथा revocation एंडपॉइंट्स से बात करने के लिए है। एक ही BFF, IBffTenantResolver के ज़रिए कई टेनेंट्स को भी सर्व कर सकता है: लॉगिन के समय टेनेंट को एक query parameter से चुनकर, और back-channel logout पर उसे टोकन के issuer से हल करके।

अपना पोर्टल किसी AI असिस्टेंट से चलाएँ

किसी AI असिस्टेंट को अपने टेनेंट से जोड़ें और उससे वही काम कराएँ जो आप वरना खुद क्लिक करके करते: ऐसा उपयोगकर्ता ढूँढ़ना जो साइन इन नहीं कर पा रहा, यह जाँचना कि उसके पास अब भी दूसरा फ़ैक्टर है या नहीं, किसी को आमंत्रित करना, यह देखना कि admin भूमिका किसके पास है।

यह एक सामान्य OAuth कनेक्शन है, API key नहीं। हर व्यक्ति खुद के रूप में साइन इन करता है और एक्सेस को स्वीकृति देता है, इसलिए असिस्टेंट ठीक वही कर सकता है जो वह व्यक्ति पोर्टल में कर सकता है, उससे ज़्यादा कुछ नहीं। ऐसा कुछ भी नया नहीं बनता जो लीक हो सके, और किसी एक असिस्टेंट को रद्द करने से बाकी सब अछूते रहते हैं।

इसे चालू करना

सेटिंग्स खोलें और AI असिस्टेंट एक्सेस चालू करें। जब तक आप ऐसा नहीं करते यह बंद रहता है, और बंद रहने पर एंडपॉइंट केवल मना नहीं करता, वह होता ही नहीं। चालू करते ही पैनल वह URL दिखाता है जिसे आपको अपने AI क्लाइंट में चिपकाना है:

आपका MCP URL
https://portal-api.authagonal.io/api/v1/mcp/{your-tenant}

असिस्टेंट को अनुमति कैसे मिलती है

साइन-इन शुरू करने से पहले असिस्टेंट खुद को पंजीकृत करता है, और इसकी इजाज़त AI असिस्टेंट एक्सेस चालू करने से ही मिलती है। इसके लिए आपको और कुछ भी चालू करने की ज़रूरत नहीं है, और खास तौर पर अपने एंड-यूज़र टेनेंट पर डायनामिक क्लाइंट रजिस्ट्रेशन चालू नहीं करना चाहिए: वह सेटिंग उस टेनेंट के लिए है जो आपके अपने उपयोगकर्ताओं को सेवा देता है, और असिस्टेंट वहाँ साइन इन करता ही नहीं। पंजीकृत हो जाना एक्सेस मिल जाना नहीं है। नया पंजीकृत असिस्टेंट तब तक कुछ भी अपने पास नहीं रखता जब तक आपकी टीम का कोई व्यक्ति साइन इन करके उसे स्वीकृति नहीं देता, और उसके बाद हर टूल उसी व्यक्ति की भूमिका फिर से जाँचता है।

असिस्टेंट क्या कर सकता है

ठीक वही जो उसे जोड़ने वाला व्यक्ति कर सकता है, और यह हर कॉल पर उसी के अपने टोकन के आधार पर तय होता है। tenant:support एजेंट को डायग्नोस्टिक और रोज़मर्रा के टूल मिलते हैं; admin टूल उससे केवल छिपाए नहीं जाते, सीधे नाम लेने पर भी मना कर दिए जाते हैं। पोर्टल के भीतर जो कुछ भी प्रतिबंधित है वह प्रतिबंधित ही रहता है: किसी उपयोगकर्ता का ईमेल पता बदलने के लिए वहाँ admin भूमिका चाहिए, और यहाँ भी वही चाहिए।

चूँकि यह एक सामान्य ग्रांट है, आप इसे सामान्य तरीके से ही प्रबंधित करते हैं: अपने खाते के अधिकृत ऐप्स पेज पर असिस्टेंट को हटाएँ और वह अब refresh नहीं कर सकता, इसलिए उसका वर्तमान access टोकन समाप्त होने पर वह काम करना बंद कर देता है। असिस्टेंट द्वारा किया गया हर बदलाव आपके ऑडिट लॉग में उसी व्यक्ति के नाम से दर्ज होता है जिसकी ओर से उसने काम किया, इसलिए ट्रेल वही है जिसे आप पहले से पढ़ते आए हैं।

टूल

इस रिलीज़ में तैंतीस। कौन-से चालू करने हैं यह आपका AI क्लाइंट तय करता है, इसलिए यदि आप असिस्टेंट से सिर्फ़ पढ़ने का काम कराना चाहते हैं तो उसे केवल पढ़ने वाले टूल दे सकते हैं।

टूलभूमिकायह क्या करता है
find_userसपोर्टईमेल, नाम के उपसर्ग या id से उपयोगकर्ता खोजें। बाकी सब चीज़ों का शुरुआती बिंदु।
get_userसपोर्टएक उपयोगकर्ता का पूरा विवरण, इसमें यह भी कि वह सक्रिय है, पुष्ट है और लॉक आउट है या नहीं।
get_user_mfaसपोर्टकिसी ने कौन-से दूसरे फ़ैक्टर नामांकित किए हैं।
get_user_sessionsसपोर्टउपयोगकर्ता इस समय कहाँ-कहाँ साइन इन है।
search_auditसपोर्टऑडिट लॉग को एक्टर, क्रिया या जिस चीज़ पर कार्रवाई हुई उसके आधार पर खोजें।
list_usersसपोर्टडायरेक्ट्री की सूची दें, चाहें तो किसी एक संगठन तक सीमित करके।
get_user_statsसपोर्टआपके पास कितने उपयोगकर्ता हैं और उनमें से कितने दूसरा फ़ैक्टर इस्तेमाल करते हैं।
invite_userसपोर्टईमेल से किसी को आमंत्रित करें।
resend_inviteसपोर्टआमंत्रण दोबारा भेजें।
send_verification_emailसपोर्टईमेल सत्यापन का संदेश दोबारा भेजें।
update_userसपोर्टप्रोफ़ाइल अपडेट करें। ईमेल पता बदलने के लिए अब भी admin चाहिए।
revoke_user_sessionsसपोर्टउपयोगकर्ता को हर जगह से साइन आउट करें।
list_rolesएडमिनआपके टेनेंट में परिभाषित भूमिकाएँ।
list_role_membersएडमिनकोई दी गई भूमिका किसके पास है।
assign_roleएडमिनकिसी उपयोगकर्ता को भूमिका दें।
unassign_roleएडमिनभूमिका वापस लें।
reset_user_mfaएडमिनहर दूसरा फ़ैक्टर हटाएँ, उस व्यक्ति के लिए जिसका authenticator खो गया है।
get_settingsएडमिनआपके टेनेंट का कॉन्फ़िगरेशन।
list_sso_connectionsएडमिनआपके SSO कनेक्शन और वे डोमेन जिन्हें वे कवर करते हैं।
list_organizationsएडमिनआपके टेनेंट के संगठन, एक बार में एक पृष्ठ।
get_organizationएडमिनआईडी या स्लग से एक संगठन, उसके ईमेल डोमेन सहित।
create_organizationएडमिनएक संगठन बनाता है। स्लग स्थायी है।
update_organizationएडमिनकिसी संगठन का नाम, नीति विकल्प, मेटाडेटा या ब्रांडिंग बदलता है। स्लग नहीं बदला जा सकता।
delete_organizationएडमिनकिसी संगठन को उसकी सभी सदस्यताओं सहित हटाता है।
list_organization_membersएडमिनकिसी संगठन के सदस्य, एक बार में एक पृष्ठ।
add_organization_memberएडमिनकिसी संगठन में एक उपयोगकर्ता जोड़ता है।
update_organization_memberएडमिनकिसी संगठन में किसी सदस्य की स्थिति या भूमिकाएँ बदलता है।
remove_organization_memberएडमिनकिसी संगठन से एक उपयोगकर्ता को हटाता है।
add_organization_domainएडमिनकिसी संगठन के लिए एक ईमेल डोमेन पर दावा करता है। प्रकाशित किया जाने वाला DNS TXT रिकॉर्ड लौटाता है।
verify_organization_domainएडमिनTXT रिकॉर्ड जाँचता है और डोमेन को सत्यापित चिह्नित करता है। दोहराना सुरक्षित है।
remove_organization_domainएडमिनकिसी डोमेन का दावा छोड़ देता है। मौजूदा सदस्य बने रहते हैं।
list_user_organizationsएडमिनवे संगठन जिनका कोई उपयोगकर्ता सदस्य है, हर एक में उसकी स्थिति और भूमिकाओं सहित।
list_clientsडेवलपरआपके टेनेंट में पंजीकृत OAuth क्लाइंट्स।

पढ़ने वाले और लिखने वाले टूल चिह्नित हैं

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

अभी क्या शामिल नहीं है

उपयोगकर्ताओं को हटाना, SSO कनेक्शन बनाना या संपादित करना, बिलिंग, बैकअप और client सीक्रेट्स, ये सब इस रिलीज़ में नहीं हैं। हटाने का काम आपकी डेटा-मिटाने की कतार के साथ का है, उसके बगल में नहीं; SSO कनेक्शन इतना बड़ा है कि एक गलत संपादन पूरे कार्यबल को बाहर कर देता है, इसलिए वे फ़िलहाल केवल पढ़ने के लिए हैं; और जो टूल client सीक्रेट लौटाए वह उसे असिस्टेंट के ट्रांसक्रिप्ट में डाल देगा। हमें बताइए कि इनमें से आपको कौन-सा चाहिए और किस क्रम में।

MCP सर्वर प्रमाणीकरण

यदि आप कोई Model Context Protocol सर्वर एक्सपोज़ करते हैं, तो Authagonal उसके पीछे ऑथराइज़ेशन सर्वर बन सकता है। एक AI असिस्टेंट कनेक्ट करता है, उसके पीछे मौजूद व्यक्ति साइन इन करके एक्सेस देता है, और आपके सर्वर को एक सामान्य bearer टोकन मिलता है जिसे आप किसी भी दूसरे API की तरह वैलिडेट करते हैं।

इसका विकल्प है असिस्टेंट के कॉन्फ़िगरेशन में चिपकाई गई एक API key, जो ऐसा क्रेडेंशियल है जिसके पीछे कोई उपयोगकर्ता नहीं होता, जिसकी कोई समाप्ति नहीं होती, जिसमें कोई सहमति चरण नहीं होता, और जिसमें सबके लिए रोटेट किए बिना किसी एक कनेक्टर को रद्द करने का कोई तरीका नहीं होता। इसे OAuth के रूप में करने का मतलब है कि ग्रांट किसी नामित व्यक्ति का होता है, आपके ऑडिट लॉग में दिखता है, और बाकी किसी चीज़ को छुए बिना पोर्टल से रद्द किया जा सकता है।

कनेक्शन कैसे बनता है

पूरा आदान-प्रदान डिस्कवरी से चलता है, इसलिए स्पेसिफिकेशन का पालन करने वाले क्लाइंट को आपके सर्वर के URL के अलावा कुछ भी कॉन्फ़िगर करने की ज़रूरत नहीं होती।

चरणक्या होता है
1कनेक्टर बिना टोकन के आपके MCP सर्वर को कॉल करता है और उसे 401 मिलता है, जो बताता है कि कहाँ देखना है।
2वह आपका protected-resource मेटाडेटा लाता है, जो आपके Authagonal टेनेंट को ऑथराइज़ेशन सर्वर के रूप में नाम देता है।
3वह टेनेंट का ऑथराइज़ेशन-सर्वर मेटाडेटा लाता है और, कहीं भी पंजीकृत न होने के कारण, खुद को पंजीकृत कर लेता है।
4वह उपयोगकर्ता को साइन इन करने और एक्सेस स्वीकृत करने के लिए भेजता है, और आपके MCP सर्वर को उस resource के रूप में नाम देता है जिसके लिए उसे टोकन चाहिए।
5वह परिणामी bearer टोकन के साथ आपके सर्वर को दोबारा कॉल करता है, और वह टोकन आपके सर्वर तक तथा उसी उपयोगकर्ता तक सीमित होता है।

उस क्रम में कुछ भी Authagonal-विशिष्ट नहीं है: यह MCP authorization स्पेसिफिकेशन है, जो resource मेटाडेटा के लिए RFC 9728, ऑथराइज़ेशन सर्वर की डिस्कवरी के लिए RFC 8414, पंजीकरण के लिए RFC 7591 और resource का नाम देने के लिए RFC 8707 पर बना है। स्पेसिफिकेशन का पालन करने वाला कनेक्टर हमें विशेष मामला बनाए बिना काम करता है।

कनेक्टर्स को खुद को पंजीकृत करने दें

जिस कनेक्टर से आपका कभी सामना ही नहीं हुआ, वह हाथ से बनाए गए किसी क्लाइंट का उपयोग नहीं कर सकता, इसलिए वह रनटाइम पर एक क्लाइंट पंजीकृत करता है। यह डिफ़ॉल्ट रूप से बंद है। Settings में dynamic client registration चालू करें और पंजीकरण एंडपॉइंट आपके डिस्कवरी दस्तावेज़ में दिखने लगता है; इसे बंद छोड़ दें तो एंडपॉइंट का प्रचार नहीं होता और वह मना कर देता है। इसे सक्षम करने से पंजीकरण केवल आपके टेनेंट के लिए खुलता है, किसी और के लिए कभी नहीं।

सुरक्षा उपायक्या होता है
ग्रांट प्रकारकेवल authorization code और refresh फ़्लो पंजीकृत किए जा सकते हैं। स्व-पंजीकरण ऐसा मशीन-टू-मशीन क्लाइंट जारी नहीं कर सकता जो उपयोगकर्ता को पूरी तरह दरकिनार कर दे।
PKCEहर पंजीकृत क्लाइंट पर अनिवार्य, चाहे पंजीकरण में जो भी माँगा गया हो।
सहमतियह भी अनिवार्य है। कोई पंजीकृत कनेक्टर तब तक टोकन नहीं पा सकता जब तक कोई व्यक्ति यह देख न ले कि वह क्या माँग रहा है और उसे स्वीकृत न कर दे।
स्कोपOIDC के अंतर्निहित स्कोप हमेशा उपलब्ध रहते हैं। उनके अलावा, स्व-पंजीकरण करने वाला क्लाइंट केवल mcp नाम का स्कोप माँग सकता है, और केवल तभी जब आपका टेनेंट उसे बिना भूमिका प्रतिबंधों के परिभाषित करे। roles और groups को स्व-पंजीकरण से नहीं माँगा जा सकता।
रेट लिमिटप्रति IP पते प्रति घंटे दस पंजीकरण, ताकि किसी खुले एंडपॉइंट का उपयोग आपके client store को भरने के लिए न किया जा सके।

दोनों डिस्कवरी पथ उपलब्ध कराए जाते हैं

MCP क्लाइंट ऑथराइज़ेशन सर्वर को /.well-known/oauth-authorization-server (RFC 8414) के ज़रिए हल करते हैं, जबकि OIDC क्लाइंट /.well-known/openid-configuration का उपयोग करते हैं। आपका टेनेंट दोनों पर एक ही मेटाडेटा के साथ उत्तर देता है, इसलिए MCP स्पेसिफिकेशन का पालन करने वाले कनेक्टर को यह बताने की ज़रूरत नहीं पड़ती कि कहाँ देखना है, वह आपको खुद ढूँढ़ लेता है।

आपका MCP सर्वर क्या लागू करता है

दो छोटी चीज़ें, और उसके बाद यह एक सामान्य resource server है। पहला, protected-resource मेटाडेटा प्रकाशित करें जो आपके टेनेंट को ऑथराइज़ेशन सर्वर के रूप में नाम देता हो। इसे well-known पथ पर सर्व करें और, यदि आपका MCP एंडपॉइंट किसी सब-पाथ पर है, तो पाथ-सफ़िक्स वाले रूप में भी सर्व करें, क्योंकि क्लाइंट दोनों आज़माते हैं।

Protected-resource मेटाडेटा
GET https://your-app.example/.well-known/oauth-protected-resource

{
  "resource": "https://your-app.example/mcp",
  "authorization_servers": ["https://acme.authagonal.io"],
  "bearer_methods_supported": ["header"],
  "scopes_supported": ["mcp"]
}

दूसरा, जब कोई कॉल बिना वैध टोकन के आए, तो 401 के साथ उत्तर दें और उसमें एक WWW-Authenticate हेडर रखें जो उसी मेटाडेटा की ओर इशारा करता हो। यही हेडर इनकार को कनेक्शन में बदलता है: इसके बिना क्लाइंट के पास यह पता लगाने का कोई तरीका नहीं होता कि प्रमाणीकरण कहाँ करना है, और वह बस विफल हो जाता है।

टोकन का सत्यापन
// Validate the connector's token like any other resource server.
builder.Services.AddAuthentication().AddJwtBearer("McpBearer", o =>
{
    o.Authority = "https://acme.authagonal.io";              // your tenant
    o.TokenValidationParameters.ValidAudience = "https://your-app.example/mcp";
});

// Unauthenticated? Point the connector at the metadata rather than just refusing.
http.Response.Headers.WWWAuthenticate =
    "Bearer resource_metadata=\"https://your-app.example/.well-known/oauth-protected-resource\"";
return Results.Unauthorized();

audience जाँचें, सिर्फ़ सिग्नेचर नहीं

सत्यापित करें कि टोकन आपके सर्वर के लिए जारी किया गया था। कनेक्टर आपके MCP सर्वर को resource के रूप में नाम देता है, इसलिए टोकन का audience आपका resource URL होता है। ऐसा resource server जो केवल सिग्नेचर और जारीकर्ता जाँचता है, उसी टेनेंट में किसी दूसरे resource के लिए जारी किया गया टोकन भी स्वीकार कर लेगा, और इसी तरह एक कनेक्टर का एक्सेस दूसरे का बन जाता है।

स्कोप, प्लान और रद्दीकरण

अपने Scopes पेज पर बिना भूमिका प्रतिबंधों के mcp नाम का एक स्कोप परिभाषित करें, और स्व-पंजीकरण करने वाला कनेक्टर उसका अनुरोध कर सकता है; वह सहमति स्क्रीन पर दिखता है ताकि उपयोगकर्ता देख सके कि वह किसे स्वीकृति दे रहा है। टोकन का subject वह व्यक्ति है जिसने साइन इन किया, इसलिए आपका सर्वर हर कनेक्टर को एक जैसा मानने के बजाय यह तय कर सकता है कि यह विशेष व्यक्ति क्या कर सकता है। स्व-पंजीकृत कनेक्टर roles या groups स्कोप का अनुरोध नहीं कर सकता, इसलिए उन्हें टोकन में अपेक्षित करने के बजाय अपनी ओर से देखें।

चूँकि यह एक सामान्य OAuth ग्रांट है, रद्दीकरण भी सामान्य तरीके से काम करता है: उपयोगकर्ता अपने खाते के अधिकृत ऐप्स पेज पर कनेक्टर को हटाता है, जिससे उसका ग्रांट और refresh टोकन हट जाता है और वह नवीनीकरण नहीं कर सकता। उसके मौजूदा access टोकन /connect/introspect और /connect/userinfo द्वारा तुरंत अस्वीकार कर दिए जाते हैं; जो सर्वर JWT को केवल स्थानीय रूप से सत्यापित करता है, वह उसे समाप्त होने तक स्वीकार करता है। ऑडिट लॉग हर साइन-इन को उस क्लाइंट के साथ दर्ज करता है जिसके लिए वह था।

सेटिंगक्या होता है
Dynamic client registrationपोर्टल सेटिंग जो कनेक्टर्स को खुद को पंजीकृत करने देती है। डिफ़ॉल्ट रूप से बंद।
mcpOIDC के अंतर्निहित स्कोप से आगे का वह एकमात्र स्कोप जिसे स्व-पंजीकरण करने वाला क्लाइंट माँग सकता है। इसे प्रस्तुत करने के लिए इसे अपने टेनेंट में बिना भूमिका प्रतिबंधों के परिभाषित करें।
resourceवह पैरामीटर जो कनेक्टर आपके MCP सर्वर का नाम देने के लिए भेजता है, और जो टोकन के audience को उसी तक सीमित कर देता है।

एक कस्टम लॉगिन UI बनाएँ

Authagonal की होस्टेड login, registration, password-reset और MFA स्क्रीन को अपने स्वयं के UI से बदलें, जबकि Authagonal प्रमाणीकरण, MFA, SSO, सत्र और टोकन जारी करना संभालता रहे। दो मार्ग: हमारी React component library का उपयोग करें, या किसी भी framework से सीधे auth API कॉल करें। यह opt-in है: पहले सेटिंग्स → सेशन के अंतर्गत कस्टम लॉगिन UI सक्षम करें।

A fully customized hosted login page with a tenant logo, brand color, and support email in the footer

पूर्वापेक्षा: आपके root पर एक कस्टम डोमेन

login सत्र एक first-party cookie है, इसलिए आपके UI और Authagonal auth server को एक registrable डोमेन साझा करना होगा। एक कस्टम auth डोमेन को उसी root पर Authagonal की ओर इंगित करें जिस पर आपका ऐप चलता है — उदा. auth login.acme.com पर, ऐप app.acme.com पर। Custom login UI सेटिंग तब तक अक्षम रहती है जब तक एक सक्रिय कस्टम डोमेन मौजूद न हो।

आपका UIAuth hostकाम करता है?
app.acme.comlogin.acme.com✅ वही root
acme.comauth.acme.com✅ वही root
app.acme.comacme.authagonal.io❌ क्रॉस-साइट
myapp.iologin.acme.com❌ क्रॉस-साइट

एक कस्टम डोमेन क्यों आवश्यक है

एक क्रॉस-साइट सत्र कुकी एक third-party cookie होगी — जिसे ब्राउज़र (Safari, Chrome) चरणबद्ध रूप से समाप्त कर रहे हैं। auth को अपने स्वयं के root पर रखने से cookie first-party और भविष्य-सुरक्षित बन जाती है, और यही वह है जो प्लेटफ़ॉर्म लागू करता है: क्रॉस-ओरिजिन auth कॉल केवल उसी ओरिजिन से सम्मानित होते हैं जो auth host के root डोमेन को साझा करता है।

/api/auth कॉल के लिए किसी क्लाइंट CORS सेटिंग की आवश्यकता नहीं है: कस्टम लॉगिन UI चालू होने के बाद, आपके auth डोमेन वाले ही registrable domain पर कोई भी origin स्वचालित रूप से स्वीकार किया जाता है। अपने UI के ओरिजिन (उदा. https://app.acme.com) को क्लाइंट के अनुमत CORS Origins (क्लाइंट → URI) में केवल तभी जोड़ें जब ब्राउज़र टोकन exchange भी करता हो।

React: @authagonal/login

npm i @authagonal/login auth logic और UI को एक पैकेज के रूप में भेजता है — वही जिस पर Authagonal का होस्टेड login बना है। अपनी altitude चुनें:

  • पूर्ण ऐप — App को drop in करें और इसे branding के माध्यम से theme करें।
  • पेज compose करें — अपने स्वयं के layout के अंदर LoginPage, MfaChallengePage, ResetPasswordPage… का उपयोग करें।
  • Primitives + logic — AuthLayout/Button/Input और API client (login, mfaVerify, forgotPassword, …) के साथ अपनी स्वयं की स्क्रीन बनाएँ।
@authagonal/login API का उपयोग करने वाली एक कस्टम स्क्रीन
import { AuthLayout, Input, Button, login, ApiRequestError } from '@authagonal/login';

// returnUrl: the /connect/authorize URL your login page was opened with
function MyLogin({ returnUrl }: { returnUrl: string }) {
  async function onSubmit(email: string, password: string) {
    try {
      const res = await login(email, password, returnUrl);  // POST /api/auth/login (sets the session cookie)
      if (res.mfaRequired) {/* render your MFA step, then mfaVerify(res.challengeId!, 'totp', code) */}
      else if (res.mfaSetupRequired) {/* enrol first: mfaTotpSetup(res.setupToken) */}
      else window.location.href = returnUrl;                 // resume /connect/authorize
    } catch (e) {
      if (e instanceof ApiRequestError) {/* show e.message; e.error is the error code */}
    }
  }
  return <AuthLayout>{/* your own markup + <Input/> <Button/> */}</AuthLayout>;
}

कोई भी framework: auth API कॉल करें

React पर नहीं हैं? सीधे auth-flow एंडपॉइंट्स (/api/auth के अंतर्गत) कॉल करें, फिर मानक OIDC /connect/authorize प्रवाह को सौंप दें। credentials: 'include' भेजें ताकि सत्र कुकी संग्रहीत हो।

एंडपॉइंटउद्देश्य
POST /api/auth/loginप्रमाणित करें; mfaRequired या एक return URL लौटाता है
POST /api/auth/registerस्वयं-सेवा रजिस्ट्रेशन (जब सक्षम हो)
POST /api/auth/forgot-passwordएक पासवर्ड रीसेट शुरू करें
POST /api/auth/reset-passwordएक पासवर्ड रीसेट पूरा करें
GET /api/auth/password-policyPassword policy (नियमों को render करने के लिए)
POST /api/auth/mfa/*MFA सेटअप + सत्यापन (TOTP, WebAuthn, recovery)

credentials: 'include' का उपयोग करें

सत्र एक cookie है, इसलिए आपके fetches को क्रेडेंशियल भेजने होंगे। क्रॉस-ओरिजिन कॉल केवल तभी सफल होते हैं जब Custom login UI सक्षम हो और आपका ओरिजिन auth host के root डोमेन को साझा करता हो — अन्यथा वे 403 के साथ अस्वीकार कर दिए जाते हैं।
प्रमाणित करें, फिर OIDC को सौंप दें
# 1. Authenticate (browser fetch; credentials:'include' so the session cookie is stored)
curl -i -X POST https://login.acme.com/api/auth/login \
  -H "Content-Type: application/json" \
  -H "Origin: https://app.acme.com" \
  --data '{"email":"[email protected]","password":"..."}'
# (handle {"mfaRequired":true} → POST /api/auth/mfa/verify, then continue)

# 2. Hand off to the OAuth flow: top-level navigation to the authorize endpoint with PKCE:
# https://login.acme.com/connect/authorize?client_id=my-app&redirect_uri=...&response_type=code
#   &scope=openid%20profile%20email&code_challenge=...&code_challenge_method=S256
# The session cookie (same-site) authenticates the user; you get back a code → exchange at /connect/token.

एक टेनेंट, कई ग्राहक

एक integrator, एक टेनेंट और N ब्रांडेड ग्राहकों के लिए एक पैटर्न, जिनमें हर एक का अपना लॉगिन डोमेन और अपने उपयोगकर्ता हों, और हर ग्राहक के लिए अलग टेनेंट न बनाना पड़े। डिक्लेरेटिव प्रोविज़निंग और संगठन इसी को इंजीनियरिंग कार्य के बजाय कॉन्फ़िग बदलाव बनाने के लिए हैं।

संरचना

  • हर ग्राहक के लिए एक संगठन, एक ही टेनेंट के भीतर।
  • हर ग्राहक के लिए एक ब्रांडेड लॉगिन डोमेन, हर एक उस ग्राहक के संगठन से पिन किया हुआ। उस पर साइन इन करने से केवल उसी संगठन के लिए टोकन बन सकता है।
  • एप्लिकेशन भी प्रति ग्राहक होस्ट पर परोसा जाता है, सब एक ही डिप्लॉयमेंट से। ग्राहकों के बीच कोड, बिल्ड या इमेज में कुछ भी अलग नहीं होता।
  • Relying party अपनी authority उस होस्ट से चुनती है जिस पर वह चल रही है, बिल्ड-टाइम स्थिरांक से नहीं। वही bundle इस पर निर्भर करते हुए कि उसे किस ग्राहक के होस्ट ने परोसा, खुद को अलग लॉगिन डोमेन से जोड़ लेता है।

चरण दर चरण

ग्राहक को प्रोविज़न करें। नए संगठन और उसके डोमेन को नाम देने वाले spec के साथ डिक्लेरेटिव प्रोविज़निंग एंडपॉइंट को कॉल करें। कॉल idempotent और सेक्शन-स्कोप्ड है।

प्रोविज़निंग spec
{
  "organizations": [
    { "slug": "acme", "name": "Acme Pty Ltd" }
  ],
  "customDomains": [
    { "domain": "login.acme.example", "organizationSlug": "acme" }
  ]
}

ग्राहक के DNS को टेनेंट की ओर इंगित करें। ग्राहक के अपने ज़ोन से एक CNAME, जो नियंत्रण और इरादा दोनों साबित करता है। कोई TXT टोकन नहीं।

CNAME record
_authagonal-challenge.login.acme.example.  CNAME  <slug>.<platformDomain>.

प्लेटफ़ॉर्म जैसा ही Cloudflare अकाउंट?

रिकॉर्ड DNS-only (unproxied) होना चाहिए। एक ही अकाउंट के दो ज़ोन के बीच proxied CNAME प्लेटफ़ॉर्म के SaaS कस्टम होस्टनेम तक कभी नहीं पहुँचता। अलग अकाउंट के ग्राहक ज़ोन में गलत करने के लिए कोई proxy टॉगल ही नहीं होता।

एप्लिकेशन को ग्राहक के होस्ट की ओर इंगित करें। Relying party अपनी OIDC authority हर अनुरोध पर उस होस्ट से resolve करती है जिसे वह इस समय परोस रही है। ग्राहक मैप में जिस होस्ट की प्रविष्टि नहीं है, वह क्लासिक सिंगल-टेनेंट डेरिवेशन पर लौट जाता है, इसलिए ग्राहक जोड़ना पूरी तरह additive है।

oidc.ts
export function resolveCustomer(): { authority: string; clientId: string } {
  const cfg = getConfig();
  const customer = cfg.customers?.[window.location.host];
  if (customer) return customer;
  const baseDomain = cfg.baseDomain || window.location.hostname.replace(/^consumer\./, '');
  return { authority: `https://${cfg.tenantSlug}.${baseDomain}`, clientId: cfg.clientId };
}

क्लाइंट संगठन-विशिष्ट कुछ नहीं माँगता: कोई organization पैरामीटर नहीं, कोई प्रति-ग्राहक स्कोप नहीं। संगठन का चयन पूरी तरह डोमेन पिन सर्वर-साइड करता है, और इसी से "हर ग्राहक के लिए ऐप वही कोड है" सचमुच सच होता है।

ग्राहक क्या देखता है

लॉगिन पेज हर संगठन की अपनी ब्रांडिंग टेनेंट की ब्रांडिंग पर मर्ज करके दिखाता है। Branding override देखें। हर ग्राहक के पास दूसरों को छुए बिना अपना ऐप नाम, लोगो, रंग और सपोर्ट ईमेल हो सकता है।

ग्राहक A का जो उपयोगकर्ता ग्राहक B के होस्ट पर साइन इन करने की कोशिश करता है, उसे अस्वीकार किया जाता है और ग्राहक B का डेटा नहीं दिखाया जाता। टकराव कैसे हुआ, उसके आधार पर यह दो रूपों में से एक में होता है:

  • Relying party कुछ नहीं भेजती और बस पिन किए गए डोमेन पर पहुँच जाती है। पिन उपयोगकर्ता की ओर से संगठन उपलब्ध कराता है, चयन तब स्पष्ट हो जाता है, और B में सदस्यता न रखने वाले ग्राहक-A के उपयोगकर्ता को ठीक उसी बिंदु पर अस्वीकार किया जाता है जहाँ टोकन बनता।
  • Relying party खुद किसी दूसरे संगठन को नाम देती है। डोमेन-पिनिंग middleware इसे किसी भी लॉगिन पेज के दिखने से पहले सीधे 400 के साथ अस्वीकार कर देता है।

सदस्यता अस्वीकृति ऐप पर वापस redirect करती है

ऊपर का पहला रूप टूटा हुआ लॉगिन पेज नहीं है। यह relying party के अपने redirect_uri पर लौटने वाला सामान्य error=access_denied OIDC redirect है, जिसके विवरण में ठीक बताया जाता है कि कौन-सी संगठन सदस्यता गायब थी।

ग्राहक N+1 को ऑनबोर्ड करना

जब Terraform प्रोविज़निंग कॉल चलाता है, तब एक और ग्राहक को ऑनबोर्ड करना एक फ़ाइल का संपादन है: संगठन ऐरे में एक और प्रविष्टि, उसे पिन करने वाली एक और डोमेन प्रविष्टि, एक और DNS रिकॉर्ड। एप्लिकेशन, उसके डिप्लॉयमेंट या बिल्ड में कुछ नहीं बदलता। Host-based resolver नए ग्राहक को उसी क्षण पकड़ लेता है जब उसकी कॉन्फ़िग प्रविष्टि मौजूद होती है।

रेफ़रेंस इम्प्लीमेंटेशन

एक स्थायी dev टेनेंट पूरे पैटर्न को दो असली ग्राहक डोमेन पर एंड-टू-एंड चलाकर परखता है। इसके end-to-end टेस्ट सूट सदस्य प्रोविज़न करता है, ब्रांडिंग और org_id क्लेम जाँचता है, और ऊपर के दोनों अस्वीकृति रूपों की पुष्टि करता है। यह केवल विवरण नहीं, निष्पादन-योग्य दस्तावेज़ है।

इसे लोकल चलाएँ
cd e2e-consumer && DOMAIN=authagonal.dev npx playwright test organizations-domains

सूट बाकी हर spec की तरह डिफ़ॉल्ट रूप से चलता है। जिस एनवायरनमेंट में रेफ़रेंस डोमेन प्रोविज़न नहीं हैं, वहाँ इसे छोड़ा जा सकता है, क्योंकि यह सूट का एकमात्र spec है जो रेपो के अपने नियंत्रण से बाहर के इंफ्रास्ट्रक्चर पर निर्भर करता है।

प्लान और सीमाएँ

Authagonal एक Free प्लान और चार सशुल्क स्तर प्रदान करता है। हर प्लान में हर प्रमाणीकरण सुविधा शामिल है। प्लान Monthly Active User (MAU) सीमा और ओवरेज मूल्य निर्धारण में भिन्न होते हैं, और Free प्लान में केवल community support है, टेनेंट support desk के बिना।

प्लान स्तर

प्लानMAU सीमाओवरेजओवरेज लागत/उपयोगकर्ता
Free250नहीं—
Starter1,000नहीं—
Pro5,000हाँ$0.04/उपयोगकर्ता
Scale25,000हाँ$0.025/उपयोगकर्ता
Enterprise100,000हाँ$0.015/उपयोगकर्ता

Monthly Active Users (MAU)

Monthly Active User कोई भी अद्वितीय उपयोगकर्ता है जो किसी कैलेंडर माह (UTC) के दौरान कम से कम एक बार सफलतापूर्वक प्रमाणित होता है। SCIM के माध्यम से प्रोविज़न किए गए लेकिन लॉग इन न करने वाले उपयोगकर्ता आपके MAU कुल में नहीं गिने जाते।

ओवरेज: यदि आपका प्लान ओवरेज का समर्थन करता है (Pro और उससे ऊपर) और आपके टेनेंट के लिए ओवरेज सक्षम है (यह डिफ़ॉल्ट रूप से बंद होता है), तो MAU सीमा से अधिक उपयोगकर्ताओं को ऊपर दी गई प्लान तालिका में दिखाई गई प्रति-उपयोगकर्ता दर पर बिल किया जाता है। ओवरेज cap सीमा से ऊपर अनुमत अतिरिक्त उपयोगकर्ताओं की अधिकतम संख्या तय करता है।

प्रवर्तन: यदि आपका प्लान ओवरेज का समर्थन नहीं करता (Free, Starter) या ओवरेज सक्षम नहीं है, तो इस माह पहले ही साइन इन कर चुके उपयोगकर्ताओं की पहुँच हमेशा बनी रहती है। जब टेनेंट पहली बार अपनी सीमा पार करता है, तो 10 दिनों की grace अवधि शुरू होती है जिसके दौरान नए उपयोगकर्ता अभी भी साइन इन कर सकते हैं। उसके बाद, इस माह साइन इन न करने वाले उपयोगकर्ताओं को अगले माह तक या आपके अपग्रेड करने तक अस्वीकार कर दिया जाता है।

हर प्लान पर पूर्ण फ़ीचर सेट

सभी प्लान में पूर्ण फ़ीचर सेट शामिल है — SSO, SCIM, MFA, कस्टम डोमेन, ब्रांडिंग, webhooks, ऑडिट लॉग, और पोर्टल।