Design authentication for your Auth0 B2B SaaS application, using Universal Login, home realm discovery across Organizations, enterprise connections, and MFA to securely identify users from multiple customer tenants.
In order to provide services to your users, you must be able to identify who those users are. This process is called User Authentication. There are a number of ways to perform authentication of a user - via social media accounts, username and password, - and it’s often recommended that you go beyond a first factor for authenticating the user by enabling (MFA).
It’s important to consider both security and user experience when designing how you will authenticate your users. Providing for multiple primary factors, and/or enforcing more than one factor during authentication, are ways that you can provide both.
There are a number of things you will want to consider when looking at functionality and workflow:
Where will users enter their credentials?
How will you keep user credentials safe?
How will you maintain your authentication system?
How can you provide password authentication for your users?
How can you prevent hackers from trying to log in as your users?
How will you implement authentication in different kinds of applications?
How can you make login easy for your users when they come from different language backgrounds?
How will you provide a good user experience as you migrate away from any legacy authentication system?
What should you consider when integrating applications with Auth0?
Do you need to provide multi-factor authentication?
What do you do if you have a service that doesn’t have a way for the user to log in ahead of time?
Can you pass the same user from one API to another?
What do you do if you need to isolate users by organization?
How will you handle identifying which organization users belong to?
What’s the benefit of providing enterprise connections for your organizations?
Auth0 Universal Login provides users with a safe and secure experience - no matter whether you choose to provide for user ID/password credentials sign in, or allow the so-called Bring Your Own Identity scenarios provided via Social Login. There are also brand recognition benefits to centralizing the login experience with , even if you feel you will also have product-specific branding requirements. The Auth0 UI widgets typically used with Universal Login also provide out-of-the-box support with regards to internationalization for users with different language requirements, and out-of-the-box support for Auth0 features such as MFA and attack protection allow you to put barriers in place in order to prevent hackers attempting to access users’ accounts.Allowing users to sign in via user ID/password credentials means that you’re not reliant on the status of third-party for your users to access your system. You also have the means to require the credentials used to align with your corporate policies. Auth0 assists with this by providing you with multiple options in support of user ID/password logins, and the guidance provided will help you understand you can leverage these options. Adding social support at some stage, as an additional primary authentication factor, gives you added flexibility and can help you better understand your users without the need to question them further by leveraging the information already stored by the various social login providers.If you have an existing legacy identity store, you’ll also want to see User Migration. This section discusses the advantages of migrating to Auth0’s managed identity storage in terms of safety and security.For customer facing applications, Connect (OIDC) is the most frequently used industry standard protocol, and OIDC has first-class citizen support in Auth0. Auth0 provides support for various different approaches for integrating various different applications, so you’ll want to see the section on application integration for the information you’ll need to make an informed choice.When calling one API from another API, or from any situation where there is no authenticated user context - such as one or more cron jobs, report generators, or continuous integration/delivery systems - you will need a way to authorize the application instead of a user. This is a one step process where the application is authenticated (using a and secret) and then authorized in one call. You can learn more about this in our authorization work stream under machine-to-machine (m2m) authorization.Often companies need to segregate their users by organization and sometimes users can have access to more than one organization. Knowing which of these scenarios is relevant to your company will help define how to determine in which connection a user exists: whether you need to do it, when you need to do it, and how to accomplish it. See Home Realm Discovery to determine if this is something relevant to your company.
Do you have, or will you have, more than one application in your system? If the answer to this question is yes, then you will want a centralized sign in experience. To achieve a seamless (SSO) experience between multiple applications, it is critical to have a centralized location to redirect your users for authentication. This allows you a way to provide your users with a consistent experience if you add social authentication in the future, add third party applications to your system, or add multi-factor authentication as an option (or requirement) for your users - and also allow you to take advantage of new features for improving your users’ experience with little, if any, added development effort.
If you have more than one application, the best practice is to redirect to a centralized location to authenticate the user. With Auth0, this means taking advantage of Universal Login, which provides many security and user experience benefits out-of-the-box, including SSO.
Auth0 Universal Login makes authenticating users a short, easy process which can be accomplished in three easy steps (all of our Quickstarts demonstrate this and our SDKs hide the complexity for you too):
Home realm discovery (HRD) is the process of identifying which identity provider (or which connection in Auth0) the user belongs to before authenticating them. There are two ways HRD can occur:
Provide a way for the decision to be made at the application
Have Home Realm Discovery happen on the Universal Login page
Your system may need to do either or both methods so it is important to understand all approaches to HRD so that you can apply the one(s) that make the most sense to your applications.
A common way of determining which realm a user belongs to is when an application is branded for each organization. As part of this, an organization will typically have its own instance of the application, typically accessed via a different URL. This copy or instance can be physically isolated (running on a separate set of servers) or virtually isolated (running on shared servers) and is generally denoted through either a custom hostname (companyA.application1.yourcompany.com) or path (application1.yourcompany.com/companyA).
If your application already knows the specific connection (IdP) required then you can also pass that along when you redirect the user to /authorize, via use of the connection query parameter.
If this is the case for your application(s), then home realm discovery is a simple matter of storing the org_id with the organization-specific application configuration and sending that as the organization parameter when redirecting the user to Universal Login. Doing so will limit the user to that specific organization and its set of configured connections.
If an organization needs more than one IdP, then you may have to do a second round of Home Realm Discovery (once the organization has been identified). Auth0 will typically manage this for you if you are using the Organizations Feature.
If the user is shared between multiple organizations using a single identity, you must support Home Realm Discovery on the Universal Login Page. This will allow Universal Login to identify the user first and then present the realms appropriate for that user leading to a better user experience.Sending the organization and/or connection parameters can be achieved by adding them as a query parameter when you redirect the user to the /authorize endpoint. For more information, see the Authentication API docs. However, you will generally accomplish this using the SDK for whichever language your application is written in.
There are three main approaches to Home Realm Discovery:
Discover the realm through the user’s email subdomain.
Discover the realm by looking up a user identifier in some sort of map of an identifier to realm map.
Allow the user to choose or enter their realm (or organization).
In both of the first two approaches, you may consider doing “Identifier First Login”. This means that you present only the ability to enter an identifier first. After which, you collect the user’s identifier, and then, based on the identifier, you either automatically redirect the user or present a way for the user to enter their password if redirection is unnecessary. Auth0 provides implementation out of the box to take care of all of this, via the use of Universal Login.
Though it is possible to implement Identifier First Login or allow a user to select their organization at the application instead of on the Universal Login Page, this can add complexity with respect to single sign on as well as complexity associated with replicating that behavior in all of your applications. Instead Auth0 recommends implementing some form of HRD through Universal Login.
HRD through Universal Login using the email subdomain
The simplest way to implement home realm discovery on the universal login page is to utilize the email subdomain of the user’s identifier to map that to their Identity Provider. This, of course, only works in situations where the email subdomain will be a 1:1 mapping to an organization or at least to an Identity Provider.Auth0’s Lock widget or Universal Login can do this for you if you are using the domain map in an enterprise connection; however, if you want to build this yourself, you can, but it requires you to build a mapping of email subdomain to connection.Additionally, when using the Universal Login experience, the Organizations Feature will help you in two ways:
If you have not passed an org_id to /authorize when you initiated the login request, Auth0 will present the user with a prompt to enter the organization they belong to.
If the Organization has more than one IdP associated with it, Auth0 will present the user with buttons to choose the organization or a form to enter a username and password.
HRD through Universal Login using the Identifier to Realm Map
A second, more complex alternative is to store a map of identifiers to IdP and provide a public endpoint to access that information. Then on the Universal Login page, you can find the connection and redirect back to /authorize with the connection. The main drawbacks to this approach are latency and, more importantly, security when it comes to identifier discovery: if you’re using email addresses, this makes it much easier for someone to discover whether a particular email address is a user of yours.
Any public endpoint should have rate limiting applied to it to prevent hackers from using it to discover information and to prevent denial of service attacks.
The other option is to allow your users to choose from a list, if you don’t mind making public the list of organizations who use your product, or by allowing the user to enter their organization name explicitly. This would typically be done before redirecting the user to Universal Login. Once the user tells you which organization they belong to, you can redirect to Auth0 with the connection for that organization specified or have Auth0 simply prompt the user for their username and password if the connection is a database connection.
Nearly every B2C application provides the ability for its customers to create a new set of credentials. This is a common form of authentication that all users are familiar with.Username password authentication comes in multiple flavors at Auth0. If your application is a green-field application with no existing user base, then a simple Auth0 out-of-the-box Database Connection will give you everything you need to start authenticating your users. However, if you have a legacy user store (such as your own database of users or an existing LDAP system) you have a couple of different options for migrating your users as discussed in our guidance on User migration.However you end up provisioning the users for your database connection, the authentication of those users is quite similar. It requires you to present users with a form to enter their username and password. As mentioned in the guidance concerning Universal Login, the simplest and safest way to authenticate users with a username and password is to redirect them to a centralized login page and collect their username and password there. This allows Auth0 to determine whether they have already authenticated and skip the login form entirely when it’s not needed.
Collecting credentials only at the centralized login page will reduce the surface area for potential leak of user secrets. It will also reduce the need to collect credentials unnecessarily. See Universal Login for more information.
Once you’ve figured out how you want to authenticate your users, the next step is to determine how you will initiate that authentication. Each application will typically have its own starting point.
Native mobile applications (and desktop applications) should use the system browser for authentication, or they open themselves up to additional security risks. See Native Login for more information.
As discussed, we’ve found that most of our customers use OpenID Connect (OIDC) as the industry-standard protocol when it comes to their customer-facing applications. Figuring out which OIDC flow to use is your first task, and you will want to start by reviewing the our grant mapping guidance in the first instance.If you want to allow anonymous users access to any part of our application then you need to determine if you will be redirecting right away or prompting your users to redirect only when required (or perhaps some combination of both; see Redirect Users After Login for further discussion). If users can deep link to a protected version (or area) of your site then you will need to determine the links to your application that will result in an automatic redirect to Auth0.
It is important to consider the user experience when someone first comes to your application. If your application supports anonymous user access (quite common for eCommerce applications) there are different scenarios to consider:
Are they returning to the application after having already logged in, or
If this is the first time they are accessing the application:
Have they already accessed a different application that uses the same Auth0 tenant,
Have they ever (or perhaps not in a long time) authenticated on this device or browser.
When an anonymous user accesses your application, it can often be desirable for the application to discover if the user has already logged into a different application in the same family, or to remember this user even if the application is a SPA with no state. For example, if you can determine that the user is already logged in, you might decide to have the UI header in the application skip displaying a login button and instead have an account or profile menu for the user. To accomplish this you will want to utilize “silent authentication”. Silent authentication will allow you to check to see if the user is logged in without prompting them to log in if they are not. Then the application can present a login button if necessary. If the user is logged in already, however, then you will receive tokens and will not have to present the user with a login button again.
Checking for a login session by redirecting to Auth0 can be helpful for your application, but if this will result in a lot of requests, you should employ a throttling mechanism to avoid latency and/or rate limiting.Calls to the Management API are subject to Auth0 Rate Limiting policy. You must take this into consideration, and to assist, Auth0 generally recommends use of the appropriate Auth0 SDK for your development environment rather than calling our APIs directly.
There are a variety of reasons why someone might link directly to a particular page within your application that is only accessible by authenticated users. If this is possible for your application you should automatically redirect your user to Auth0 if they are not authenticated. Once they authenticate and the returns them to your application, you can redirect them to where they intended to go in the first place.
Most modern authentication frameworks support middleware for redirecting to an authorization server such as Auth0. When selecting one, here are some key considerations:
Support for confidential clients, non-confidential clients, or both
Authentication is the process of determining user identity. The result of authentication in an OIDC context is an . This token contains information about the user and should only be able to be obtained if the user authenticates using one or more factors as defined by the authorization server (the most common form being user ID and password). There are a few things you may also need to consider in addition to obtaining an ID Token:
Do we also need an Access Token in order to call a shared API?
Before you go live, you should ensure that only the grants that you are using for each application are enabled in your configuration for your Application.
If your SDK only supports the Authorization Code grant, or you need an Access Token or , then Authorization Code grant (with or without PKCE) can also be used to retrieve an ID Token. The Authorization Code grant includes an additional API call to exchange the code for a token which can result in additional unnecessary latency if all you need is the ID Token. In many cases the hybrid flow is implemented to provide optimum access to the ID Token while still leveraging Authorization Code grant workflow for the secure and safe retrieval of Access and Refresh Tokens.
While Auth0 supports the use of implicit grant for browser-based applications requiring only an ID Token, it is recommended to use authorization code grant with PKCE. For detailed information, see OAuth2 Implicit Grant and SPA on the Auth0 Blog.If you need a Refresh Token so that you can obtain a new Access Token or ID Token without having to re-authenticate the user, then you must use the authorization code grant.
The reason that authentication systems are important is to prevent from accessing applications and user data that they should not. We want to place as many barriers as possible between those bad actors and access to our systems. One of the easiest ways to do this is to ensure that your attack protection with Auth0 is configured correctly, so take a moment to read the guidance on this subject and ensure that it’s working correctly for you.
Anomaly detection is handled behind the scenes by Auth0 and provides a great security feature for your product. If you’re going to utilize it, ensure that you have set up your Email Provider and configured your Email Templates before turning on email delivery to your users.
In a large scale re-structure it’s not always possible—or practical—to update all your applications at once. In fact, our recommended best practice is to plan for an iterative-style approach when it comes to integrating with Auth0. If your applications already participate in Single Sign-on (SSO), and your legacy identity system supports protocols such as OIDC or , then you have a couple of options available if you want to continue to provide SSO as you integrate with Auth0:
Update your existing identity provider in your legacy SSO system to redirect to Auth0 for login (e.g., using SAML), or
Have Auth0 redirect to your legacy SSO system to login. This requires configuring your legacy system as an IdP in Auth0 (i.e., either using SAML or OIDC).
Supporting an SSO experience with your legacy system can add complexity, but may be worth it to generate a more seamless user experience as you integrate with Auth0. If you intend to go down this path, planning for it early can help ensure that it is possible to achieve. If you don’t already have SSO at a centralized service, then the complexity to add it will unlikely be worth the benefits.
This is a complex topic that will likely need some additional investigation depending on your current legacy architecture, and we recommend you only look into this if you currently have SSO support in your legacy system. Note: if you are currently redirecting from your applications to a centralized system to authenticate your users and that system only asks for credentials if you don’t already have a session with the centralized system, then you have a legacy SSO implementation.
The “bring your own identity” scenario has become a must-have for almost all B2B applications. Most enterprise companies expect to be able to integrate their IdP into your application so their employees don’t need to store another set of credentials. This is a valuable way of simplifying the user authentication experience without compromising security, and using Universal Login makes it easy to start adding support for Enterprise Connections with minimal disruption.
Once you start supporting enterprise connections for users, you must do some form of Home Realm Discovery so that you can determine which connection to send the user to for authentication.
With enterprise connection support, user identities and credentials are managed by the identity provider of your customers’ organization, as well as certain identity claims - which Auth0 will use to populate the user profile.
“Bring your own identity” is a great feature to provide, but if you don’t support this from day one, and sometimes even if you do, you may have an organization that wants to switch to their own IdP after already having used the application for a while. You will need a way to link user accounts to provide an effective way of associating the new identity with the old database identity.
In an era where misuse of user credentials is at an all-time high, protecting your systems when it’s so common for hackers to steal users identity information in general is a challenge. One of the most effective ways though is to provide users with the ability to configure a second factor for protecting their account. More commonly referred to as Multi-Factor Authentication. This will ensure that only a valid user can access their account, even if they use a username and password that may have been compromised from a different application.
It’s quite common for customer facing applications to provide users with an option for adding a second factor rather than forcing them to use a second factor. For more information regarding this, see providing your users with an option to add MFA.
Auth0 supports a number of different options when it comes to enabling MFA for protecting user account access, and there are several practices to ensure that you will truly be providing a flexible second factor barrier to access:
Auth0 Guardian: a service that provides both Push notification generation and an application for allowing or denying requests. Push sends notification to a user’s pre-registered device - typically a mobile or tablet - from which a user can immediately allow or deny account access via the simple press of a button.
Time-based One-Time Password (TOTP): allows you to register a device - such as Google Authenticator - that will generate a one-time password which changes over time and which can be entered as the second factor to validate a user’s account.
SMS: for sending a one-time code over SMS which the user is then prompted to enter before they can finish authenticating.
Voice: for delivering a one-time code through a phone call which the user is then prompted to enter before they can finish authenticating.
Duo: allows you to use your Duo account for multi-factor authentication.
Email: allows you to use your email account for multi-factor authentication.
Whilst MFA workflow using technologies such as Guardian or Google Authenticator is typically provided via a separate application that runs on a mobile or tablet device, if you don’t want your customers to have to download a separate application Auth0 also provides you with an SDK that you can use to build second factor workflow right in your existing mobile device application(s).
We provide planning guidance in PDF format that you can download and refer to for details about our recommended strategies.B2B IAM Project Planning Guide
Many B2B platforms implement some form of isolation and/or branding for their customers’ organization, and this can add complexity to any Identity and Access Management (IAM) system. If this applies to you, then we recommend you take some time to read through our guidance and best practice advice for this type of environment.Multiple Organization Architecture
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Auth0 Docs","description":"Auth0 documentation","colors":{"primary":"#9921FE","light":"#BC6DFF","dark":"#343434"},"logo":{"light":"https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/logo/light.svg","dark":"https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/logo/dark.svg","href":"https://auth0.com/docs/"},"favicon":"https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/logo/favicon.svg","api":{"params":{"post":["x-release-lifecycle"]},"playground":{"proxy":false},"url":"full"},"background":{"decoration":"gradient"},"seo":{"metatags":{"canonical":"https://auth0.com","og:image":"docs/images/share-image.png"}},"fonts":{"body":{"family":"Inter","source":"https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900\u0026display=swap","format":"woff2"}},"styling":{"eyebrows":"breadcrumbs","latex":true},"integrations":{"adobe":{"launchUrl":"https://assets.adobedtm.com/6bb3f7663515/7006851c9849/launch-af624fe9e34f.min.js"},"gtm":{"tagId":"GTM-W7FRLJ"},"heap":{"appId":"1279799279"},"onetrust":{"domainScript":"96e22fd8-d619-4cdd-a3c6-d51529d21faf","categoryId":"C0002","scriptSource":"https://cdn.cookielaw.org/scripttemplates/otSDKStub.js"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"navigation":{"languages":[{"language":"en","footer":{"socials":{"x-twitter":"https://x.com/auth0","github":"https://github.com/auth0","linkedin":"https://www.linkedin.com/company/auth0"},"links":[{"header":"Developers","items":[{"label":"Developer Hub","href":"https://developer.auth0.com"},{"label":"Code Samples \u0026 Guides","href":"https://developer.auth0.com/resources"},{"label":"Zero Index Newsletter","href":"https://auth0.com/blog/newsletter"},{"label":"Blog","href":"https://auth0.com/blog"},{"label":"Changelog","href":"https://auth0.com/changelog"}]},{"header":"Docs","items":[{"label":"Documentation","href":"https://auth0.com/docs"},{"label":"Quickstarts","href":"https://auth0.com/docs/quickstarts"},{"label":"APIs","href":"https://auth0.com/docs/api"},{"label":"SDK Libraries","href":"https://auth0.com/docs/libraries"},{"label":"Learn","href":"https://auth0.com/learn"},{"label":"Intro to IAM (CIAM)","href":"https://auth0.com/intro-to-iam"},{"label":"Reports","href":"https://auth0.com/resources/whitepapers"},{"label":"Webinars","href":"https://auth0.com/resources/webinars"}]},{"header":"Support Center","items":[{"label":"Community","href":"https://community.auth0.com"},{"label":"Help","href":"https://support.auth0.com"},{"label":"FAQs","href":"https://auth0.com/docs/troubleshoot"},{"label":"Auth0","href":"https://auth0.com"}]},{"header":"Company","items":[{"label":"Our Customers","href":"https://auth0.com/customers"},{"label":"Compliance","href":"https://auth0.com/security"},{"label":"Partners","href":"https://auth0.com/partners"},{"label":"Careers","href":"https://www.okta.com/company/careers"},{"label":"Okta + Auth0","href":"https://www.okta.com/okta-and-auth0"},{"label":"About us","href":"https://auth0.com/about"}]}]},"href":"docs/get-started"},{"language":"fr-ca","footer":{"socials":{"x-twitter":"https://x.com/auth0","github":"https://github.com/auth0","linkedin":"https://www.linkedin.com/company/auth0"},"links":[{"header":"Développeurs","items":[{"label":"Espace développeurs","href":"https://developer.auth0.com"},{"label":"Exemples de code et guides","href":"https://developer.auth0.com/resources"},{"label":"Infolettre Zero Index","href":"https://auth0.com/blog/newsletter"},{"label":"Blogue","href":"https://auth0.com/blog"},{"label":"Journal des modifications","href":"https://auth0.com/changelog"}]},{"header":"Documentation","items":[{"label":"Documentation","href":"https://auth0.com/docs"},{"label":"Guides de démarrage rapide","href":"https://auth0.com/docs/quickstarts"},{"label":"API","href":"https://auth0.com/docs/api"},{"label":"Bibliothèques SDK","href":"https://auth0.com/docs/libraries"},{"label":"Apprendre","href":"https://auth0.com/learn"},{"label":"Introduction à l’IAM (CIAM)","href":"https://auth0.com/intro-to-iam"},{"label":"Rapports","href":"https://auth0.com/resources/whitepapers"},{"label":"Webinaires","href":"https://auth0.com/resources/webinars"}]},{"header":"Centre d’assistance","items":[{"label":"Communauté","href":"https://community.auth0.com"},{"label":"Aide","href":"https://support.auth0.com"},{"label":"Foire aux questions","href":"https://auth0.com/docs/troubleshoot"},{"label":"Auth0","href":"https://auth0.com"}]},{"header":"Entreprise","items":[{"label":"Nos clients","href":"https://auth0.com/customers"},{"label":"Conformité","href":"https://auth0.com/security"},{"label":"Partenaires","href":"https://auth0.com/partners"},{"label":"Carrières","href":"https://www.okta.com/company/careers"},{"label":"Okta + Auth0","href":"https://www.okta.com/okta-and-auth0"},{"label":"À propos de nous","href":"https://auth0.com/about"}]}]},"href":"docs/fr-ca/get-started"},{"language":"ja-jp","footer":{"socials":{"x-twitter":"https://x.com/auth0","github":"https://github.com/auth0","linkedin":"https://www.linkedin.com/company/auth0"},"links":[{"header":"開発者向け","items":[{"label":"開発者ハブ","href":"https://developer.auth0.com"},{"label":"コードサンプルとガイド","href":"https://developer.auth0.com/resources"},{"label":"Zero Index Newsletter","href":"https://auth0.com/blog/newsletter"},{"label":"ブログ","href":"https://auth0.com/blog"},{"label":"変更履歴","href":"https://auth0.com/changelog"}]},{"header":"ドキュメント","items":[{"label":"ドキュメント","href":"https://auth0.com/docs"},{"label":"クイックスタート","href":"https://auth0.com/docs/quickstarts"},{"label":"API","href":"https://auth0.com/docs/api"},{"label":"SDKライブラリ","href":"https://auth0.com/docs/libraries"},{"label":"教育","href":"https://auth0.com/learn"},{"label":"IAM(CIAM)入門","href":"https://auth0.com/intro-to-iam"},{"label":"レポート","href":"https://auth0.com/resources/whitepapers"},{"label":"ウェビナー","href":"https://auth0.com/resources/webinars"}]},{"header":"サポートセンター","items":[{"label":"コミュニティ","href":"https://community.auth0.com"},{"label":"ヘルプ","href":"https://support.auth0.com"},{"label":"よくある質問","href":"https://auth0.com/docs/troubleshoot"},{"label":"Auth0","href":"https://auth0.com"}]},{"header":"会社情報","items":[{"label":"導入企業","href":"https://auth0.com/customers"},{"label":"コンプライアンス","href":"https://auth0.com/security"},{"label":"パートナー","href":"https://auth0.com/partners"},{"label":"採用情報","href":"https://www.okta.com/company/careers"},{"label":"Okta + Auth0","href":"https://www.okta.com/okta-and-auth0"},{"label":"私たちについて","href":"https://auth0.com/about"}]}]},"href":"docs/ja-jp/get-started"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"auth0","hasAudioNarration":false,"actualSubdomain":"auth0","customDomains":["auth0.com","auth0.auth0-mintlify.app"],"gitSource":{"type":"github","owner":"atko-cic","repo":"docs","deployBranch":"main","contentDirectory":"main","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae506a4412b6d5b4714ea9b","collectionId":"65dffb33-38b4-409d-b552-33027db4e651","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae506a4412b6d5b4714ea9b"},"feedback":{"thumbs":true,"contextualFeedback":{"textInputOnly":true,"allowEmail":false},"agentFeedback":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae506a4412b6d5b4714ea9b","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"fr-ca","tag":"Outils de développement","count":1040},{"language":"ja-jp","tag":"開発ツール","count":1040},{"language":"en","tag":"Dev Tools","count":838},{"language":"en","tag":"APIs","count":614},{"language":"fr-ca","tag":"API","count":608},{"language":"ja-jp","tag":"API","count":608},{"language":"en","tag":"Management API","count":490},{"language":"fr-ca","tag":"Management API","count":484},{"language":"ja-jp","tag":"Management API","count":484},{"language":"en","tag":"Get Started","count":289},{"language":"ja-jp","tag":"はじめに","count":285},{"language":"fr-ca","tag":"Personnaliser","count":275},{"language":"ja-jp","tag":"カスタマイズ","count":275},{"language":"fr-ca","tag":"Pour commencer","count":268},{"language":"en","tag":"Reference","count":252},{"language":"en","tag":"Extend","count":216},{"language":"en","tag":"SDKs","count":209},{"language":"fr-ca","tag":"SDK","count":209},{"language":"ja-jp","tag":"SDK","count":209},{"language":"en","tag":"Monitor","count":194},{"language":"en","tag":"Authenticate","count":186},{"language":"fr-ca","tag":"Authentifier","count":186},{"language":"ja-jp","tag":"認証","count":186},{"language":"en","tag":"Tenant Log Event Types","count":171},{"language":"fr-ca","tag":"Catalogue des journaux du locataire","count":170},{"language":"ja-jp","tag":"テナントログカタログ","count":170},{"language":"fr-ca","tag":"Sécuriser","count":151},{"language":"ja-jp","tag":"セキュリティ","count":151},{"language":"fr-ca","tag":"Protéger votre application","count":133},{"language":"ja-jp","tag":"アプリケーションを保護する","count":133}],"searchSettings":{"showContentSnippets":true}},"assistantConfig":{"enableAskAiButton":true,"enableStarterQuestions":false,"enableAskAiSearchBar":false,"deflection":{"enabled":false,"type":"link"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"ui/css/recipe.css","content":"#content-area:has(.recipe-container){overflow:visible!important}.recipe-content .recipe-section:first-of-type{margin-top:1rem}.active-section{opacity:1!important}"},{"filePath":"ui/css/styles.css","content":"@font-face{font-family:\"Inter Fallback\";src:local(\"Arial\");size-adjust:107%;ascent-override:90%;descent-override:22%;line-gap-override:0%}body{font-feature-settings:\"kern\",\"liga\",\"clig\",\"calt\",\"rvrn\";font-family:\"Inter\",\"Inter Fallback\",system-ui,-apple-system,sans-serif}.mdx-content{line-height:1.625}#page-title{font-size:var(--text-3xl);line-height:1.15}.mdx-content .link{font-weight:inherit;border:0;text-decoration:underline;text-underline-offset:2px;transition:opacity .15s ease-out}.mdx-content .link:hover{color:rgb(var(--tw-prose-links))}.dark .mdx-content .link:hover,.mdx-content .link,.nav-tabs-item[data-active]{color:rgb(var(--primary))}.mdx-content table{border-radius:12px;border:0;box-shadow:0 0 0 1px rgb(from var(--border-muted) r g b/50%);overflow:hidden}img.icon.inline{margin:0}#navbar{padding-bottom:.5rem;box-shadow:0 0 0 1px oklch(from var(--border) l c h/.1),0 1px 1px -1px oklch(from var(--shadow) l c h/.06),0 2px 2px -2px oklch(from var(--shadow) l c h/.06),0 2px 4px -2px oklch(from var(--shadow) l c h/.06)}body:has([data-uc-component] [data-slot=dialog-content]) #navbar>div:first-child{border-bottom-color:transparent}body[data-scroll-locked]:has([data-uc-component] [data-slot=dialog-content]){margin-right:0!important}#adu-root{transition:opacity .2s ease,visibility 0s linear 0s}body:has([data-uc-component] [data-slot=dialog-content]) #adu-root{opacity:0;visibility:hidden;transition:opacity .2s ease,visibility 0s linear .2s}.nav-tabs{column-gap:0}.nav-tabs-item{padding:.25rem .75rem;text-shadow:none}.dark .nav-tabs-item[data-active]{color:rgb(var(--primary-light))}.nav-tabs-item:hover{color:rgb(var(--primary));background-color:rgb(var(--primary)/.1);transition:all .15s ease-out;border-radius:.75rem}#sidebar-content{border-color:transparent}.card{transition:all .15s ease}.libraries_card{border:1px solid var(--border-muted)}.api_card_wrapper .card{background-color:transparent;color:var(--foreground-card);border-radius:0;border-bottom:3px solid currentColor!important;margin-bottom:1rem}[data-component-part=field-meta-post]{background-color:lab(91.896% .077188 -6.94053);color:lab(36.091% 25.9241 -68.0384)}.dark [data-component-part=field-meta-post]{background-color:lab(16.0426% 6.71726 -27.2409);color:lab(72.6029% 4.08953 -41.9669)}body:has([data-uc-component] [data-slot=dialog-overlay]) [data-assistant-bar]{visibility:hidden}"},{"filePath":"ui/css/apiExplorer.css","content":".api-section-heading-subtitle,.array-param-field,.object-param-field,.primitive-param-field{font-size:.875rem}svg[style*=\"/zsh.svg\"]{-webkit-mask-image:url(/docs/images/auth0-cli.svg)!important;mask-image:url(/docs/images/auth0-cli.svg)!important}"},{"filePath":"ui/auth0-docs-ui-1.10.0.css","content":"@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-ease:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:host,:root{--adu-font-sans:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";--adu-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;--adu-color-blue-500:oklch(62.3% .214 259.815);--adu-color-white:#fff;--adu-spacing:.25rem;--adu-text-xs--line-height:calc(1/.75);--adu-text-sm--line-height:calc(1.25/.875);--adu-text-base--line-height:1.5;--adu-text-lg--line-height:calc(1.75/1.125);--adu-text-xl--line-height:calc(1.75/1.25);--adu-text-2xl--line-height:calc(2/1.5);--adu-text-3xl--line-height:1.2;--adu-tracking-widest:.1em;--adu-ease-in-out:cubic-bezier(.4,0,.2,1);--adu-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--adu-default-transition-duration:.15s;--adu-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--adu-default-font-family:var(--adu-font-sans);--adu-default-mono-font-family:var(--adu-font-mono)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0;margin-inline-end:4px}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--adu-default-font-family,ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\");font-feature-settings:var(--adu-default-font-feature-settings,normal);font-variation-settings:var(--adu-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--adu-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace);font-feature-settings:var(--adu-default-mono-font-feature-settings,normal);font-variation-settings:var(--adu-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--color-border);outline-color:var(--color-ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in srgb,var(--color-ring)50%,transparent)}}body{background-color:var(--color-background);color:var(--color-foreground);text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-synthesis:style;font-feature-settings:\"kern\",\"liga\",\"clig\",\"calt\",\"rvrn\"}}@layer components;@layer utilities{.adu\\:\\@container\\/card-header{container:card-header/inline-size}.adu\\:pointer-events-none{pointer-events:none}.adu\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden}.adu\\:absolute,.adu\\:sr-only{position:absolute}.adu\\:fixed{position:fixed}.adu\\:relative{position:relative}.adu\\:static{position:static}.adu\\:top-0{top:calc(var(--adu-spacing)*0)}.adu\\:right-0{right:calc(var(--adu-spacing)*0)}.adu\\:left-0{left:calc(var(--adu-spacing)*0)}.adu\\:left-2{left:calc(var(--adu-spacing)*2)}.adu\\:left-73{left:calc(var(--adu-spacing)*73)}.adu\\:z-0{z-index:0}.adu\\:z-30{z-index:30}.adu\\:z-50{z-index:50}.adu\\:z-\\[39\\]{z-index:39}.adu\\:col-start-2{grid-column-start:2}.adu\\:row-span-2{grid-row:span 2/span 2}.adu\\:row-start-1{grid-row-start:1}.adu\\:-mx-1{margin-inline:calc(var(--adu-spacing)*-1)}.adu\\:my-1{margin-block:calc(var(--adu-spacing)*1)}.adu\\:mr-2{margin-right:calc(var(--adu-spacing)*2)}.adu\\:-ml-8{margin-left:calc(var(--adu-spacing)*-8)}.adu\\:ml-2{margin-left:calc(var(--adu-spacing)*2)}.adu\\:ml-auto{margin-left:auto}.adu\\:flex{display:flex}.adu\\:grid{display:grid}.adu\\:hidden{display:none}.adu\\:inline-block{display:inline-block}.adu\\:inline-flex{display:inline-flex}.adu\\:aspect-square{aspect-ratio:1}.adu\\:size-2{width:calc(var(--adu-spacing)*2);height:calc(var(--adu-spacing)*2)}.adu\\:size-3\\.5{width:calc(var(--adu-spacing)*3.5);height:calc(var(--adu-spacing)*3.5)}.adu\\:size-4{width:calc(var(--adu-spacing)*4);height:calc(var(--adu-spacing)*4)}.adu\\:size-8{width:calc(var(--adu-spacing)*8);height:calc(var(--adu-spacing)*8)}.adu\\:size-9{width:calc(var(--adu-spacing)*9);height:calc(var(--adu-spacing)*9)}.adu\\:size-full{width:100%;height:100%}.adu\\:h-4{height:calc(var(--adu-spacing)*4)}.adu\\:h-8{height:calc(var(--adu-spacing)*8)}.adu\\:h-9{height:calc(var(--adu-spacing)*9)}.adu\\:h-10{height:calc(var(--adu-spacing)*10)}.adu\\:h-14{height:calc(var(--adu-spacing)*14)}.adu\\:h-\\[18px\\]{height:18px}.adu\\:h-px{height:1px}.adu\\:max-h-\\(--radix-dropdown-menu-content-available-height\\){max-height:var(--radix-dropdown-menu-content-available-height)}.adu\\:max-h-72\\.5{max-height:calc(var(--adu-spacing)*72.5)}.adu\\:max-h-\\[calc\\(100\\%\\+2px\\)\\]{max-height:calc(100% + 2px)}.adu\\:w-4{width:calc(var(--adu-spacing)*4)}.adu\\:w-8{width:calc(var(--adu-spacing)*8)}.adu\\:w-9{width:calc(var(--adu-spacing)*9)}.adu\\:w-48{width:calc(var(--adu-spacing)*48)}.adu\\:w-73{width:calc(var(--adu-spacing)*73)}.adu\\:w-\\[24px\\]{width:24px}.adu\\:w-full{width:100%}.adu\\:min-w-\\[8rem\\]{min-width:8rem}.adu\\:flex-1{flex:1}.adu\\:shrink-0{flex-shrink:0}.adu\\:origin-\\(--radix-dropdown-menu-content-transform-origin\\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.adu\\:animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.adu\\:animate-out{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.adu\\:animate-pulse{animation:var(--adu-animate-pulse)}.adu\\:cursor-default{cursor:default}.adu\\:auto-rows-min{grid-auto-rows:min-content}.adu\\:grid-rows-\\[auto_auto\\]{grid-template-rows:auto auto}.adu\\:flex-col{flex-direction:column}.adu\\:flex-wrap{flex-wrap:wrap}.adu\\:items-center{align-items:center}.adu\\:items-start{align-items:flex-start}.adu\\:justify-center{justify-content:center}.adu\\:gap-0{gap:calc(var(--adu-spacing)*0)}.adu\\:gap-1{gap:calc(var(--adu-spacing)*1)}.adu\\:gap-1\\.5{gap:calc(var(--adu-spacing)*1.5)}.adu\\:gap-2{gap:calc(var(--adu-spacing)*2)}.adu\\:gap-3{gap:calc(var(--adu-spacing)*3)}.adu\\:gap-4{gap:calc(var(--adu-spacing)*4)}.adu\\:gap-6{gap:calc(var(--adu-spacing)*6)}.adu\\:gap-8{gap:calc(var(--adu-spacing)*8)}.adu\\:self-start{align-self:flex-start}.adu\\:self-stretch{align-self:stretch}.adu\\:justify-self-end{justify-self:flex-end}.adu\\:overflow-auto{overflow:auto}.adu\\:overflow-hidden{overflow:hidden}.adu\\:overflow-x-hidden{overflow-x:hidden}.adu\\:overflow-y-auto{overflow-y:auto}.adu\\:rounded{border-radius:.25rem}.adu\\:rounded-full{border-radius:9999px}.adu\\:rounded-md{border-radius:.5rem}.adu\\:rounded-none{border-radius:0}.adu\\:rounded-sm{border-radius:.375rem}.adu\\:rounded-xl{border-radius:.875rem}.adu\\:border{border-style:var(--tw-border-style);border-width:1px}.adu\\:border\\!{border-style:var(--tw-border-style)!important;border-width:1px!important}.adu\\:border-border-input{border-color:var(--border-input)}.adu\\:border-border-muted{border-color:var(--border-muted)}.adu\\:bg-\\[\\#232220\\]{background-color:#232220}.adu\\:bg-blue-500{background-color:var(--adu-color-blue-500)}.adu\\:bg-border-input{background-color:var(--border-input)}.adu\\:bg-button-primary{background-color:var(--button-primary)}.adu\\:bg-card{background-color:var(--card)}.adu\\:bg-destructive{background-color:var(--destructive)}.adu\\:bg-input{background-color:var(--input)}.adu\\:bg-page{background-color:var(--page)}.adu\\:bg-popover{background-color:var(--popover)}.adu\\:bg-surface-muted{background-color:var(--surface-muted)}.adu\\:bg-surface-selected{background-color:var(--surface-selected)}.adu\\:fill-current{fill:currentColor}.adu\\:p-0{padding:calc(var(--adu-spacing)*0)}.adu\\:p-1{padding:calc(var(--adu-spacing)*1)}.adu\\:p-2\\.5{padding:calc(var(--adu-spacing)*2.5)}.adu\\:p-4{padding:calc(var(--adu-spacing)*4)}.adu\\:px-1{padding-inline:calc(var(--adu-spacing)*1)}.adu\\:px-2{padding-inline:calc(var(--adu-spacing)*2)}.adu\\:px-3{padding-inline:calc(var(--adu-spacing)*3)}.adu\\:px-4{padding-inline:calc(var(--adu-spacing)*4)}.adu\\:px-6{padding-inline:calc(var(--adu-spacing)*6)}.adu\\:py-1\\.5{padding-block:calc(var(--adu-spacing)*1.5)}.adu\\:py-2{padding-block:calc(var(--adu-spacing)*2)}.adu\\:py-3{padding-block:calc(var(--adu-spacing)*3)}.adu\\:py-6{padding-block:calc(var(--adu-spacing)*6)}.adu\\:pt-3{padding-top:calc(var(--adu-spacing)*3)}.adu\\:pr-2{padding-right:calc(var(--adu-spacing)*2)}.adu\\:pl-8{padding-left:calc(var(--adu-spacing)*8)}.adu\\:text-center{text-align:center}.adu\\:font-aeonik{font-family:Aeonik,sans-serif}.adu\\:font-inter{font-family:Inter,Inter Fallback,system-ui,-apple-system,sans-serif}.adu\\:font-roboto-mono{font-family:Roboto Mono,sans-serif}.adu\\:text-2xl{font-size:2rem;line-height:var(--tw-leading,var(--adu-text-2xl--line-height))}.adu\\:text-3xl{font-size:2.5rem;line-height:var(--tw-leading,var(--adu-text-3xl--line-height))}.adu\\:text-base{font-size:1rem;line-height:var(--tw-leading,var(--adu-text-base--line-height))}.adu\\:text-lg{font-size:1.25rem;line-height:var(--tw-leading,var(--adu-text-lg--line-height))}.adu\\:text-sm{font-size:.875rem;line-height:var(--tw-leading,var(--adu-text-sm--line-height))}.adu\\:text-sm\\!{font-size:.875rem!important;line-height:var(--tw-leading,var(--adu-text-sm--line-height))!important}.adu\\:text-xl{font-size:1.5rem;line-height:var(--tw-leading,var(--adu-text-xl--line-height))}.adu\\:text-xs{font-size:.75rem;line-height:var(--tw-leading,var(--adu-text-xs--line-height))}.adu\\:leading-1\\.5{--tw-leading:calc(var(--adu-spacing)*1.5);line-height:calc(var(--adu-spacing)*1.5)}.adu\\:leading-1\\.15{--tw-leading:1.15;line-height:1.15}.adu\\:leading-1\\.20{--tw-leading:1.2;line-height:1.2}.adu\\:leading-1\\.25{--tw-leading:1.25;line-height:1.25}.adu\\:leading-1\\.30{--tw-leading:1.3;line-height:1.3}.adu\\:leading-1\\.33{--tw-leading:1.33;line-height:1.33}.adu\\:leading-1\\.40{--tw-leading:1.4;line-height:1.4}.adu\\:leading-1\\.45{--tw-leading:1.45;line-height:1.45}.adu\\:leading-1\\.65{--tw-leading:1.65;line-height:1.65}.adu\\:leading-none{--tw-leading:1;line-height:1}.adu\\:font-medium{--tw-font-weight:500;font-weight:500}.adu\\:font-normal{--tw-font-weight:400;font-weight:400}.adu\\:font-semibold{--tw-font-weight:600;font-weight:600}.adu\\:tracking-n-2xl{--tw-tracking:-.02em;letter-spacing:-.02em}.adu\\:tracking-n-3xl{--tw-tracking:-.02125em;letter-spacing:-.02125em}.adu\\:tracking-n-5xl{--tw-tracking:-.044em;letter-spacing:-.044em}.adu\\:tracking-n-6xl{--tw-tracking:-.05em;letter-spacing:-.05em}.adu\\:tracking-n-lg{--tw-tracking:-.011em;letter-spacing:-.011em}.adu\\:tracking-n-md{--tw-tracking:-.00625em;letter-spacing:-.00625em}.adu\\:tracking-n-sm{--tw-tracking:-.006em;letter-spacing:-.006em}.adu\\:tracking-n-xl{--tw-tracking:-.01125em;letter-spacing:-.01125em}.adu\\:tracking-n-xs{--tw-tracking:-.00525em;letter-spacing:-.00525em}.adu\\:tracking-p-2xl{--tw-tracking:.0375em;letter-spacing:.0375em}.adu\\:tracking-p-lg{--tw-tracking:.011em;letter-spacing:.011em}.adu\\:tracking-p-md{--tw-tracking:.01em;letter-spacing:.01em}.adu\\:tracking-p-sm{--tw-tracking:.005em;letter-spacing:.005em}.adu\\:tracking-p-xs{--tw-tracking:.0025em;letter-spacing:.0025em}.adu\\:tracking-widest{--tw-tracking:var(--adu-tracking-widest);letter-spacing:var(--adu-tracking-widest)}.adu\\:whitespace-nowrap{white-space:nowrap}.adu\\:text-\\[\\#f4f4f4\\]{color:#f4f4f4}.adu\\:text-\\[\\#f4f4f4\\]\\!{color:#f4f4f4!important}.adu\\:text-foreground{color:var(--foreground)}.adu\\:text-foreground-bold{color:var(--foreground-bold)}.adu\\:text-foreground-icon{color:var(--foreground-icon)}.adu\\:text-foreground-inverse{color:var(--foreground-inverse)}.adu\\:text-foreground-inverse\\!{color:var(--foreground-inverse)!important}.adu\\:text-white{color:var(--adu-color-white)}.adu\\:uppercase{text-transform:uppercase}.adu\\:underline{text-decoration-line:underline}.adu\\:underline-offset-4{text-underline-offset:4px}.adu\\:underline-offset-auto{text-underline-offset:auto}.adu\\:shadow-lg{--tw-shadow:0px 12px 12px -6px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-3))),0px 6px 6px -1.5px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-2))),0px 4px 4px 0px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1))),0px 2px 2px -1px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1))),0px 1px 1px -.5px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1)))}.adu\\:shadow-lg,.adu\\:shadow-md,.adu\\:shadow-sm{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.adu\\:shadow-md{--tw-shadow:0px 6px 6px -3px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-2))),0px 4px 4px -1px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1))),0px 2px 2px -1px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1))),0px 1px 1px -.5px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1)))}.adu\\:shadow-sm{--tw-shadow:0px 4px 4px -2px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1))),0px 2px 2px -1px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1))),0px 1px 1px -.5px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1)))}.adu\\:outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.adu\\:outline-hidden{outline-offset:2px;outline:2px solid #0000}}.adu\\:transition-\\[height\\],.adu\\:transition-all{transition-property:height;transition-timing-function:var(--tw-ease,var(--adu-default-transition-timing-function));transition-duration:var(--tw-duration,var(--adu-default-transition-duration))}.adu\\:transition-all{transition-property:all}.adu\\:ease-in-out{--tw-ease:var(--adu-ease-in-out);transition-timing-function:var(--adu-ease-in-out)}.adu\\:fill-mode-both{--tw-animation-fill-mode:both;animation-fill-mode:both}.adu\\:outline-none{--tw-outline-style:none;outline-style:none}.adu\\:select-none{-webkit-user-select:none;user-select:none}.adu\\:fade-in{--tw-enter-opacity:0}.adu\\:fade-out{--tw-exit-opacity:0}.adu\\:slide-in-from-left{--tw-enter-translate-x:-100%}.adu\\:slide-in-from-right{--tw-enter-translate-x:100%}.adu\\:slide-out-to-left{--tw-exit-translate-x:-100%}.adu\\:slide-out-to-right{--tw-exit-translate-x:100%}@media (hover:hover){.adu\\:hover\\:bg-button-primary\\/90:hover{background-color:var(--button-primary)}@supports (color:color-mix(in lab,red,red)){.adu\\:hover\\:bg-button-primary\\/90:hover{background-color:color-mix(in oklab,var(--button-primary)90%,transparent)}}.adu\\:hover\\:bg-destructive\\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.adu\\:hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.adu\\:hover\\:underline:hover{text-decoration-line:underline}}.adu\\:focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.adu\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.adu\\:focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.adu\\:focus-visible\\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.adu\\:focus-visible\\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.adu\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.adu\\:disabled\\:opacity-50:disabled{opacity:.5}.adu\\:has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.adu\\:has-\\[\\>svg\\]\\:px-2\\.5:has(>svg){padding-inline:calc(var(--adu-spacing)*2.5)}.adu\\:has-\\[\\>svg\\]\\:px-3:has(>svg){padding-inline:calc(var(--adu-spacing)*3)}.adu\\:has-\\[\\>svg\\]\\:px-4:has(>svg){padding-inline:calc(var(--adu-spacing)*4)}.adu\\:aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.adu\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.adu\\:aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.adu\\:\\[\\\u0026_svg\\]\\:pointer-events-none svg,.adu\\:data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}.adu\\:data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}.adu\\:data-\\[inset\\]\\:pl-8[data-inset]{padding-left:calc(var(--adu-spacing)*8)}.adu\\:data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(var(--adu-spacing)*2*-1)}.adu\\:data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(var(--adu-spacing)*2)}.adu\\:data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(var(--adu-spacing)*2*-1)}.adu\\:data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(var(--adu-spacing)*2)}.adu\\:data-\\[state\\=closed\\]\\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.adu\\:data-\\[state\\=closed\\]\\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.adu\\:data-\\[state\\=closed\\]\\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.adu\\:data-\\[state\\=open\\]\\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.adu\\:data-\\[state\\=open\\]\\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.adu\\:data-\\[state\\=open\\]\\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.adu\\:data-\\[variant\\=destructive\\]\\:text-destructive[data-variant=destructive]{color:var(--destructive)}.adu\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.adu\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--destructive)10%,transparent)}}.adu\\:data-\\[variant\\=destructive\\]\\:focus\\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}@media (min-width:64rem){.adu\\:lg\\:block{display:block}.adu\\:lg\\:w-auto{width:auto}}.adu\\:dark\\:bg-destructive\\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.adu\\:dark\\:bg-destructive\\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.adu\\:dark\\:bg-input\\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.adu\\:dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}.adu\\:dark\\:shadow-xs:is(.dark *){--tw-shadow:0px 2px 2px -1px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1))),0px 1px 1px -.5px var(--tw-shadow-color,hsla(var(--color-shadow),var(--transparency-level-1)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media (hover:hover){.adu\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.adu\\:dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}}.adu\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.adu\\:dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.adu\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.adu\\:dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.adu\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.adu\\:dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.adu\\:\\[\\\u0026_svg\\]\\:shrink-0 svg{flex-shrink:0}.adu\\:\\[\\\u0026_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--adu-spacing)*4);height:calc(var(--adu-spacing)*4)}.adu\\:\\[\\.border-b\\]\\:pb-6.border-b{padding-bottom:calc(var(--adu-spacing)*6)}.adu\\:\\[\\.border-t\\]\\:pt-6.border-t{padding-top:calc(var(--adu-spacing)*6)}:is(.adu\\:data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:\\!text-destructive[data-variant=destructive]>*):is(svg){color:var(--destructive)!important}}@property --tw-animation-delay{syntax:\"*\";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:\"*\";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:\"*\";inherits:false}@property --tw-animation-fill-mode{syntax:\"*\";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:\"*\";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:\"*\";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:\"*\";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:\"*\";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:\"*\";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:\"*\";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:\"*\";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:\"*\";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:\"*\";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:\"*\";inherits:false;initial-value:0}@font-face{font-family:Inter Fallback;src:local(Arial);size-adjust:107%;ascent-override:90%;descent-override:22%;line-gap-override:0%}:root{--page:#fff;--card:#fff;--input:#fff;--destructive:#f3e2de;--popover:#fff;--layer:#fffc;--success:#abdfb9;--info:#b2c5fb;--caution:#ffe573;--warning:#ffbf9f;--button-subtle:#00000008;--surface-muted:#c2c2c2;--surface-selected:#efefef;--button-primary:#191919;--foreground:#767676;--foreground-inverse:#f4f4f4;--foreground-bold:#232220;--foreground-card:#232220;--foreground-destructive:#ba351d;--foreground-popover:#232220;--foreground-selected:#6742d5;--foreground-success:#008140;--foreground-info:#344ac5;--foreground-caution:#907600;--foreground-warning:#c45915;--foreground-icon:#1f1f1f;--border-boldest:#1f1f1f;--border-input:#e6e6e6;--border:#afadaa;--border-muted:#cecdca;--border-success:#008140;--border-info:#344ac5;--border-caution:#907600;--border-warning:#c45915;--code-layer:#f4f4f4;--code-content:#fffc;--code-string-key:#595959;--code-string-value:#149750;--code-boolean:#e27133;--code-delimiter:#afafaf;--code-number:#374ec9;--code-object:#6742d5;--color-shadow:0,0%,0%;--color-shadow-destructive:5,85%,37%;--transparency-level-1:.04;--transparency-level-2:.06;--transparency-level-3:.08;--transparency-level-4:.1;--transparency-level-5:.12;--transparency-level-6:.16;--transparency-level-7:.2;--transparency-level-8:.24;--transparency-level-9:.4}.dark{--page:#191919;--card:#21201f;--input:#0000000d;--destructive:#43140b;--popover:#21201f;--layer:#29272580;--success:#225835;--info:#2f428b;--caution:#433600;--warning:#63361f;--button-subtle:#ffffffe6;--surface-muted:#4a4a4a;--surface-selected:#282828;--button-primary:#fff;--foreground:#7b7b7b;--foreground-inverse:#191919;--foreground-bold:#efede9;--foreground-card:#efede9;--foreground-destructive:#ff9179;--foreground-popover:#efede9;--foreground-selected:#b3a7ff;--foreground-success:#61d287;--foreground-info:#94b2ff;--foreground-caution:#f8d523;--foreground-warning:#ff9f6e;--foreground-icon:#eee;--border-boldest:#eee;--border-input:#282828;--border:#63615e;--border-muted:#3f3d3a;--border-success:#61d287;--border-info:#94b2ff;--border-caution:#f8d523;--border-warning:#ff9f6e;--code-layer:#21201f;--code-content:#1a1918;--code-string-key:#b4b4b4;--code-string-value:#61d287;--code-boolean:#ff9f6e;--code-delimiter:#7b7b7b;--code-number:#94b2ff;--code-object:#b3a7ff;--color-shadow:0,0%,100%;--color-shadow-destructive:5,85%,37%;--transparency-level-1:.04;--transparency-level-2:.06;--transparency-level-3:.08;--transparency-level-4:.1;--transparency-level-5:.12;--transparency-level-6:.16;--transparency-level-7:.2;--transparency-level-8:.24;--transparency-level-9:.4}.adu-dropdown-menu-content,.adu-dropdown-menu-content:after,.adu-dropdown-menu-content:before{border-width:1px;border-color:var(--border-input)}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-tracking{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"\u003cpercentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"\u003cpercentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"\u003clength>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ease{syntax:\"*\";inherits:false}"},{"filePath":"ui/css/ai.css","content":"@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(360deg)}}.connection-card-filters button,.connection-card-search{background:var(--card);border-color:var(--foreground);transition:all .2s ease}.connection-card-filters button.active{text-decoration:underline dotted;color:rgb(var(--primary));border-color:rgb(var(--primary))}.connection-card-no-results{text-decoration:none!important;cursor:default!important}.download-button-container{display:inline-block;margin-bottom:1rem}.download-button{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1.125rem .5rem 1rem;border-radius:.75rem;font-size:.95rem;font-weight:600;cursor:pointer;transition:all .2s ease;text-decoration:none;color:var(--foreground-inverse);background-color:var(--button-primary);box-shadow:0 0 0 1px oklch(from var(--button-primary) l c h/.12),0 1px 1px -1px oklch(from var(--button-primary) l c h/.06),0 2px 2px -2px oklch(from var(--button-primary) l c h/.06),0 2px 4px -2px oklch(from var(--button-primary) l c h/.06),0 4px 6px -4px oklch(from var(--button-primary) l c h/.06),0 6px 8px -6px oklch(from var(--button-primary) l c h/.06),0 -1px 2px 0 oklch(from var(--button-primary) l c h/.2) inset}.download-button:hover:not(:disabled){background-color:oklch(from var(--button-primary) l c h/.8);box-shadow:0 0 0 4px oklch(from var(--button-primary) l c h/.06),0 1px 1px -1px oklch(from var(--button-primary) l c h/.06),0 2px 2px -2px oklch(from var(--button-primary) l c h/.06),0 2px 4px -2px oklch(from var(--button-primary) l c h/.06),0 4px 6px -4px oklch(from var(--button-primary) l c h/.06),0 6px 8px -6px oklch(from var(--button-primary) l c h/.06),0 -1px 2px 0 oklch(from var(--button-primary) l c h/.2) inset}.download-button:disabled{opacity:.6;cursor:not-allowed}.download-button.downloading{pointer-events:none}.download-spinner{animation:spin 1s linear infinite}"},{"filePath":"ui/universal-components/universal-components-1.0.27.css","href":"/_mintlify/custom/auth0/00cc1c5532398fe9/ui/universal-components/universal-components-1.0.27.css"}],"page":{"pagePath":"docs/get-started/architecture-scenarios/business-to-business/authentication","slug":"/docs/get-started/architecture-scenarios/business-to-business/authentication","pageMetadata":{"title":"Business-to-Business Authentication","sidebarTitle":"Authentication","description":"Design authentication for your Auth0 B2B SaaS application, using Universal Login, home realm discovery across Organizations, enterprise connections, and MFA to securely identify users from multiple customer tenants.","validatedOn":"2026-02-03T00:00:00.000Z","href":"/docs/get-started/architecture-scenarios/business-to-business/authentication"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Design authentication for your Auth0 B2B SaaS application, using Universal Login, home realm discovery across Organizations, enterprise connections, and MFA to securely identify users from multiple customer tenants.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Tip,Tooltip,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Tooltip)_missingMdxReference(`Tooltip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`In order to provide services to your users, you must be able to identify who those users are. This process is called User Authentication. There are a number of ways to perform authentication of a user - via social media accounts, username and password,\\xA0`,_jsx(Tooltip,{tip:`Passwordless: Form of authentication that does not rely on a password as the first factor.`,cta:`View Glossary`,href:`/docs/glossary?term=passwordless`,children:`passwordless`}),`\\xA0- and it’s often recommended that you go beyond a first factor for authenticating the user by enabling `,_jsx(Tooltip,{tip:`Passwordless: Form of authentication that does not rely on a password as the first factor.`,cta:`View Glossary`,href:`/docs/glossary?term=multi-factor+authentication`,children:`multi-factor authentication`}),` (MFA).`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`It’s important to consider both security and user experience when designing how you will authenticate your users. Providing for multiple primary factors, and/or enforcing more than one factor during authentication, are ways that you can provide both.`})}),`\n`,_jsx(_components.p,{children:`There are a number of things you will want to consider when looking at functionality and workflow:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Where will users enter their credentials?`}),`\n`,_jsx(_components.li,{children:`How will you keep user credentials safe?`}),`\n`,_jsx(_components.li,{children:`How will you maintain your authentication system?`}),`\n`,_jsx(_components.li,{children:`How can you provide password authentication for your users?`}),`\n`,_jsx(_components.li,{children:`How can you prevent hackers from trying to log in as your users?`}),`\n`,_jsx(_components.li,{children:`How will you implement authentication in different kinds of applications?`}),`\n`,_jsx(_components.li,{children:`How can you make login easy for your users when they come from different language backgrounds?`}),`\n`,_jsx(_components.li,{children:`How will you provide a good user experience as you migrate away from any legacy authentication system?`}),`\n`,_jsx(_components.li,{children:`What should you consider when integrating applications with Auth0?`}),`\n`,_jsx(_components.li,{children:`Do you need to provide multi-factor authentication?`}),`\n`,_jsx(_components.li,{children:`What do you do if you have a service that doesn’t have a way for the user to log in ahead of time?`}),`\n`,_jsxs(_components.li,{children:[`Can you pass the same user `,_jsx(Tooltip,{tip:`Access Token: Authorization credential, in the form of an opaque string or JWT, used to access an API.`,cta:`View Glossary`,href:`/docs/glossary?term=access+token`,children:`access token`}),` from one API to another?`]}),`\n`,_jsx(_components.li,{children:`What do you do if you need to isolate users by organization?`}),`\n`,_jsx(_components.li,{children:`How will you handle identifying which organization users belong to?`}),`\n`,_jsx(_components.li,{children:`What’s the benefit of providing enterprise connections for your organizations?`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Auth0\\xA0`,_jsx(_components.a,{href:`#universal-login`,children:`Universal Login`}),`\\xA0provides users with a safe and secure experience - no matter whether you choose to provide for user ID/password credentials sign in, or allow the so-called Bring Your Own Identity scenarios provided via\\xA0`,_jsx(_components.a,{href:`https://auth0.com/learn/social-login/`,children:`Social Login`}),`. There are also brand recognition benefits to centralizing the login experience with `,_jsx(Tooltip,{tip:`Universal Login: Your application redirects to Universal Login, hosted on Auth0's Authorization Server, to verify a user's identity.`,cta:`View Glossary`,href:`/docs/glossary?term=Universal+Login`,children:`Universal Login`}),`, even if you feel you will also have product-specific\\xA0`,_jsx(_components.a,{href:`/docs/get-started/architecture-scenarios/business-to-consumer/branding`,children:`branding`}),`\\xA0requirements. The Auth0 UI widgets typically used with Universal Login also provide out-of-the-box support with regards to\\xA0`,_jsx(_components.a,{href:`/docs/customize/internationalization-and-localization/universal-login-internationalization`,children:`internationalization`}),`\\xA0for users with different language requirements, and out-of-the-box support for Auth0 features such as\\xA0`,_jsx(_components.a,{href:`#multi-factor-authentication-mfa-`,children:`MFA`}),`\\xA0and\\xA0`,_jsx(_components.a,{href:`#anomaly-detection`,children:`attack protection`}),`\\xA0allow you to put barriers in place in order to prevent hackers attempting to access users’ accounts.`]}),`\n`,_jsxs(_components.p,{children:[`Allowing users to sign in via user ID/password credentials means that you’re not reliant on the status of third-party `,_jsx(Tooltip,{tip:`Identity Provider (IdP): Service that stores and manages digital identities.`,cta:`View Glossary`,href:`/docs/glossary?term=identity+providers`,children:`identity providers`}),` for your users to access your system. You also have the means to require the credentials used to align with your corporate policies. Auth0 assists with this by providing you with multiple options in support of user ID/password logins, and the\\xA0`,_jsx(_components.a,{href:`#username-and-password-authentication`,children:`guidance provided`}),`\\xA0will help you understand you can leverage these options. Adding\\xA0`,_jsx(_components.a,{href:`#social-authentication`,children:`social`}),`\\xA0support at some stage, as an additional primary authentication factor, gives you added flexibility and can help you better understand your users without the need to question them further by leveraging the information already stored by the various social login\\xA0`,_jsx(_components.a,{href:`/docs/authenticate/identity-providers/social-identity-providers`,children:`providers`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`If you have an existing legacy identity store, you’ll also want to see\\xA0`,_jsx(_components.a,{href:`/docs/get-started/architecture-scenarios/business-to-consumer/provisioning`,children:`User Migration`}),`. This section discusses the advantages of migrating to Auth0’s managed identity storage in terms of safety and security.`]}),`\n`,_jsxs(_components.p,{children:[`For customer facing applications, `,_jsx(Tooltip,{tip:`OpenID: Open standard for authentication that allows applications to verify users' identities without collecting and storing login information.`,cta:`View Glossary`,href:`/docs/glossary?term=OpenID`,children:`OpenID`}),` Connect (`,_jsx(_components.a,{href:`/docs/authenticate/protocols/openid-connect-protocol`,children:`OIDC`}),`) is the most frequently used industry standard protocol, and OIDC has first-class citizen support in Auth0. Auth0 provides support for various different approaches for integrating various different applications, so you’ll want to see the section on\\xA0`,_jsx(_components.a,{href:`#application-integration`,children:`application integration`}),`\\xA0for the information you’ll need to make an informed choice.`]}),`\n`,_jsxs(_components.p,{children:[`When calling one API from another API, or from any situation where there is no authenticated user context - such as one or more cron jobs, report generators, or continuous integration/delivery systems - you will need a way to authorize the\\xA0application\\xA0instead of a\\xA0user. This is a one step process where the application is authenticated (using a `,_jsx(Tooltip,{tip:`Client ID: Identification value given to your registered resource from Auth0.`,cta:`View Glossary`,href:`/docs/glossary?term=client+ID`,children:`client ID`}),` and secret) and then authorized in one call. You can learn more about this in our authorization work stream under\\xA0`,_jsx(_components.a,{href:`/docs/get-started/architecture-scenarios/business-to-business/authorization`,children:`machine-to-machine (m2m) authorization`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Often companies need to segregate their users by organization and sometimes users can have access to more than one organization. Knowing which of these scenarios is relevant to your company will help define how to determine in which connection a user exists: whether you need to do it, when you need to do it, and how to accomplish it. See\\xA0`,_jsx(_components.a,{href:`#home-realm-discovery`,children:`Home Realm Discovery`}),`\\xA0to determine if this is something relevant to your company.`]}),`\n`,_jsx(Heading,{level:`2`,id:`universal-login`,children:`Universal Login`}),`\n`,_jsxs(_components.p,{children:[`Do you have, or will you have, more than one application in your system? If the answer to this question is yes, then you will want a centralized sign in experience. To achieve a seamless\\xA0`,_jsx(Tooltip,{tip:`Single Sign-On (SSO): Service that, after a user logs into one applicaton, automatically logs that user in to other applications.`,cta:`View Glossary`,href:`/docs/glossary?term=Single+Sign-on`,children:`Single Sign-on`}),` (SSO)\\xA0experience between multiple applications, it is critical to have a centralized location to redirect your users for authentication. This allows you a way to provide your users with a consistent experience if you add social authentication in the future, add third party applications to your system, or add multi-factor authentication as an option (or requirement) for your users - and also allow you to take advantage of new features for improving your users’ experience with little, if any, added development effort.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`If you have more than one application, the best practice is to redirect to a `,_jsx(_components.a,{href:`/docs/authenticate/login/auth0-universal-login`,children:`centralized location`}),` to authenticate the user. With Auth0, this means taking advantage of `,_jsx(_components.a,{href:`/docs/authenticate/login/auth0-universal-login`,children:`Universal Login`}),`, which provides many security and user experience benefits out-of-the-box, including `,_jsx(_components.a,{href:`/docs/authenticate/single-sign-on`,children:`SSO`}),`.`]})}),`\n`,_jsx(_components.p,{children:`Auth0 Universal Login makes authenticating users a short, easy process which can be accomplished in three easy steps (all of our Quickstarts demonstrate this and our SDKs hide the complexity for you too):`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Determine how and when you want to\\xA0`,_jsx(_components.a,{href:`#application-integration`,children:`redirect from your application`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Set up the appropriate\\xA0`,_jsx(_components.a,{href:`/docs/get-started/architecture-scenarios/business-to-consumer/branding`,children:`branding`}),`\\xA0and/or customized HTML in your Auth0 configuration.`]}),`\n`,_jsxs(_components.li,{children:[`Set up your application to\\xA0`,_jsx(_components.a,{href:`#application-integration`,children:`receive and handle the response`}),`\\xA0from the Authorization Server.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`home-realm-discovery`,children:`Home realm discovery`}),`\n`,_jsx(_components.p,{children:`Home realm discovery (HRD) is the process of identifying which identity provider (or which connection in Auth0) the user belongs to\\xA0before\\xA0authenticating them. There are two ways HRD can occur:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Provide a way for the decision to be made at the application`}),`\n`,_jsx(_components.li,{children:`Have Home Realm Discovery happen on the Universal Login page`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Your system may need to do either or both methods so it is important to understand all approaches to HRD so that you can apply the one(s) that make the most sense to your applications.`}),`\n`,_jsx(Heading,{level:`3`,id:`application-driven-hrd`,children:`Application driven HRD`}),`\n`,_jsxs(_components.p,{children:[`A common way of determining which realm a user belongs to is when an application is branded for each organization. As part of this, an organization will typically have its own instance of the application, typically accessed via a different URL. This copy or instance can be physically isolated (running on a separate set of servers) or virtually isolated (running on shared servers) and is generally denoted through either a custom hostname (`,_jsx(_components.code,{children:`companyA.application1.yourcompany.com`}),`) or path (`,_jsx(_components.code,{children:`application1.yourcompany.com/companyA`}),`).`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`If your application already knows the specific connection (IdP) required then you can also pass that along when you redirect the user to `,_jsx(_components.code,{children:`/authorize`}),`, via use of the `,_jsx(_components.code,{children:`connection`}),` query parameter.`]})}),`\n`,_jsxs(_components.p,{children:[`If this is the case for your application(s), then home realm discovery is a simple matter of storing the `,_jsx(_components.code,{children:`org_id`}),` with the organization-specific application configuration and sending that as the organization parameter when redirecting the user to Universal Login. Doing so will limit the user to that specific organization and its set of configured connections.`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`If an organization needs more than one IdP, then you may have to do a second round of Home Realm Discovery (once the organization has been identified). Auth0 will typically manage this for you if you are using the Organizations Feature.`})}),`\n`,_jsxs(_components.p,{children:[`If the user is shared between multiple organizations using a single identity, you must support\\xA0`,_jsx(_components.a,{href:`#hrd-through-universal-login`,children:`Home Realm Discovery on the Universal Login Page`}),`. This will allow Universal Login to identify the user first and then present the realms appropriate for that user leading to a better user experience.`]}),`\n`,_jsxs(_components.p,{children:[`Sending the organization and/or connection parameters can be achieved by adding them as a query parameter when you redirect the user to the `,_jsx(_components.code,{children:`/authorize`}),` endpoint. For more information, see the\\xA0`,_jsx(_components.a,{href:`/docs/api/authentication#authorization-code-flow`,children:`Authentication API docs`}),`. However, you will generally accomplish this using the SDK for whichever language your application is written in.`]}),`\n`,_jsx(Heading,{level:`3`,id:`hrd-through-universal-login`,children:`HRD through Universal Login`}),`\n`,_jsx(_components.p,{children:`There are three main approaches to Home Realm Discovery:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Discover the realm through the user’s email subdomain.`}),`\n`,_jsx(_components.li,{children:`Discover the realm by looking up a user identifier in some sort of map of an identifier to realm map.`}),`\n`,_jsx(_components.li,{children:`Allow the user to choose or enter their realm (or organization).`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`In both of the first two approaches, you may consider doing “Identifier First Login”. This means that you present only the ability to enter an identifier first. After which, you collect the user’s identifier, and then, based on the identifier, you either automatically redirect the user or present a way for the user to enter their password if redirection is unnecessary. Auth0 provides implementation out of the box to take care of all of this, via the use of `,_jsx(_components.a,{href:`/docs/authenticate/login/auth0-universal-login/identifier-first`,children:`Universal Login`}),`.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Though it is possible to implement Identifier First Login or allow a user to select their organization at the application instead of on the Universal Login Page, this can add complexity with respect to single sign on as well as complexity associated with replicating that behavior in all of your applications. Instead Auth0 recommends implementing some form of HRD through Universal Login.`})}),`\n`,_jsx(Heading,{level:`4`,id:`hrd-through-universal-login-using-the-email-subdomain`,children:`HRD through Universal Login using the email subdomain`}),`\n`,_jsx(_components.p,{children:`The simplest way to implement home realm discovery on the universal login page is to utilize the email subdomain of the user’s identifier to map that to their Identity Provider. This, of course, only works in situations where the email subdomain will be a 1:1 mapping to an organization or at least to an Identity Provider.`}),`\n`,_jsxs(_components.p,{children:[`Auth0’s `,_jsx(_components.a,{href:`/docs/libraries/lock`,children:`Lock`}),` widget or `,_jsx(_components.a,{href:`/docs/authenticate/login/auth0-universal-login/universal-login-vs-classic-login/universal-experience`,children:`Universal Login`}),` can do this for you if you are using the domain map in an enterprise connection; however, if you want to build this yourself, you can, but it requires you to build a mapping of email subdomain to connection.`]}),`\n`,_jsxs(_components.p,{children:[`Additionally, when using the Universal Login experience, the `,_jsx(_components.a,{href:`/docs/manage-users/organizations/organizations-overview`,children:`Organizations Feature`}),` will help you in two ways:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`If you have not passed an org_id to `,_jsx(_components.code,{children:`/authorize`}),` when you initiated the login request, Auth0 will present the user with a prompt to enter the organization they belong to.`]}),`\n`,_jsx(_components.li,{children:`If the Organization has more than one IdP associated with it, Auth0 will present the user with buttons to choose the organization or a form to enter a username and password.`}),`\n`]}),`\n`,_jsx(Heading,{level:`4`,id:`hrd-through-universal-login-using-the-identifier-to-realm-map`,children:`HRD through Universal Login using the Identifier to Realm Map`}),`\n`,_jsx(_components.p,{children:`A second, more complex alternative is to store a map of identifiers to IdP and provide a public endpoint to access that information. Then on the Universal Login page, you can find the connection and redirect back to /authorize with the connection. The main drawbacks to this approach are latency and, more importantly, security when it comes to identifier discovery: if you’re using email addresses, this makes it much easier for someone to discover whether a particular email address is a user of yours.`}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Any public endpoint should have rate limiting applied to it to prevent hackers from using it to discover information and to prevent denial of service attacks.`})}),`\n`,_jsx(Heading,{level:`4`,id:`hrd-through-universal-login-using-user-choice`,children:`HRD through Universal Login using user choice`}),`\n`,_jsx(_components.p,{children:`The other option is to allow your users to choose from a list, if you don’t mind making public the list of organizations who use your product, or by allowing the user to enter their organization name explicitly. This would typically be done before redirecting the user to Universal Login. Once the user tells you which organization they belong to, you can redirect to Auth0 with the connection for that organization specified or have Auth0 simply prompt the user for their username and password if the connection is a database connection.`}),`\n`,_jsx(Heading,{level:`2`,id:`username-and-password-authentication`,children:`Username and password authentication`}),`\n`,_jsx(_components.p,{children:`Nearly every B2C application provides the ability for its customers to create a new set of credentials. This is a common form of authentication that all users are familiar with.`}),`\n`,_jsxs(_components.p,{children:[`Username password authentication comes in multiple flavors at Auth0. If your application is a green-field application with no existing user base, then a simple Auth0 out-of-the-box\\xA0`,_jsx(_components.a,{href:`/docs/authenticate/database-connections`,children:`Database Connection`}),`\\xA0will give you everything you need to start authenticating your users. However, if you have a legacy user store (such as your own database of users or an existing LDAP system) you have a couple of different options for migrating your users as discussed in our guidance on\\xA0`,_jsx(_components.a,{href:`/docs/get-started/architecture-scenarios/business-to-business/provisioning`,children:`User migration`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`However you end up provisioning the users for your database connection, the authentication of those users is quite similar. It requires you to present users with a form to enter their username and password. As mentioned in the guidance concerning\\xA0`,_jsx(_components.a,{href:`#universal-login`,children:`Universal Login`}),`, the simplest and safest way to authenticate users with a username and password is to redirect them to a centralized login page and collect their username and password there. This allows Auth0 to determine whether they have already authenticated and skip the login form entirely when it’s not needed.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Collecting credentials only at the centralized login page will reduce the surface area for potential leak of user secrets. It will also reduce the need to collect credentials unnecessarily. See `,_jsx(_components.a,{href:`#universal-login`,children:`Universal Login`}),` for more information.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`application-integration`,children:`Application integration`}),`\n`,_jsx(_components.p,{children:`Once you’ve figured out how you want to authenticate your users, the next step is to determine how you will initiate that authentication. Each application will typically have its own starting point.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Native mobile applications (and desktop applications) should use the system browser for authentication, or they open themselves up to additional security risks. See\\xA0`,_jsx(_components.a,{href:`/docs/authenticate/login/native-login`,children:`Native Login`}),`\\xA0for more information.`]})}),`\n`,_jsxs(_components.p,{children:[`As discussed, we’ve found that most of our customers use\\xA0`,_jsx(_components.a,{href:`/docs/authenticate/protocols/openid-connect-protocol`,children:`OpenID Connect (OIDC)`}),`\\xA0as the industry-standard protocol when it comes to their customer-facing applications. Figuring out which\\xA0OIDC flow\\xA0to use is your first task, and you will want to start by reviewing the our\\xA0`,_jsx(_components.a,{href:`/docs/get-started/applications/application-grant-types`,children:`grant mapping`}),`\\xA0guidance in the first instance.`]}),`\n`,_jsxs(_components.p,{children:[`If you want to allow anonymous users access to any part of our application then you need to determine if you will be redirecting right away or prompting your users to redirect only when required (or perhaps some combination of both; see\\xA0`,_jsx(_components.a,{href:`/docs/authenticate/login/redirect-users-after-login`,children:`Redirect Users After Login`}),`\\xA0for further discussion). If users can\\xA0`,_jsx(_components.a,{href:`#deep-linking-to-protected-endpoints`,children:`deep link`}),`\\xA0to a protected version (or area) of your site then you will need to determine the links to your application that will result in an automatic redirect to Auth0.`]}),`\n`,_jsx(Heading,{level:`3`,id:`anonymous-access`,children:`Anonymous access`}),`\n`,_jsx(_components.p,{children:`It is important to consider the user experience when someone first comes to your application. If your application supports anonymous user access (quite common for eCommerce applications) there are different scenarios to consider:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Are they returning to the application after having already logged in, or`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`If this is the first time they are accessing the application:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Have they already accessed a different application that uses the same Auth0 tenant,`}),`\n`,_jsx(_components.li,{children:`Have they ever (or perhaps not in a long time) authenticated on this device or browser.`}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`When an anonymous user accesses your application, it can often be desirable for the application to discover if the user has already logged into a different application in the same family, or to remember this user even if the application is a\\xA0`,_jsx(_components.a,{href:`/docs/quickstart/spa`,children:`SPA`}),`\\xA0with no state. For example, if you can determine that the user is already logged in, you might decide to have the UI header in the application skip displaying a login button and instead have an account or profile menu for the user. To accomplish this you will want to utilize “`,_jsx(_components.a,{href:`/docs/authenticate/login/configure-silent-authentication`,children:`silent authentication`}),`”. Silent authentication will allow you to check to see if the user is logged in without prompting them to log in if they are not. Then the application can present a login button if necessary. If the user is logged in already, however, then you will receive tokens and will not have to present the user with a login button again.`]}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:`Checking for a login session by redirecting to Auth0 can be helpful for your application, but if this will result in a lot of requests, you should employ a throttling mechanism to avoid latency and/or rate limiting.`}),_jsxs(_components.p,{children:[`Calls to the Management API are subject to\\xA0`,_jsx(_components.a,{href:`/docs/troubleshoot/customer-support/operational-policies/rate-limit-policy`,children:`Auth0 Rate Limiting policy`}),`. You must take this into consideration, and to assist, Auth0 generally recommends use of the appropriate\\xA0`,_jsx(_components.a,{href:`/docs/libraries`,children:`Auth0 SDK`}),`\\xA0for your development environment rather than calling our APIs directly.`]})]}),`\n`,_jsx(Heading,{level:`3`,id:`deep-linking-to-protected-endpoints`,children:`Deep linking to protected endpoints`}),`\n`,_jsxs(_components.p,{children:[`There are a variety of reasons why someone might link directly to a particular page within your application that is only accessible by authenticated users. If this is possible for your application you should automatically redirect your user to Auth0 if they are not authenticated. Once they authenticate and the `,_jsx(Tooltip,{tip:`Authorization Server: Centralized server that contributes to defining the boundaries of a user’s access. For example, your authorization server can control the data, tasks, and features available to a user.`,cta:`View Glossary`,href:`/docs/glossary?term=authorization+server`,children:`authorization server`}),` returns them to your application, you can\\xA0`,_jsx(_components.a,{href:`/docs/authenticate/login/redirect-users-after-login`,children:`redirect them`}),`\\xA0to where they intended to go in the first place.`]}),`\n`,_jsx(Heading,{level:`3`,id:`best-practice`,children:`Best Practice`}),`\n`,_jsx(_components.p,{children:`Most modern authentication frameworks support middleware for redirecting to an authorization server such as Auth0. When selecting one, here are some key considerations:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Support for confidential clients, non-confidential clients, or both`}),`\n`,_jsxs(_components.li,{children:[`Support for configuration via `,_jsx(_components.a,{href:`/docs/get-started/applications/configure-applications-with-oidc-discovery`,title:`Configure Applications with OIDC Discovery`,children:`discovery endpoint`}),` or explicitly inline`]}),`\n`,_jsx(_components.li,{children:`Support for token validation including expirations, signatures, claims and scopes`}),`\n`,_jsxs(_components.li,{children:[`Support for `,_jsx(Tooltip,{tip:`Refresh Token: Token used to obtain a renewed Access Token without forcing users to log in again.`,cta:`View Glossary`,href:`/docs/glossary?term=Refresh+Tokens`,children:`Refresh Tokens`}),` if needed`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`authenticating-the-user`,children:`Authenticating the user`}),`\n`,_jsxs(_components.p,{children:[`Authentication is the process of determining user identity. The result of authentication in an OIDC context is an `,_jsx(Tooltip,{tip:`ID Token: Credential meant for the client itself, rather than for accessing a resource.`,cta:`View Glossary`,href:`/docs/glossary?term=ID+Token`,children:`ID Token`}),`. This token contains information about the user and should only be able to be obtained if the user authenticates using one or more factors as defined by the authorization server (the most common form being\\xA0`,_jsx(_components.a,{href:`#username-and-password-authentication`,children:`user ID and password`}),`). There are a few things you may also need to consider in addition to obtaining an ID Token:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Do we also need an\\xA0`,_jsx(_components.a,{href:`/docs/secure/tokens/access-tokens`,children:`Access Token`}),`\\xA0in order to call a shared API?`]}),`\n`,_jsxs(_components.li,{children:[`Is your application a single-page application and only requires an\\xA0`,_jsx(_components.a,{href:`/docs/secure/tokens/id-tokens`,children:`ID Token`}),`? See\\xA0`,_jsx(_components.a,{href:`/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce/call-your-api-using-the-authorization-code-flow-with-pkce`,children:`Authorization Code Grant with PKCE`}),`\\xA0for more information.`]}),`\n`,_jsxs(_components.li,{children:[`Is your application a native application (mobile or desktop) and/or do you need a\\xA0`,_jsx(_components.a,{href:`/docs/secure/tokens/refresh-tokens`,children:`Refresh Token`}),`? See\\xA0`,_jsx(_components.a,{href:`/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce/call-your-api-using-the-authorization-code-flow-with-pkce`,children:`Authorization Code Grant with PKCE`}),`\\xA0for more information.`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Before you go live, you should ensure that\\xA0`,_jsx(_components.strong,{children:`only`}),`\\xA0the grants that you are using for each application are enabled in your\\xA0`,_jsx(_components.a,{href:`/docs/get-started/applications/update-grant-types`,children:`configuration for your Application`}),`.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`authorization-code-grant-with-or-without-pkce`,children:`Authorization code grant (with or without PKCE)`}),`\n`,_jsxs(_components.p,{children:[`If your SDK only supports the Authorization Code grant, or you need an Access Token or `,_jsx(Tooltip,{tip:`Refresh Token: Token used to obtain a renewed Access Token without forcing users to log in again.`,cta:`View Glossary`,href:`/docs/glossary?term=Refresh+Token`,children:`Refresh Token`}),`, then Authorization Code grant (with or without\\xA0`,_jsx(_components.a,{href:`/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce`,children:`PKCE`}),`) can also be used to retrieve an ID Token. The Authorization Code grant includes an additional API call to exchange the code for a token which can result in additional unnecessary latency if all you need is the ID Token. In many cases the\\xA0`,_jsx(_components.a,{href:`/docs/get-started/authentication-and-authorization-flow/hybrid-flow`,children:`hybrid flow`}),`\\xA0is implemented to provide optimum access to the ID Token while still leveraging Authorization Code grant workflow for the secure and safe retrieval of Access and Refresh Tokens.`]}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[`While Auth0 supports the use of implicit grant for browser-based applications requiring only an ID Token, it is recommended to use authorization code grant with `,_jsx(_components.a,{href:`/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce`,children:`PKCE`}),`. For detailed information, see `,_jsx(_components.a,{href:`https://auth0.com/blog/oauth2-implicit-grant-and-spa/`,children:`OAuth2 Implicit Grant and SPA`}),` on the Auth0 Blog.`]}),_jsxs(_components.p,{children:[`If you need a\\xA0`,_jsx(_components.a,{href:`/docs/secure/tokens/refresh-tokens`,children:`Refresh Token`}),`\\xA0so that you can obtain a new Access Token or ID Token without having to re-authenticate the user, then you must use the\\xA0`,_jsx(_components.a,{href:`/docs/get-started/authentication-and-authorization-flow/authorization-code-flow/call-your-api-using-the-authorization-code-flow`,children:`authorization code grant`}),`.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`attack-protection`,children:`Attack protection`}),`\n`,_jsxs(_components.p,{children:[`The reason that authentication systems are important is to prevent `,_jsx(Tooltip,{tip:`Bad Actors: Entity (a person or group) that poses a threat to the business or environment with the intention to cause harm.`,cta:`View Glossary`,href:`/docs/glossary?term=bad+actors`,children:`bad actors`}),` from accessing applications and user data that they should not. We want to place as many barriers as possible between those bad actors and access to our systems. One of the easiest ways to do this is to ensure that your\\xA0`,_jsx(_components.a,{href:`/docs/secure/attack-protection`,children:`attack protection`}),`\\xA0with Auth0 is configured correctly, so take a moment to read the guidance on this subject and ensure that it’s working correctly for you.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Anomaly detection is handled behind the scenes by Auth0 and provides a great security feature for your product. If you’re going to utilize it, ensure that you have set up your `,_jsx(_components.a,{href:`/docs/get-started/architecture-scenarios/business-to-business/operations#email-provider-setup`,children:`Email Provider`}),` and configured your `,_jsx(_components.a,{href:`/docs/get-started/architecture-scenarios/business-to-business/branding#email-template-customization`,children:`Email Templates`}),` before turning on email delivery to your users.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`sso-with-legacy-systems`,children:`SSO with legacy systems`}),`\n`,_jsxs(_components.p,{children:[`In a large scale re-structure it’s not always possible—or practical—to update all your applications at once. In fact, our recommended best practice is to plan for an iterative-style approach when it comes to integrating with Auth0. If your applications already participate in Single Sign-on (SSO), and your legacy identity system supports protocols such as OIDC or `,_jsx(Tooltip,{tip:`Security Assertion Markup Language (SAML): Standardized protocol allowing two parties to exchange authentication information without a password.`,cta:`View Glossary`,href:`/docs/glossary?term=SAML`,children:`SAML`}),`, then you have a couple of options available if you want to continue to provide SSO as you integrate with Auth0:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Update your existing identity provider in your legacy SSO system to redirect to Auth0 for login (e.g., using\\xA0`,_jsx(_components.a,{href:`/docs/authenticate/single-sign-on/outbound-single-sign-on/configure-auth0-saml-identity-provider`,children:`SAML`}),`), or`]}),`\n`,_jsxs(_components.li,{children:[`Have Auth0 redirect to your legacy SSO system to login. This requires configuring your legacy system as an IdP in Auth0 (i.e., either using\\xA0`,_jsx(_components.a,{href:`/docs/authenticate/protocols/saml/saml-sso-integrations/configure-auth0-saml-service-provider`,children:`SAML`}),`\\xA0or\\xA0`,_jsx(_components.a,{href:`/docs/authenticate/identity-providers/social-identity-providers`,children:`OIDC`}),`).`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Supporting an SSO experience with your legacy system can add complexity, but may be worth it to generate a more seamless user experience as you integrate with Auth0. If you intend to go down this path, planning for it early can help ensure that it is possible to achieve. If you don’t already have SSO at a centralized service, then the complexity to add it will unlikely be worth the benefits.`})}),`\n`,_jsx(_components.p,{children:`This is a complex topic that will likely need some additional investigation depending on your current legacy architecture, and we recommend you only look into this if you currently have SSO support in your legacy system. Note: if you are currently redirecting from your applications to a centralized system to authenticate your users and that system only asks for credentials if you don’t already have a session with the centralized system, then you have a legacy SSO implementation.`}),`\n`,_jsx(Heading,{level:`2`,id:`enterprise-login`,children:`Enterprise Login`}),`\n`,_jsxs(_components.p,{children:[`The “bring your own identity” scenario has become a must-have for almost all B2B applications. Most enterprise companies expect to be able to integrate their IdP into your application so their employees don’t need to store another set of credentials. This is a valuable way of simplifying the user authentication experience without compromising security, and using\\xA0`,_jsx(_components.a,{href:`#universal-login`,children:`Universal Login`}),`\\xA0makes it easy to start adding support for\\xA0`,_jsx(_components.a,{href:`/docs/authenticate/identity-providers/enterprise-identity-providers`,children:`Enterprise Connections`}),`\\xA0with minimal disruption.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Once you start supporting enterprise connections for users, you must do some form of `,_jsx(_components.a,{href:`#home-realm-discovery`,children:`Home Realm Discovery`}),` so that you can determine which connection to send the user to for authentication.`]})}),`\n`,_jsxs(_components.p,{children:[`With enterprise connection support, user identities and credentials are managed by the identity provider of your customers’ organization, as well as certain identity claims - which Auth0 will use to populate the user\\xA0`,_jsx(_components.a,{href:`/docs/get-started/architecture-scenarios/business-to-business/profile-management`,children:`profile`}),`.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`“Bring your own identity” is a great feature to provide, but if you don’t support this from day one, and sometimes even if you do, you may have an organization that wants to switch to their own IdP after already having used the application for a while. You will need a way to `,_jsx(_components.a,{href:`/docs/manage-users/user-accounts/user-account-linking`,children:`link user accounts`}),` to provide an effective way of associating the new identity with the old database identity.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`multi-factor-authentication-mfa`,children:`Multi-factor authentication (MFA)`}),`\n`,_jsxs(_components.p,{children:[`In an era where misuse of user credentials is at an all-time high, protecting\\xA0your\\xA0systems when it’s so common for hackers to steal users identity information in general is a challenge. One of the most effective ways though is to provide users with the ability to configure a second factor for protecting their account. More commonly referred to as\\xA0`,_jsx(_components.a,{href:`/docs/secure/multi-factor-authentication`,children:`Multi-Factor Authentication`}),`. This will ensure that only a valid user can access their account, even if they use a username and password that may have been compromised from a different application.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`It’s quite common for customer facing applications to provide users with an `,_jsx(_components.em,{children:`option`}),` for adding a second factor rather than `,_jsx(_components.em,{children:`forcing`}),` them to use a second factor. For more information regarding this, see `,_jsx(_components.a,{href:`https://auth0.com/learn/multifactor-authentication-customers/`,children:`providing your users with an option to add MFA`}),`.`]})}),`\n`,_jsx(_components.p,{children:`Auth0 supports a number of different options when it comes to enabling MFA for protecting user account access, and there are several practices to ensure that you will truly be providing a flexible second factor barrier to access:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Auth0\\xA0`,_jsx(_components.a,{href:`https://auth0.com/multifactor-authentication`,children:`Guardian`}),`: a service that provides both\\xA0Push\\xA0notification generation and an application for allowing or denying requests.\\xA0Push\\xA0sends notification to a user’s pre-registered device - typically a mobile or tablet - from which a user can immediately allow or deny account access via the simple press of a button.`]}),`\n`,_jsxs(_components.li,{children:[`Time-based One-Time Password (`,_jsx(_components.a,{href:`https://auth0.com/blog/from-theory-to-practice-adding-two-factor-to-node-dot-js/`,children:`TOTP`}),`): allows you to register a device - such as Google Authenticator - that will generate a one-time password which changes over time and which can be entered as the second factor to validate a user’s account.`]}),`\n`,_jsx(_components.li,{children:`SMS: for sending a one-time code over SMS which the user is then prompted to enter before they can finish authenticating.`}),`\n`,_jsx(_components.li,{children:`Voice: for delivering a one-time code through a phone call which the user is then prompted to enter before they can finish authenticating.`}),`\n`,_jsx(_components.li,{children:`Duo: allows you to use your Duo account for multi-factor authentication.`}),`\n`,_jsx(_components.li,{children:`Email: allows you to use your email account for multi-factor authentication.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Whilst MFA workflow using technologies such as Guardian or Google Authenticator is typically provided via a separate application that runs on a mobile or tablet device, if you don’t want your customers to have to download a separate application Auth0 also provides you with an\\xA0`,_jsx(_components.a,{href:`https://auth0.com/blog/announcing-guardian-whitelabel-sdk/`,children:`SDK`}),`\\xA0that you can use to build second factor workflow right in your existing mobile device application(s).`]}),`\n`,_jsx(Heading,{level:`2`,id:`project-planning-guide`,children:`Project Planning Guide`}),`\n`,_jsx(_components.p,{children:`We provide planning guidance in PDF format that you can download and refer to for details about our recommended strategies.`}),`\n`,_jsx(_components.p,{children:_jsx(_components.a,{href:`https://assets.ctfassets.net/cdy7uua7fh8z/63F0WOPJdVzsPMxV1Xvp8x/7a329487c5e890d8e820f6a48983b46a/B2B_Project_Planning.pdf`,children:`B2B IAM Project Planning Guide`})}),`\n`,_jsx(Heading,{level:`2`,id:`multiple-organization-architecture-multitenancy`,children:`Multiple Organization Architecture (Multitenancy)`}),`\n`,_jsx(_components.p,{children:`Many B2B platforms implement some form of isolation and/or branding for their customers’ organization, and this can add complexity to any Identity and Access Management (IAM) system. If this applies to you, then we recommend you take some time to read through our guidance and best practice advice for this type of environment.`}),`\n`,_jsx(_components.p,{children:_jsx(_components.a,{href:`/docs/get-started/architecture-scenarios/multiple-organization-architecture`,children:`Multiple Organization Architecture`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Business-to-Business Authentication","sidebarTitle":"Authentication","description":"Design authentication for your Auth0 B2B SaaS application, using Universal Login, home realm discovery across Organizations, enterprise connections, and MFA to securely identify users from multiple customer tenants.","validatedOn":"2026-02-03T00:00:00.000Z","href":"/docs/get-started/architecture-scenarios/business-to-business/authentication"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Universal Login","slug":"universal-login","depth":2,"children":[]},{"title":"Home realm discovery","slug":"home-realm-discovery","depth":2,"children":[{"title":"Application driven HRD","slug":"application-driven-hrd","depth":3,"children":[]},{"title":"HRD through Universal Login","slug":"hrd-through-universal-login","depth":3,"children":[]},{"title":"HRD through Universal Login using the email subdomain","slug":"hrd-through-universal-login-using-the-email-subdomain","depth":4,"children":[]},{"title":"HRD through Universal Login using the Identifier to Realm Map","slug":"hrd-through-universal-login-using-the-identifier-to-realm-map","depth":4,"children":[]},{"title":"HRD through Universal Login using user choice","slug":"hrd-through-universal-login-using-user-choice","depth":4,"children":[]}]},{"title":"Username and password authentication","slug":"username-and-password-authentication","depth":2,"children":[]},{"title":"Application integration","slug":"application-integration","depth":2,"children":[{"title":"Anonymous access","slug":"anonymous-access","depth":3,"children":[]},{"title":"Deep linking to protected endpoints","slug":"deep-linking-to-protected-endpoints","depth":3,"children":[]},{"title":"Best Practice","slug":"best-practice","depth":3,"children":[]},{"title":"Authenticating the user","slug":"authenticating-the-user","depth":3,"children":[]},{"title":"Authorization code grant (with or without PKCE)","slug":"authorization-code-grant-with-or-without-pkce","depth":3,"children":[]}]},{"title":"Attack protection","slug":"attack-protection","depth":2,"children":[]},{"title":"SSO with legacy systems","slug":"sso-with-legacy-systems","depth":2,"children":[]},{"title":"Enterprise Login","slug":"enterprise-login","depth":2,"children":[]},{"title":"Multi-factor authentication (MFA)","slug":"multi-factor-authentication-mfa","depth":2,"children":[]},{"title":"Project Planning Guide","slug":"project-planning-guide","depth":2,"children":[]},{"title":"Multiple Organization Architecture (Multitenancy)","slug":"multiple-organization-architecture-multitenancy","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/auth0/68ac07e0f912aad4/docs/scripts/navbar-controller.js","/_mintlify/custom/auth0/98c52e2a822716a4/docs/scripts/overscroll-disable.js","/_mintlify/custom/auth0/15b21268d7cc82a0/ui/auth0-docs-ui-1.10.0.umd.js","/_mintlify/custom/auth0/edda60bac2809e28/ui/js/auth0-cli-language.js","/_mintlify/custom/auth0/af65702d2f0210f7/ui/universal-components/universal-components-1.0.27.umd.js"],"subdomain":"auth0","siteName":"Auth0 Docs","title":"Business-to-Business Authentication - Auth0 Docs","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"manual"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/docs/get-started/architecture-scenarios/business-to-business/authentication","matchLevel":0},"fr-ca":{"href":"/docs/fr-ca/get-started/architecture-scenarios/business-to-business/authentication","matchLevel":1},"ja-jp":{"href":"/docs/ja-jp/get-started/architecture-scenarios/business-to-business/authentication","matchLevel":1}}},"lastModified":"2026-10-20T08:26:03.907Z","originalFileLocation":"docs/get-started/architecture-scenarios/business-to-business/authentication.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Design authentication for your Auth0 B2B SaaS application, using Universal Login, home realm discovery across Organizations, enterprise connections, and MFA to securely identify users from multiple customer tenants.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Auth0 Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/svg+xml\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/logo/favicon.svg\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/logo/favicon.svg\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/logo/favicon.svg\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/svg+xml\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/logo/favicon.svg\">\u003cmeta data-mint-head property=\"og:title\" content=\"Business-to-Business Authentication - Auth0 Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Design authentication for your Auth0 B2B SaaS application, using Universal Login, home realm discovery across Organizations, enterprise connections, and MFA to securely identify users from multiple customer tenants.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Auth0 Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://auth0.mintlify.app/docs/images/share-image.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Business-to-Business Authentication - Auth0 Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Design authentication for your Auth0 B2B SaaS application, using Universal Login, home realm discovery across Organizations, enterprise connections, and MFA to securely identify users from multiple customer tenants.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://auth0.mintlify.app/docs/images/share-image.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/auth0/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Auth0 Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#9921FE\">\u003clink data-mint-head rel=\"canonical\" href=\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/get-started/architecture-scenarios/business-to-business/authentication.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr-CA\" href=\"https://auth0.com/docs/fr-ca/get-started/architecture-scenarios/business-to-business/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja-JP\" href=\"https://auth0.com/docs/ja-jp/get-started/architecture-scenarios/business-to-business/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://auth0.com/#organization\",\"name\":\"Auth0 Docs\",\"url\":\"https://auth0.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/logo/light.svg\"}},{\"@type\":\"WebSite\",\"@id\":\"https://auth0.com#website\",\"name\":\"Auth0 Docs\",\"url\":\"https://auth0.com\",\"publisher\":{\"@id\":\"https://auth0.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication#webpage\",\"url\":\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication\",\"name\":\"Business-to-Business Authentication\",\"description\":\"Design authentication for your Auth0 B2B SaaS application, using Universal Login, home realm discovery across Organizations, enterprise connections, and MFA to securely identify users from multiple customer tenants.\",\"dateModified\":\"2026-10-20T08:26:03.907Z\",\"isPartOf\":{\"@id\":\"https://auth0.com#website\"},\"breadcrumb\":{\"@id\":\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Learn the Basics\",\"item\":\"https://auth0.com/docs/get-started/identity-fundamentals\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Architecture Scenarios\",\"item\":\"https://auth0.com/docs/get-started/architecture-scenarios\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Business Use Case Planning Guides\",\"item\":\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-consumer/architecture\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Business to Business\",\"item\":\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"Business-to-Business Authentication\",\"item\":\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication#article\",\"headline\":\"Business-to-Business Authentication\",\"name\":\"Business-to-Business Authentication\",\"description\":\"Design authentication for your Auth0 B2B SaaS application, using Universal Login, home realm discovery across Organizations, enterprise connections, and MFA to securely identify users from multiple customer tenants.\",\"url\":\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication\",\"mainEntityOfPage\":{\"@id\":\"https://auth0.com/docs/get-started/architecture-scenarios/business-to-business/authentication#webpage\"},\"image\":\"https://auth0.com/docs/images/share-image.png\",\"dateModified\":\"2026-10-20T08:26:03.907Z\",\"publisher\":{\"@id\":\"https://auth0.com/#organization\"},\"isPartOf\":{\"@id\":\"https://auth0.com#website\"}}]}\u003c/script>","siteName":"Auth0 Docs","nav":{"global":null,"languages":[{"language":"en","footer":{"socials":{"x-twitter":"https://x.com/auth0","github":"https://github.com/auth0","linkedin":"https://www.linkedin.com/company/auth0"},"links":[{"header":"Developers","items":[{"label":"Developer Hub","href":"https://developer.auth0.com"},{"label":"Code Samples \u0026 Guides","href":"https://developer.auth0.com/resources"},{"label":"Zero Index Newsletter","href":"https://auth0.com/blog/newsletter"},{"label":"Blog","href":"https://auth0.com/blog"},{"label":"Changelog","href":"https://auth0.com/changelog"}]},{"header":"Docs","items":[{"label":"Documentation","href":"https://auth0.com/docs"},{"label":"Quickstarts","href":"https://auth0.com/docs/quickstarts"},{"label":"APIs","href":"https://auth0.com/docs/api"},{"label":"SDK Libraries","href":"https://auth0.com/docs/libraries"},{"label":"Learn","href":"https://auth0.com/learn"},{"label":"Intro to IAM (CIAM)","href":"https://auth0.com/intro-to-iam"},{"label":"Reports","href":"https://auth0.com/resources/whitepapers"},{"label":"Webinars","href":"https://auth0.com/resources/webinars"}]},{"header":"Support Center","items":[{"label":"Community","href":"https://community.auth0.com"},{"label":"Help","href":"https://support.auth0.com"},{"label":"FAQs","href":"https://auth0.com/docs/troubleshoot"},{"label":"Auth0","href":"https://auth0.com"}]},{"header":"Company","items":[{"label":"Our Customers","href":"https://auth0.com/customers"},{"label":"Compliance","href":"https://auth0.com/security"},{"label":"Partners","href":"https://auth0.com/partners"},{"label":"Careers","href":"https://www.okta.com/company/careers"},{"label":"Okta + Auth0","href":"https://www.okta.com/okta-and-auth0"},{"label":"About us","href":"https://auth0.com/about"}]}]},"tabs":[{"tab":"Get Started","icon":"play","directory":"accordion","pages":[{"title":"Get Started with Auth0","sidebarTitle":"Get Started","href":"/docs/get-started"},{"group":"Learn the Basics","root":{"title":"Identity Fundamentals","href":"/docs/get-started/identity-fundamentals"},"expanded":true,"pages":[{"title":"Introduction to Auth0","href":"/docs/get-started/identity-fundamentals/introduction-to-auth0"},{"title":"Introduction to Identity and Access Management (IAM)","href":"/docs/get-started/identity-fundamentals/identity-and-access-management"},{"title":"Authentication vs. Authorization","href":"/docs/get-started/identity-fundamentals/authentication-and-authorization"},{"group":"Authentication and Authorization Flows","root":{"sidebarTitle":"Overview","title":"Authentication and Authorization Flows","href":"/docs/get-started/authentication-and-authorization-flow"},"pages":[{"title":"Which OAuth 2.0 Flow Should I Use?","href":"/docs/get-started/authentication-and-authorization-flow/which-oauth-2-0-flow-should-i-use"},{"group":"Authorization Code Flow","pages":[{"sidebarTitle":"Overview","title":"Authorization Code Flow","href":"/docs/get-started/authentication-and-authorization-flow/authorization-code-flow"},{"title":"Add Login Using the Authorization Code Flow","href":"/docs/get-started/authentication-and-authorization-flow/authorization-code-flow/add-login-auth-code-flow"},{"title":"Call Your API Using the Authorization Code Flow","href":"/docs/get-started/authentication-and-authorization-flow/authorization-code-flow/call-your-api-using-the-authorization-code-flow"},{"title":"Authorization Code Flow with Rich Authorization Requests (RAR)","href":"/docs/get-started/authentication-and-authorization-flow/authorization-code-flow/authorization-code-flow-with-rar"},{"title":"Authorization Code Flow with Pushed Authorization Requests (PAR)","href":"/docs/get-started/authentication-and-authorization-flow/authorization-code-flow/authorization-code-flow-with-par"},{"title":"Authorization Code Flow with JWT-Secured Authorization Requests (JAR)","href":"/docs/get-started/authentication-and-authorization-flow/authorization-code-flow/authorization-code-flow-with-jar"}]},{"group":"Authorization Code Flow with Proof Key for Code Exchange","pages":[{"title":"Authorization Code Flow with Proof Key for Code Exchange (PKCE)","href":"/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce"},{"title":"Add Login Using the Authorization Code Flow with PKCE","href":"/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce/add-login-using-the-authorization-code-flow-with-pkce"},{"title":"Call Your API Using the Authorization Code Flow with PKCE","href":"/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce/call-your-api-using-the-authorization-code-flow-with-pkce"}]},{"group":"Client Credentials Flow","pages":[{"sidebarTitle":"Overview","title":"Client Credentials Flow","href":"/docs/get-started/authentication-and-authorization-flow/client-credentials-flow"},{"title":"Call Your API Using the Client Credentials Flow","href":"/docs/get-started/authentication-and-authorization-flow/client-credentials-flow/call-your-api-using-the-client-credentials-flow"},{"title":"Customize Tokens Using Hooks with Client Credentials Flow","href":"/docs/get-started/authentication-and-authorization-flow/client-credentials-flow/customize-tokens-using-hooks-with-client-credentials-flow"}]},{"group":"Client-Initiated Backchannel Authentication Flow","pages":[{"sidebarTitle":"Overview","title":"Client-Initiated Backchannel Authentication Flow","href":"/docs/get-started/authentication-and-authorization-flow/client-initiated-backchannel-authentication-flow"},{"title":"Mobile Push Notifications with CIBA","href":"/docs/get-started/authentication-and-authorization-flow/client-initiated-backchannel-authentication-flow/mobile-push-notifications-with-ciba"},{"title":"Email Notifications with CIBA","href":"/docs/get-started/authentication-and-authorization-flow/client-initiated-backchannel-authentication-flow/email-notifications-with-ciba"},{"title":"User Authorization with CIBA","href":"/docs/get-started/authentication-and-authorization-flow/client-initiated-backchannel-authentication-flow/user-authorization-with-ciba"}]},{"group":"Custom Token Exchange Flow","pages":[{"sidebarTitle":"Overview","title":"Custom Token Exchange Flow","href":"/docs/get-started/authentication-and-authorization-flow/token-exchange-flow"},{"sidebarTitle":"Call Your API Using the Custom Token Exchange Flow","title":"Call Your API Using the Custom Token Exchange Flow","href":"/docs/get-started/authentication-and-authorization-flow/token-exchange-flow/call-your-api-using-the-custom-token-exchange-flow"}]},{"group":"Device Authorization Flow","pages":[{"sidebarTitle":"Overview","title":"Device Authorization Flow","href":"/docs/get-started/authentication-and-authorization-flow/device-authorization-flow"},{"title":"Call Your API Using the Device Authorization Flow","href":"/docs/get-started/authentication-and-authorization-flow/device-authorization-flow/call-your-api-using-the-device-authorization-flow"}]},{"group":"Implicit Flow with Form Post","pages":[{"sidebarTitle":"Overview","title":"Implicit Flow with Form Post","href":"/docs/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post"},{"title":"Mitigate Replay Attacks When Using the Implicit Flow","href":"/docs/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post/mitigate-replay-attacks-when-using-the-implicit-flow"},{"title":"Add Login Using the Implicit Flow with Form Post","href":"/docs/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post/add-login-using-the-implicit-flow-with-form-post"}]},{"group":"Hybrid Flow","pages":[{"sidebarTitle":"Overview","title":"Hybrid Flow","href":"/docs/get-started/authentication-and-authorization-flow/hybrid-flow"},{"title":"Call Your API Using the Hybrid Flow","href":"/docs/get-started/authentication-and-authorization-flow/hybrid-flow/call-api-hybrid-flow"}]},{"group":"Resource Owner Password Flow","pages":[{"sidebarTitle":"Overview","title":"Resource Owner Password Flow","href":"/docs/get-started/authentication-and-authorization-flow/resource-owner-password-flow"},{"title":"Call Your API Using Resource Owner Password Flow","href":"/docs/get-started/authentication-and-authorization-flow/resource-owner-password-flow/call-your-api-using-resource-owner-password-flow"},{"title":"Avoid Common Issues with Resource Owner Password Flow and Attack Protection","href":"/docs/get-started/authentication-and-authorization-flow/resource-owner-password-flow/avoid-common-issues-with-resource-owner-password-flow-and-attack-protection"}]},{"title":"Authenticate with Private Key JWT","href":"/docs/get-started/authentication-and-authorization-flow/authenticate-with-private-key-jwt"},{"title":"Authenticate with mTLS","href":"/docs/get-started/authentication-and-authorization-flow/authenticate-with-mtls"},{"title":"Client Credentials Exchange","href":"/docs/get-started/authentication-and-authorization-flow/client-credentials-exchange"}]},{"group":"Architecture Scenarios","root":{"title":"Architecture Scenarios","href":"/docs/get-started/architecture-scenarios"},"pages":[{"group":"Business Use Case Planning Guides","pages":[{"group":"Business to Consumer","root":{"title":"Business to Consumer Architecture Scenarios","sidebarTitle":"Business to Consumer","href":"/docs/get-started/architecture-scenarios/business-to-consumer"},"pages":[{"title":"Business-to-Consumer Architecture","sidebarTitle":"Architecture","href":"/docs/get-started/architecture-scenarios/business-to-consumer/architecture"},{"title":"Business-to-Consumer Provisioning","sidebarTitle":"Provisioning","href":"/docs/get-started/architecture-scenarios/business-to-consumer/provisioning"},{"title":"Business-to-Consumer Authentication","sidebarTitle":"Authentication","href":"/docs/get-started/architecture-scenarios/business-to-consumer/authentication"},{"title":"Business-to-Consumer Branding","sidebarTitle":"Branding","href":"/docs/get-started/architecture-scenarios/business-to-consumer/branding"},{"title":"Business-to-Consumer Deployment Automation","sidebarTitle":"Deployment Automation","href":"/docs/get-started/architecture-scenarios/business-to-consumer/deployment"},{"title":"Business-to-Consumer Quality Assurance","sidebarTitle":"Quality Assurance","href":"/docs/get-started/architecture-scenarios/business-to-consumer/quality-assurance"},{"title":"Business-to-Consumer Profile Management","sidebarTitle":"Profile Management","href":"/docs/get-started/architecture-scenarios/business-to-consumer/profile-management"},{"title":"Business-to-Consumer Authorization","sidebarTitle":"Authorization","href":"/docs/get-started/architecture-scenarios/business-to-consumer/authorization"},{"title":"Business-to-Consumer Logout","sidebarTitle":"Logout","href":"/docs/get-started/architecture-scenarios/business-to-consumer/logout"},{"title":"Business-to-Consumer Operations","sidebarTitle":"Operations","href":"/docs/get-started/architecture-scenarios/business-to-consumer/operations"},{"group":"Launch Preparation","root":{"title":"Business-to-Consumer Launch Preparation","sidebarTitle":"Launch Preparation","href":"/docs/get-started/architecture-scenarios/business-to-consumer/launch"},"pages":[{"title":"Business-to-Consumer Tenant Check","sidebarTitle":"Tenant Check","href":"/docs/get-started/architecture-scenarios/business-to-consumer/launch/tenant-check"},{"title":"Business-to-Consumer Testing Complete","sidebarTitle":"Testing Complete","href":"/docs/get-started/architecture-scenarios/business-to-consumer/launch/testing"},{"title":"Business-to-Consumer Operations Readiness","sidebarTitle":"Operations Readiness","href":"/docs/get-started/architecture-scenarios/business-to-consumer/launch/operations-readiness"},{"title":"Business-to-Consumer Compliance Readiness","sidebarTitle":"Compliance Readiness","href":"/docs/get-started/architecture-scenarios/business-to-consumer/launch/compliance-readiness"},{"title":"Business-to-Consumer Support Readiness","sidebarTitle":"Support Readiness","href":"/docs/get-started/architecture-scenarios/business-to-consumer/launch/support-readiness"},{"title":"Business-to-Consumer Launch Day Preparation","sidebarTitle":"Launch Day Preparation","href":"/docs/get-started/architecture-scenarios/business-to-consumer/launch/launch-day"}]}]},{"group":"Business to Business","root":{"title":"Business to Business Architecture Scenarios","sidebarTitle":"Business to Business","href":"/docs/get-started/architecture-scenarios/business-to-business"},"pages":[{"title":"Business-to-Business Architecture","sidebarTitle":"Architecture","href":"/docs/get-started/architecture-scenarios/business-to-business/architecture"},{"title":"Business-to-Business Provisioning","sidebarTitle":"Provisioning","description":"User provisioning functionality and considerations for your B2B IAM implementation.","href":"/docs/get-started/architecture-scenarios/business-to-business/provisioning"},{"title":"Business-to-Business Authentication","sidebarTitle":"Authentication","href":"/docs/get-started/architecture-scenarios/business-to-business/authentication"},{"title":"Business-to-Business Branding","sidebarTitle":"Branding","description":"How to configure Auth0 items to reflect your brand and desired user experience.","href":"/docs/get-started/architecture-scenarios/business-to-business/branding"},{"title":"Business-to-Business Deployment Automation","sidebarTitle":"Deployment Automation","href":"/docs/get-started/architecture-scenarios/business-to-business/deployment"},{"title":"Business-to-Business Quality Assurance","sidebarTitle":"Quality Assurance","href":"/docs/get-started/architecture-scenarios/business-to-business/quality-assurance"},{"title":"Business-to-Business Profile Management","sidebarTitle":"Profile Management","href":"/docs/get-started/architecture-scenarios/business-to-business/profile-management"},{"title":"Business-to-Business Authorization","sidebarTitle":"Authorization","href":"/docs/get-started/architecture-scenarios/business-to-business/authorization"},{"title":"Business-to-Business Logout","sidebarTitle":"Logout","href":"/docs/get-started/architecture-scenarios/business-to-business/logout"},{"title":"Business-to-Business Operations","sidebarTitle":"Operations","href":"/docs/get-started/architecture-scenarios/business-to-business/operations"},{"group":"Launch Preparation (B2B)","root":{"title":"Business-to-Business Launch Preparation","href":"/docs/get-started/architecture-scenarios/business-to-business/launch"},"pages":[{"title":"Tenant Check (B2B)","href":"/docs/get-started/architecture-scenarios/business-to-business/launch/tenant-check"},{"title":"Testing Complete (B2B)","href":"/docs/get-started/architecture-scenarios/business-to-business/launch/testing"},{"title":"Operations Readiness (B2B)","href":"/docs/get-started/architecture-scenarios/business-to-business/launch/operations-readiness"},{"title":"Compliance Readiness (B2B)","href":"/docs/get-started/architecture-scenarios/business-to-business/launch/compliance-readiness"},{"title":"Support Readiness (B2B)","href":"/docs/get-started/architecture-scenarios/business-to-business/launch/support-readiness"},{"title":"Launch Day Preparation (B2B)","href":"/docs/get-started/architecture-scenarios/business-to-business/launch/launch-day"}]}]},{"title":"Business to Employees","href":"/docs/get-started/architecture-scenarios/b2e"}]},{"group":"Application Architecture","pages":[{"group":"Multiple Organization Architecture","root":{"title":"Multiple Organization Architecture","href":"/docs/get-started/architecture-scenarios/multiple-organization-architecture"},"pages":[{"group":"Single Identity Provider Organizations","root":{"sidebarTitle":"Overview","title":"Single Identity Provider Organizations","href":"/docs/get-started/architecture-scenarios/multiple-organization-architecture/single-identity-provider-organizations"},"pages":[{"title":"Single Identity Provider: Provisioning","href":"/docs/get-started/architecture-scenarios/multiple-organization-architecture/single-identity-provider-organizations/provisioning"},{"title":"Single Identity Provider: Authentication","href":"/docs/get-started/architecture-scenarios/multiple-organization-architecture/single-identity-provider-organizations/authentication"},{"title":"Single Identity Provider: Branding","href":"/docs/get-started/architecture-scenarios/multiple-organization-architecture/single-identity-provider-organizations/branding"},{"title":"Single Identity Provider: Authorization","href":"/docs/get-started/architecture-scenarios/multiple-organization-architecture/single-identity-provider-organizations/authorization"},{"title":"Single Identity Provider: Profile Management","href":"/docs/get-started/architecture-scenarios/multiple-organization-architecture/single-identity-provider-organizations/profile-management"},{"title":"Single Identity Provider: Logout","href":"/docs/get-started/architecture-scenarios/multiple-organization-architecture/single-identity-provider-organizations/logout"}]},{"title":"Multiple Identity Provider Organizations","href":"/docs/get-started/architecture-scenarios/multiple-organization-architecture/multiple-idp-orgs"}]},{"group":"SSO for Regular Web Apps","root":{"title":"Regular Web Applications with Single Sign-On","href":"/docs/get-started/architecture-scenarios/sso-for-regular-web-apps"},"pages":[{"title":"Solution Overview (Web Apps + SSO)","href":"/docs/get-started/architecture-scenarios/sso-for-regular-web-apps/part-1"},{"title":"Auth0 Configuration (Web Apps + SSO)","href":"/docs/get-started/architecture-scenarios/sso-for-regular-web-apps/part-2"},{"title":"Application Implementation (Web Apps + SSO)","href":"/docs/get-started/architecture-scenarios/sso-for-regular-web-apps/part-3"},{"title":"ASP.NET Core Implementation (Web Apps + SSO)","href":"/docs/get-started/architecture-scenarios/sso-for-regular-web-apps/implementation-aspnetcore"},{"title":"Conclusion (Web Apps + SSO)","href":"/docs/get-started/architecture-scenarios/sso-for-regular-web-apps/part-4"}]},{"group":"Server Application + API","root":{"title":"Server Applications with API","href":"/docs/get-started/architecture-scenarios/server-application-api"},"pages":[{"title":"Solution Overview (Server Apps + API)","href":"/docs/get-started/architecture-scenarios/server-application-api/part-1"},{"title":"Auth0 Configuration (Server Apps + API)","href":"/docs/get-started/architecture-scenarios/server-application-api/part-2"},{"title":"Application Implementation (Server Apps + API)","href":"/docs/get-started/architecture-scenarios/server-application-api/part-3"},{"title":"Server Apps + API: Node.js Implementation for the API","href":"/docs/get-started/architecture-scenarios/server-application-api/api-implementation-nodejs"},{"title":"Server Apps + API: Python Implementation for the Cron Job","href":"/docs/get-started/architecture-scenarios/server-application-api/cron-implementation-python"},{"title":"Conclusion (Server Apps + API)","href":"/docs/get-started/architecture-scenarios/server-application-api/part-4"}]},{"group":"SPA + API","root":{"title":"Single-Page Applications (SPA) with API","href":"/docs/get-started/architecture-scenarios/spa-api"},"pages":[{"title":"Solution Overview (SPAs + API)","href":"/docs/get-started/architecture-scenarios/spa-api/part-1"},{"title":"Auth0 Configuration (SPAs + API)","href":"/docs/get-started/architecture-scenarios/spa-api/part-2"},{"title":"API and SPA Configuration (SPAs + API)","href":"/docs/get-started/architecture-scenarios/spa-api/part-3"},{"title":"SPA Angular 2 Implementation (SPAs + API)","href":"/docs/get-started/architecture-scenarios/spa-api/spa-implementation-angular2"},{"title":"Node.js API Implementation (SPAs + API)","href":"/docs/get-started/architecture-scenarios/spa-api/api-implementation-nodejs"},{"title":"Conclusion (SPAs + API)","href":"/docs/get-started/architecture-scenarios/spa-api/part-4"}]},{"group":"Mobile + API","root":{"title":"Mobile Applications with API","href":"/docs/get-started/architecture-scenarios/mobile-api"},"pages":[{"title":"Solution Overview (Mobile Apps + API)","href":"/docs/get-started/architecture-scenarios/mobile-api/part-1"},{"title":"Auth0 Configuration (Mobile Apps + API)","href":"/docs/get-started/architecture-scenarios/mobile-api/part-2"},{"title":"API and Mobile Configuration (Mobile Apps + API)","href":"/docs/get-started/architecture-scenarios/mobile-api/part-3"},{"title":"Android Mobile Application Implementation (Mobile Apps + API)","href":"/docs/get-started/architecture-scenarios/mobile-api/mobile-implementation-android"},{"title":"Node.js API Implementation (Mobile Apps + API)","href":"/docs/get-started/architecture-scenarios/mobile-api/api-implementation-nodejs"},{"title":"Conclusion (Mobile Apps + API)","href":"/docs/get-started/architecture-scenarios/mobile-api/part-4"}]}]},{"group":"Implementation Help","pages":[{"title":"Implementation Planning Checklists","sidebarTitle":"Checklists","href":"/docs/get-started/architecture-scenarios/checklists"},{"title":"Implementation Resources","sidebarTitle":"Resources","href":"/docs/get-started/architecture-scenarios/implementation-resources"}]}]}]},{"group":"Quickstarts","pages":[{"title":"Auth0 Quickstarts","sidebarTitle":"Quickstarts","href":"/docs/quickstarts"},{"group":"Single Page App","pages":[{"title":"Add Login to Your React Application","sidebarTitle":"React","mode":"wide","href":"/docs/quickstart/spa/react"},{"title":"Add Login to Your Angular Application","sidebarTitle":"Angular","mode":"wide","href":"/docs/quickstart/spa/angular"},{"mode":"wide","sidebarTitle":"JavaScript","title":"Add Login to Your JavaScript Application","href":"/docs/quickstart/spa/vanillajs"},{"mode":"wide","sidebarTitle":"Cap'n Web","title":"Add Login to Your Cap'n Web Application","href":"/docs/quickstart/spa/capn-web"},{"title":"Add Login to Your Vue Application","sidebarTitle":"Vue","mode":"wide","href":"/docs/quickstart/spa/vuejs"},{"mode":"wide","sidebarTitle":"Flutter (Web)","title":"Add Login to Your Flutter Web Application","href":"/docs/quickstart/spa/flutter"},{"mode":"wide","sidebarTitle":"Svelte","title":"Add Login to Your Svelte Application","href":"/docs/quickstart/spa/svelte"}]},{"group":"Regular Web App","pages":[{"title":"Add Login to Your Next.js Application","sidebarTitle":"Next.js","mode":"wide","href":"/docs/quickstart/webapp/nextjs"},{"title":"Add Login to Your TanStack Start Application","sidebarTitle":"TanStack Start React","mode":"wide","href":"/docs/quickstart/webapp/tanstack-start"},{"title":"Add Login to Your React Router Application","sidebarTitle":"React Router","mode":"wide","href":"/docs/quickstart/webapp/react-router"},{"title":"Add Login to Your Nuxt.js Application","sidebarTitle":"Nuxt.js","mode":"wide","href":"/docs/quickstart/webapp/nuxt"},{"mode":"wide","sidebarTitle":"Express","title":"Add Login to Your Express Application","href":"/docs/quickstart/webapp/express"},{"mode":"wide","title":"Add Login to Your Express Application","sidebarTitle":"Express (Beta)","href":"/docs/quickstart/webapp/express-beta"},{"title":"Add Login to Your Fastify Application","sidebarTitle":"Fastify","mode":"wide","href":"/docs/quickstart/webapp/fastify"},{"mode":"wide","sidebarTitle":"Flask","title":"Add Login to Your Flask Application","href":"/docs/quickstart/webapp/python"},{"mode":"wide","sidebarTitle":"Django","title":"Add Login to your Django Application","href":"/docs/quickstart/webapp/django/interactive"},{"mode":"wide","sidebarTitle":"FastAPI","title":"Add Login to Your FastAPI Application","href":"/docs/quickstart/webapp/fastapi"},{"mode":"wide","sidebarTitle":"Go","title":"Add Login to Your Go Application","href":"/docs/quickstart/webapp/golang"},{"mode":"wide","sidebarTitle":"Java","title":"Add Login to Your Java Servlet Application","href":"/docs/quickstart/webapp/java"},{"mode":"wide","sidebarTitle":"Java EE","title":"Add Login to Your Java EE Application","href":"/docs/quickstart/webapp/java-ee"},{"title":"Java Spring Boot","href":"/docs/quickstart/webapp/java-spring-boot"},{"mode":"wide","sidebarTitle":"Blazor Server","title":"Add Login to Your Blazor Server Application","href":"/docs/quickstart/webapp/aspnet-core-blazor-server"},{"mode":"wide","sidebarTitle":"ASP.NET Core MVC","title":"Add Login to Your ASP.NET MVC Application","href":"/docs/quickstart/webapp/aspnet-core"},{"title":"Add Login to Your Laravel Application","sidebarTitle":"Laravel","mode":"wide","href":"/docs/quickstart/webapp/laravel/interactive"},{"mode":"wide","sidebarTitle":"PHP","title":"Add Login to Your PHP Application","href":"/docs/quickstart/webapp/php/interactive"},{"mode":"wide","title":"NGINX Plus","href":"/docs/quickstart/webapp/nginx-plus/interactive"},{"mode":"wide","sidebarTitle":"Apache","title":"Add Login to Your Apache Application","href":"/docs/quickstart/webapp/apache/index"},{"mode":"wide","sidebarTitle":"Ruby on Rails","title":"Add Login to Your Ruby on Rails Application","href":"/docs/quickstart/webapp/rails/interactive"},{"title":"Add Login to Your Hono Application","mode":"wide","sidebarTitle":"Hono","href":"/docs/quickstart/webapp/hono"},{"title":"Add Login to Your ASP.NET OWIN Application","sidebarTitle":"ASP.NET OWIN","href":"/docs/quickstart/webapp/aspnet-owin"}]},{"group":"Native/Mobile App","pages":[{"title":"Add Login to Your iOS or macOS Application using the Auth0.swift SDK","sidebarTitle":"iOS / macOS","mode":"wide","href":"/docs/quickstart/native/ios-swift"},{"title":"Add Login to Your Android Application using the Auth0.Android SDK","sidebarTitle":"Android","mode":"wide","href":"/docs/quickstart/native/android"},{"mode":"wide","sidebarTitle":"Android Facebook Login","title":"Add Native Facebook Login to Your Android Application","href":"/docs/quickstart/native/android-facebook-login"},{"mode":"wide","sidebarTitle":"iOS Facebook Login","title":"Add Native Facebook Login to Your iOS Application","href":"/docs/quickstart/native/ios-swift-facebook-login"},{"title":"Add Login to Your React Native Application","sidebarTitle":"React Native","mode":"wide","href":"/docs/quickstart/native/react-native"},{"title":"Add Login to Your Expo Application","sidebarTitle":"Expo","mode":"wide","href":"/docs/quickstart/native/react-native-expo"},{"title":"Add Login to Your Flutter Application","sidebarTitle":"Flutter","mode":"wide","href":"/docs/quickstart/native/flutter"},{"title":"Add Login to Your Flutter Windows Application","sidebarTitle":"Flutter Windows","mode":"wide","href":"/docs/quickstart/native/flutter-windows"},{"title":"Add Login to Your Kotlin Multiplatform Application using the Auth0 Kotlin Multiplatform SDK","sidebarTitle":"Kotlin Multiplatform","mode":"wide","href":"/docs/quickstart/native/kotlin-multiplatform"},{"mode":"wide","sidebarTitle":".NET Android \u0026 iOS","title":"Add Login to Your .NET Android \u0026 iOS Application","href":"/docs/quickstart/native/net-android-ios/index"},{"title":"Add login to your .NET MAUI application","sidebarTitle":"MAUI","mode":"wide","href":"/docs/quickstart/native/maui"},{"title":"Add Login to Your Ionic Angular with Capacitor Application","sidebarTitle":"Ionic \u0026 Capacitor (Angular)","mode":"wide","href":"/docs/quickstart/native/ionic-angular"},{"title":"Add Login to Your Ionic React with Capacitor Application","sidebarTitle":"Ionic \u0026 Capacitor (React)","mode":"wide","href":"/docs/quickstart/native/ionic-react"},{"title":"Add Login to Your Ionic Vue with Capacitor Application","sidebarTitle":"Ionic \u0026 Capacitor (Vue)","mode":"wide","href":"/docs/quickstart/native/ionic-vue"},{"mode":"wide","sidebarTitle":"UWP","title":"Add login to your UWP application","href":"/docs/quickstart/native/windows-uwp-csharp"},{"mode":"wide","title":"Device Authorization Flow","href":"/docs/quickstart/native/device/interactive"},{"mode":"wide","title":"Add Login to Your WPF or WinForms Application","sidebarTitle":"WPF / WinForms","href":"/docs/quickstart/native/wpf-winforms"}]},{"group":"Backend/API","pages":[{"title":"Protect Your Express.js API","sidebarTitle":"Express API","mode":"wide","href":"/docs/quickstart/backend/nodejs"},{"mode":"wide","title":"Protect Your Express.js API","sidebarTitle":"Express API (Beta)","href":"/docs/quickstart/backend/express-api-beta"},{"mode":"wide","sidebarTitle":"Fastify API","title":"Protect Your Fastify API","href":"/docs/quickstart/backend/fastify/index"},{"mode":"wide","sidebarTitle":"Django API","title":"Add Authorization to Your Django API Application","href":"/docs/quickstart/backend/django/interactive"},{"title":"Flask API","href":"/docs/quickstart/backend/python/index"},{"mode":"wide","sidebarTitle":"FastAPI API","title":"FastAPI API","href":"/docs/quickstart/backend/fastapi"},{"title":"Java Springboot API","href":"/docs/quickstart/backend/java-spring-security5"},{"title":"Protect Your Go API","sidebarTitle":"Go API","mode":"wide","href":"/docs/quickstart/backend/golang"},{"mode":"wide","title":"ASP.NET Core Web API","href":"/docs/quickstart/backend/aspnet-core-webapi"},{"mode":"wide","title":"ASP.NET Web API (OWIN): Authorization","sidebarTitle":"ASP.NET Web API (OWIN)","href":"/docs/quickstart/backend/webapi-owin"},{"mode":"wide","sidebarTitle":"Laravel API","title":"Add Authorization to Your Laravel Application","href":"/docs/quickstart/backend/laravel/interactive"},{"mode":"wide","sidebarTitle":"PHP API","title":"Add Authorization to Your PHP Application","href":"/docs/quickstart/backend/php/interactive"},{"mode":"wide","sidebarTitle":"Ruby on Rails API","title":"Add Authorization to Your Ruby on Rails API","href":"/docs/quickstart/backend/rails/interactive"}]}]},{"group":"AI Tools","root":{"title":"AI Tools","href":"/docs/get-started/ai-tools"},"expanded":true,"directory":"accordion","pages":[{"title":"Agent Skills for Auth0","href":"/docs/quickstart/agent-skills"},{"group":"Auth0 Model Context Protocol (MCP) Server","pages":[{"title":"Getting Started with Auth0 Model Context Protocol (MCP) Server","sidebarTitle":"Getting Started","href":"/docs/get-started/auth0-mcp-server/getting-started-with-auth0-mcp-server"},{"group":"Guides","root":{"sidebarTitle":"Overview","title":"Auth0 Model Context Protocol (MCP) Server Guides","href":"/docs/get-started/auth0-mcp-server/auth0-mcp-server-guides"},"pages":[{"title":"Streamline API Authorization Flows with Auth0 Model Context Protocol (MCP) Server","sidebarTitle":"Streamline API Authorization Flows","href":"/docs/get-started/auth0-mcp-server/auth0-mcp-server-guides/streamline-api-authorization-flows-with-auth0-model-context-protocol-mcp"},{"title":"Implement Advanced Security Monitoring with Auth0 Model Context Protocol (MCP) Server","sidebarTitle":"Implement Advanced Security Monitoring","href":"/docs/get-started/auth0-mcp-server/auth0-mcp-server-guides/implement-advanced-security-monitoring-with-auth0-model-context-protocol-mcp"},{"title":"Understanding Scopes","href":"/docs/get-started/auth0-mcp-server/auth0-mcp-server-guides/understanding-scopes"}]},{"title":"Auth0 Model Context Protocol (MCP) Server Tools Reference","sidebarTitle":"Tools Reference","href":"/docs/get-started/auth0-mcp-server/auth0-mcp-tools-reference"}]},{"title":"Auth0 Agent Experience Score","href":"/docs/get-started/auth0-agent-experience"},{"title":"AI Doc Tools","href":"/docs/get-started/build-with-ai-tools"},{"title":"Auth0 Guide","href":"/docs/get-started/auth0-guide"}]},{"group":"Auth0 Configuration","root":{"sidebarTitle":"Overview","title":"Auth0 Overview","href":"/docs/get-started/auth0-overview"},"expanded":true,"directory":"accordion","pages":[{"group":"Auth0 Dashboard","root":{"title":"Auth0 Dashboard","href":"/docs/get-started/auth0-overview/dashboard"},"pages":[{"title":"Navigate Auth0 Dashboard","sidebarTitle":"Navigate Auth0 Dashboard","href":"/docs/get-started/auth0-overview/dashboard/use-dashboard-navigation"},{"title":"About the Activity Page","href":"/docs/get-started/auth0-overview/dashboard/activity"},{"title":"Search Capabilities in Auth0 Dashboard","href":"/docs/get-started/auth0-overview/dashboard/search-and-filter-auth0-dashboard"},{"group":"Manage Dashboard Access","root":{"title":"Manage Dashboard Access","href":"/docs/get-started/manage-dashboard-access"},"pages":[{"title":"Dashboard Access by Role","href":"/docs/get-started/manage-dashboard-access/feature-access-by-role"},{"title":"Add Tenant Members","href":"/docs/get-started/manage-dashboard-access/add-dashboard-users"},{"title":"Edit Tenant Members","href":"/docs/get-started/manage-dashboard-access/edit-dashboard-users"},{"title":"Remove Tenant Members","href":"/docs/get-started/manage-dashboard-access/remove-dashboard-users"},{"title":"Update Dashboard User Email Addresses","href":"/docs/get-started/manage-dashboard-access/update-dashboard-user-email"},{"group":"Multi-factor authentication for Dashboard users","pages":[{"title":"Multi-Factor Authentication for Dashboard Users","href":"/docs/get-started/manage-dashboard-access/add-change-remove-mfa"},{"title":"Add Multi-Factor Authentication for Auth0 Dashboard Access","href":"/docs/get-started/manage-dashboard-access/add-change-remove-mfa/add-mfa"},{"title":"Remove or Change Dashboard Multi-Factor Authentication","href":"/docs/get-started/manage-dashboard-access/add-change-remove-mfa/remove-or-change-dashboard-multi-factor-authentication"}]},{"title":"Configure Single Sign-on for Auth0 Dashboard","href":"/docs/get-started/manage-dashboard-access/configure-single-sign-on-for-auth0-dashboard"}]},{"title":"Auth0 Dashboard Login Session Management","href":"/docs/get-started/dashboard-profile/auth0-dashboard-login-session-management"},{"title":"Light and Dark Themes","href":"/docs/get-started/dashboard-profile/light-and-dark-themes"}]},{"group":"Tenants","root":{"title":"Auth0 Tenants","href":"/docs/get-started/auth0-overview/create-tenants"},"pages":[{"title":"Create Multiple Tenants","href":"/docs/get-started/auth0-overview/create-tenants/create-multiple-tenants"},{"title":"Link Multiple Tenants to a Single Subscription","href":"/docs/get-started/auth0-overview/create-tenants/child-tenants"},{"title":"Set Up Multiple Environments","href":"/docs/get-started/auth0-overview/create-tenants/set-up-multiple-environments"},{"title":"Multi-Tenant Applications Best Practices","href":"/docs/get-started/auth0-overview/create-tenants/multi-tenant-apps-best-practices"},{"group":"Tenant Settings","root":{"sidebarTitle":"Overview","title":"Tenant Settings","href":"/docs/get-started/tenant-settings"},"pages":[{"group":"Signing Keys","pages":[{"title":"Signing Keys","sidebarTitle":"Overview","href":"/docs/get-started/tenant-settings/signing-keys"},{"title":"Rotate Signing Keys","href":"/docs/get-started/tenant-settings/signing-keys/rotate-signing-keys"},{"title":"Revoke Signing Keys","href":"/docs/get-started/tenant-settings/signing-keys/revoke-signing-keys"},{"title":"View Signing Certificates","href":"/docs/get-started/tenant-settings/signing-keys/view-signing-certificates"},{"title":"Customer Provided Public Signing Keys","href":"/docs/get-started/tenant-settings/signing-keys/customer-signing-keys"}]},{"title":"Configure Device User Code Settings","href":"/docs/get-started/tenant-settings/configure-device-user-code-settings"},{"title":"Enable Single Sign-On for Tenants","href":"/docs/get-started/tenant-settings/enable-sso-for-legacy-tenants"},{"title":"Find Your Tenant Name or Tenant ID","href":"/docs/get-started/tenant-settings/find-your-tenant-name-or-tenant-id"}]}]},{"group":"APIs","root":{"title":"APIs","href":"/docs/get-started/apis"},"pages":[{"title":"Register APIs","href":"/docs/get-started/auth0-overview/set-up-apis"},{"title":"API Settings","href":"/docs/get-started/apis/api-settings"},{"title":"API Access Policies for Applications","href":"/docs/get-started/apis/api-access-policies-for-applications"},{"title":"Add API Permissions","href":"/docs/get-started/apis/add-api-permissions"},{"title":"Delete API Permissions","href":"/docs/get-started/apis/delete-api-permissions"},{"group":"Scopes","root":{"title":"Scopes","href":"/docs/get-started/apis/scopes"},"pages":[{"title":"API Scopes","href":"/docs/get-started/apis/scopes/api-scopes"},{"title":"OpenID Connect Scopes","href":"/docs/get-started/apis/scopes/openid-connect-scopes"},{"title":"Sample Use Cases: Scopes and Claims","href":"/docs/get-started/apis/scopes/sample-use-cases-scopes-and-claims"}]},{"title":"Configure Access Token Profile","href":"/docs/get-started/apis/configure-access-token-profile"},{"title":"Configure JSON Web Encryption (JWE)","href":"/docs/get-started/apis/configure-json-web-encryption"},{"title":"Configure Logical API for Multiple APIs","href":"/docs/get-started/apis/set-logical-api"},{"title":"Configure Rich Authorization Requests (RAR)","href":"/docs/get-started/apis/configure-rich-authorization-requests"},{"title":"Create Machine-to-Machine Applications for Testing","href":"/docs/get-started/apis/create-m2m-app-test"},{"title":"Enable Role-Based Access Control for APIs","href":"/docs/get-started/apis/enable-role-based-access-control-for-apis"}]},{"group":"Auth0 Teams","root":{"title":"Auth0 Teams","href":"/docs/get-started/auth0-teams"},"pages":[{"title":"Tenant Management","href":"/docs/get-started/auth0-teams/tenant-management"},{"title":"Team Member Management","href":"/docs/get-started/auth0-teams/team-member-management"},{"title":"Tenant Member Management","href":"/docs/get-started/auth0-teams/tenant-member-management"},{"title":"Configure Security Policies","href":"/docs/get-started/auth0-teams/configure-security-policies"},{"title":"Troubleshoot Teams","href":"/docs/get-started/auth0-teams/troubleshoot-teams"},{"title":"Team Activity","href":"/docs/get-started/auth0-teams/team-activity"},{"title":"About the Quarterly Snapshot","href":"/docs/get-started/auth0-teams/quarterly-snapshot"}]},{"group":"Deployment","root":{"title":"Deployment Options","href":"/docs/deploy-monitor/deployment-options"},"pages":[{"group":"Private Cloud Deployments","root":{"sidebarTitle":"Overview","title":"Private Cloud Deployments","href":"/docs/deploy-monitor/deploy-private-cloud"},"pages":[{"title":"Private Cloud on AWS","href":"/docs/deploy-monitor/deploy-private-cloud/private-cloud-on-aws"},{"title":"Private Cloud on Azure","href":"/docs/deploy-monitor/deploy-private-cloud/private-cloud-on-azure"},{"title":"Private Cloud Add-on Features","href":"/docs/deploy-monitor/deploy-private-cloud/private-cloud-add-on-features"}]},{"group":"Pre-Deployment Checks","root":{"sidebarTitle":"Overview","title":"Pre-Deployment Checks","href":"/docs/deploy-monitor/pre-deployment-checks"},"pages":[{"title":"Run Production Readiness Checks","href":"/docs/deploy-monitor/pre-deployment-checks/how-to-run-production-checks"},{"title":"Production Readiness Checks: Critical Fixes","href":"/docs/deploy-monitor/pre-deployment-checks/production-check-required-fixes"},{"title":"Production Readiness Checks: Non-Critical Fixes","href":"/docs/deploy-monitor/pre-deployment-checks/production-check-recommended-fixes"},{"title":"Production Readiness Checks: Best Practices","href":"/docs/deploy-monitor/pre-deployment-checks/production-checks-best-practices"},{"title":"Run Pre-Deployment Tests","href":"/docs/deploy-monitor/pre-deployment-checks/predeployment-tests"},{"title":"Pre-Launch Tips","href":"/docs/deploy-monitor/pre-deployment-checks/pre-launch-tips"}]},{"title":"Deployment Checklist","href":"/docs/deploy-monitor/deploy-checklist"},{"title":"Deployment Best Practices","href":"/docs/deploy-monitor/deployment-best-practices"}]},{"group":"B2B Connect - Enterprise","root":{"title":"B2B Connect - Enterprise","href":"/docs/get-started/b2b-connect-enterprise"},"pages":[{"title":"Configure AWS Cognito with Auth0 B2B Connect","href":"/docs/get-started/b2b-connect-enterprise/configure-aws-cognito"},{"title":"Configure Keycloak with Auth0 B2B Connect","href":"/docs/get-started/b2b-connect-enterprise/configure-keycloak"},{"title":"Configure Ory with Auth0 B2B Connect","href":"/docs/get-started/b2b-connect-enterprise/configure-ory"}]}]},{"group":"Applications","pages":[{"group":"Application Types","root":{"title":"Application Types on Auth0","href":"/docs/get-started/applications"},"pages":[{"title":"Confidential and Public Applications","sidebarTitle":"Confidential and Public","href":"/docs/get-started/applications/confidential-and-public-applications"},{"title":"First-Party and Third-Party Applications","href":"/docs/get-started/applications/first-party-and-third-party-applications"},{"title":"Application Profiles","href":"/docs/get-started/applications/application-profiles"}]},{"group":"Register Applications","root":{"title":"Create Applications","href":"/docs/get-started/auth0-overview/create-applications"},"pages":[{"group":"Client ID Metadata Document (CIMD) Registration","root":{"title":"Client ID Metadata Document (CIMD) Registration","href":"/docs/get-started/auth0-overview/create-applications/cimd-overview"},"pages":[{"title":"Register Applications with CIMD","href":"/docs/get-started/auth0-overview/create-applications/register-applications-with-cimd"},{"title":"CIMD Validation Rules","href":"/docs/get-started/auth0-overview/create-applications/cimd-validation-rules"}]},{"title":"Register Native Applications","href":"/docs/get-started/auth0-overview/create-applications/native-apps"},{"title":"Register Single-Page Web Applications","href":"/docs/get-started/auth0-overview/create-applications/single-page-web-apps"},{"title":"Register Regular Web Applications","href":"/docs/get-started/auth0-overview/create-applications/regular-web-apps"},{"title":"Register Machine-to-Machine Applications","href":"/docs/get-started/auth0-overview/create-applications/machine-to-machine-apps"},{"title":"Configure an Identity Provider in Access Gateway","href":"/docs/get-started/auth0-overview/create-applications/configure-an-identity-provider-in-access-gateway"},{"title":"Dynamic Client Registration","href":"/docs/get-started/applications/dynamic-client-registration"},{"title":"Remove Applications","href":"/docs/get-started/applications/remove-applications"}]},{"group":"Configure Applications","pages":[{"title":"Application Settings","href":"/docs/get-started/applications/application-settings"},{"title":"Credential Settings","href":"/docs/get-started/applications/credentials"},{"title":"Subdomain URL Placeholders","href":"/docs/get-started/applications/wildcards-for-subdomains"},{"title":"How to Configure Application (Client) Metadata","sidebarTitle":"Configure Metadata","href":"/docs/get-started/applications/configure-application-metadata"},{"group":"Third-Party Applications","root":{"title":"Third-Party Applications","href":"/docs/get-started/applications/third-party-applications"},"pages":[{"title":"Security Controls for Third-Party Applications","href":"/docs/get-started/applications/third-party-applications/security-controls"},{"title":"User Consent and Third-Party Applications","href":"/docs/get-started/applications/third-party-applications/user-consent-and-third-party-applications"},{"title":"Configure Third-Party Applications","href":"/docs/get-started/applications/third-party-applications/configure-third-party-applications"},{"title":"Troubleshoot Third-Party Applications","href":"/docs/get-started/applications/third-party-applications/troubleshooting"},{"title":"Permissive Mode for Third-Party Applications","href":"/docs/get-started/applications/third-party-applications/permissive-mode"}]}]},{"group":"Connections and Grant Types","pages":[{"title":"Set Up Database Connections","href":"/docs/get-started/applications/set-up-database-connections"},{"title":"Test Database Connections","href":"/docs/get-started/applications/test-database-connections"},{"title":"Update Application Connections","href":"/docs/get-started/applications/update-application-connections"},{"title":"Application Grant Types","href":"/docs/get-started/applications/application-grant-types"},{"title":"Update Grant Types","href":"/docs/get-started/applications/update-grant-types"},{"title":"Application Access to APIs: Client Grants","href":"/docs/get-started/applications/application-access-to-apis-client-grants"},{"title":"Revoke Access to APIs Using Application Grants","href":"/docs/get-started/applications/revoke-api-access"},{"title":"Enable Single Sign-On Integrations for Applications","href":"/docs/get-started/applications/enable-sso-for-applications"}]},{"group":"Security and Compliance","pages":[{"title":"Signing Algorithms","href":"/docs/get-started/applications/signing-algorithms"},{"title":"Change Application Signing Algorithms","href":"/docs/get-started/applications/change-application-signing-algorithms"},{"title":"Rotate Credentials","href":"/docs/get-started/applications/rotate-credentials"},{"title":"Rotate Client Secrets","href":"/docs/get-started/applications/rotate-client-secret"},{"group":"Configure FAPI Compliance","root":{"title":"Configure FAPI Compliance","href":"/docs/get-started/applications/configure-fapi-compliance"},"pages":[{"title":"Configure Auth0 to pass OpenID FAPI Certification Tests","href":"/docs/get-started/applications/configure-fapi-compliance/configure-auth0-to-pass-openid-fapi-certification-tests"}]},{"title":"Configure Pushed Authorization Requests (PAR)","href":"/docs/get-started/applications/configure-par"},{"title":"Configure JWT-secured Authorization Requests (JAR)","href":"/docs/get-started/applications/configure-jar"},{"group":"Configure mTLS Authentication","root":{"title":"Configure mTLS Authentication","href":"/docs/get-started/applications/configure-mtls"},"pages":[{"title":"Set up the Customer Edge","href":"/docs/get-started/applications/configure-mtls/set-up-the-customer-edge"},{"title":"Configure mTLS Authentication for a Tenant","href":"/docs/get-started/applications/configure-mtls/configure-mtls-for-a-tenant"},{"title":"Configure mTLS Authentication for a Client","href":"/docs/get-started/applications/configure-mtls/configure-mtls-for-a-client"}]},{"title":"Configure Private Key JWT Authentication","href":"/docs/get-started/applications/configure-private-key-jwt"},{"title":"Configure Client-Initiated Backchannel Authentication","href":"/docs/get-started/applications/configure-client-initiated-backchannel-authentication"}]},{"group":"Platform and Deployment","pages":[{"title":"Enable Android App Links Support","href":"/docs/get-started/applications/enable-android-app-links-support"},{"title":"Enable Universal Links Support in Apple Xcode","href":"/docs/get-started/applications/enable-universal-links-support-in-apple-xcode"},{"title":"Configure Cross-Origin Resource Sharing","href":"/docs/get-started/applications/set-up-cors"},{"title":"Configure Applications with OIDC Discovery","href":"/docs/get-started/applications/configure-applications-with-oidc-discovery"},{"title":"Configure WS-Fed Applications","href":"/docs/get-started/applications/configure-ws-fed-applications"},{"title":"Test Applications Locally","href":"/docs/get-started/applications/work-with-auth0-locally"}]}]}]},{"tab":"Authenticate","icon":"lock-keyhole","pages":[{"title":"Authenticate","href":"/docs/authenticate"}]},{"tab":"Manage Users","icon":"user-group","directory":"accordion","pages":[{"title":"Manage Users","href":"/docs/manage-users"}]},{"tab":"Brand","icon":"swatchbook","directory":"accordion","pages":[{"title":"Brand","href":"/docs/customize"}]},{"tab":"Extend","icon":"arrow-up-small-big","directory":"accordion","pages":[{"title":"Extend","href":"/docs/extend"}]},{"tab":"Secure","icon":"shield-check","pages":[{"title":"Secure","href":"/docs/secure"}]},{"tab":"Monitor","icon":"chart-simple","directory":"accordion","pages":[{"title":"Monitor","href":"/docs/deploy-monitor"}]},{"tab":"AI Agents \u0026 MCP","icon":"robot","directory":"accordion","pages":[{"title":"AI Agents \u0026 MCP","href":"/docs/ai-agents-mcp"}]},{"tab":"Platform","icon":"credit-card","pages":[{"title":"Platform","href":"/docs/troubleshoot"}]},{"tab":"Dev Tools","icon":"code-simple","menu":[{"item":"APIs","icon":"code-pull-request","pages":[{"title":"APIs","href":"/docs/api"}]},{"item":"CLIs","icon":"terminal","pages":[{"title":"CLIs","href":"/docs/deploy-monitor/auth0-cli"}]},{"item":"SDKs","icon":"cube","dropdowns":[{"dropdown":"SDK Libraries","icon":"book","description":"","pages":[{"title":"SDK Libraries","href":"/docs/libraries"}]},{"dropdown":"auth0-spa-js","icon":"book-open","description":"version: v2.30.0","pages":[{"title":"auth0-spa-js","href":"/docs/sdk/auth0-spa-js/functions/createAuth0Client"}]},{"dropdown":"auth0-react","icon":"book-open","description":"version: v2.30.0","pages":[{"title":"auth0-react","href":"/docs/sdk/auth0-react/functions/Auth0Provider"}]},{"dropdown":"auth0-acul-js","icon":"book-open","description":"","pages":[{"title":"auth0-acul-js","href":"/docs/libraries/acul/js-sdk"}]},{"dropdown":"auth0-acul-react","icon":"book-open","description":"","pages":[{"title":"auth0-acul-react","href":"/docs/libraries/acul/react-sdk"}]},{"dropdown":"auth0-android","icon":"book-open","description":"","pages":[{"title":"auth0-android","href":"/docs/libraries/auth0-android/auth0-android-configuration"}]},{"dropdown":"auth0-php","icon":"book-open","description":"","pages":[{"title":"auth0-php","href":"/docs/libraries/auth0-php"}]}]},{"item":"Universal Components","icon":"objects-column","pages":[{"title":"Universal Components","href":"/docs/get-started/universal-components/universal-components-overview"}]}],"pages":[{"title":"Dev Tools","href":"/docs/api"}]},{"tab":"auth0-spa-js","hidden":true,"pages":[{"title":"auth0-spa-js","href":"/docs/sdk/auth0-spa-js/package-overview"}]},{"tab":"auth0-react","hidden":true,"pages":[{"title":"auth0-react","href":"/docs/sdk/auth0-react/package-overview"}]}]},{"language":"fr-ca","footer":{"socials":{"x-twitter":"https://x.com/auth0","github":"https://github.com/auth0","linkedin":"https://www.linkedin.com/company/auth0"},"links":[{"header":"Développeurs","items":[{"label":"Espace développeurs","href":"https://developer.auth0.com"},{"label":"Exemples de code et guides","href":"https://developer.auth0.com/resources"},{"label":"Infolettre Zero Index","href":"https://auth0.com/blog/newsletter"},{"label":"Blogue","href":"https://auth0.com/blog"},{"label":"Journal des modifications","href":"https://auth0.com/changelog"}]},{"header":"Documentation","items":[{"label":"Documentation","href":"https://auth0.com/docs"},{"label":"Guides de démarrage rapide","href":"https://auth0.com/docs/quickstarts"},{"label":"API","href":"https://auth0.com/docs/api"},{"label":"Bibliothèques SDK","href":"https://auth0.com/docs/libraries"},{"label":"Apprendre","href":"https://auth0.com/learn"},{"label":"Introduction à l’IAM (CIAM)","href":"https://auth0.com/intro-to-iam"},{"label":"Rapports","href":"https://auth0.com/resources/whitepapers"},{"label":"Webinaires","href":"https://auth0.com/resources/webinars"}]},{"header":"Centre d’assistance","items":[{"label":"Communauté","href":"https://community.auth0.com"},{"label":"Aide","href":"https://support.auth0.com"},{"label":"Foire aux questions","href":"https://auth0.com/docs/troubleshoot"},{"label":"Auth0","href":"https://auth0.com"}]},{"header":"Entreprise","items":[{"label":"Nos clients","href":"https://auth0.com/customers"},{"label":"Conformité","href":"https://auth0.com/security"},{"label":"Partenaires","href":"https://auth0.com/partners"},{"label":"Carrières","href":"https://www.okta.com/company/careers"},{"label":"Okta + Auth0","href":"https://www.okta.com/okta-and-auth0"},{"label":"À propos de nous","href":"https://auth0.com/about"}]}]},"pages":[{"title":"fr-ca","href":"/docs/fr-ca/get-started/architecture-scenarios/business-to-business/authentication"}]},{"language":"ja-jp","footer":{"socials":{"x-twitter":"https://x.com/auth0","github":"https://github.com/auth0","linkedin":"https://www.linkedin.com/company/auth0"},"links":[{"header":"開発者向け","items":[{"label":"開発者ハブ","href":"https://developer.auth0.com"},{"label":"コードサンプルとガイド","href":"https://developer.auth0.com/resources"},{"label":"Zero Index Newsletter","href":"https://auth0.com/blog/newsletter"},{"label":"ブログ","href":"https://auth0.com/blog"},{"label":"変更履歴","href":"https://auth0.com/changelog"}]},{"header":"ドキュメント","items":[{"label":"ドキュメント","href":"https://auth0.com/docs"},{"label":"クイックスタート","href":"https://auth0.com/docs/quickstarts"},{"label":"API","href":"https://auth0.com/docs/api"},{"label":"SDKライブラリ","href":"https://auth0.com/docs/libraries"},{"label":"教育","href":"https://auth0.com/learn"},{"label":"IAM(CIAM)入門","href":"https://auth0.com/intro-to-iam"},{"label":"レポート","href":"https://auth0.com/resources/whitepapers"},{"label":"ウェビナー","href":"https://auth0.com/resources/webinars"}]},{"header":"サポートセンター","items":[{"label":"コミュニティ","href":"https://community.auth0.com"},{"label":"ヘルプ","href":"https://support.auth0.com"},{"label":"よくある質問","href":"https://auth0.com/docs/troubleshoot"},{"label":"Auth0","href":"https://auth0.com"}]},{"header":"会社情報","items":[{"label":"導入企業","href":"https://auth0.com/customers"},{"label":"コンプライアンス","href":"https://auth0.com/security"},{"label":"パートナー","href":"https://auth0.com/partners"},{"label":"採用情報","href":"https://www.okta.com/company/careers"},{"label":"Okta + Auth0","href":"https://www.okta.com/okta-and-auth0"},{"label":"私たちについて","href":"https://auth0.com/about"}]}]},"pages":[{"title":"ja-jp","href":"/docs/ja-jp/get-started/architecture-scenarios/business-to-business/authentication"}]}]},"basePath":"","title":"Business-to-Business Authentication - Auth0 Docs","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}