diff --git a/authentication-personalization/overview.mdx b/authentication-personalization/overview.mdx
deleted file mode 100644
index 7f807d741..000000000
--- a/authentication-personalization/overview.mdx
+++ /dev/null
@@ -1,141 +0,0 @@
----
-title: "Overview"
-description: "Control who sees your documentation and customize their experience"
-icon: "badge-info"
-keywords: ["auth"]
----
-
-
- Authentication methods are available on the [Growth and Enterprise
- plans](https://mintlify.com/pricing?ref=authentication).
-
-
-There are three approaches to manage access and customize your documentation based on user information.
-
-- **Authentication**: Complete privacy protection for all content with full content customization.
-- **Partial authentication**: Page-by-page access control with full content customization.
-- **Personalization**: Content customization with **no security guarantees**. All content remains publicly accessible.
-
-**Choose authentication** if you need complete security and privacy for all your documentation, including pages, images, search results, and AI assistant features.
-
-**Choose partial authentication** if you want some pages to be public and others private.
-
-**Choose personalization** if you want to customize content based on user information and your documentation can be publicly accessible.
-
-## Handshake methods
-
-Authentication and personalization offer multiple handshake methods for controlling access to your content.
-
-### Available for all methods
-
-**JSON Web Token (JWT)**: Custom system where you manage user tokens with full control over the login flow.
-
-- Pros of JWT:
- - Reduced risk of API endpoint abuse.
- - No CORS configuration.
- - No restrictions on API URLs.
-- Cons of JWT:
- - Must be compatible with your existing login flow.
- - Dashboard sessions and docs authentication are decoupled, so your team will log into your dashboard and your docs separately.
- - When you refresh user data, users must log into your docs again. If your users' data changes frequently, they must log in frequently or risk having stale data in your docs.
-
-**OAuth 2.0**: Third-party login integration like Google, GitHub, or other OAuth providers.
-
-- Pros of OAuth 2.0:
- - Heightened security standard.
- - No restrictions on API URLs.
-- Cons of OAuth 2.0:
- - Requires significant work if setting up an OAuth server for the first time.
- - Dashboard sessions and docs authentication are decoupled, so your team will log into your dashboard and your docs separately.
-
-### Available for authentication and partial authentication
-
-**Mintlify dashboard**: Allow all of your dashboard users to access your docs.
-
-- Pros of Mintlify dashboard:
- - No configuration required.
- - Enables private preview deployments, restricting access to authenticated users only.
-- Cons of Mintlify dashboard:
- - Requires all users of your docs to have an account in your Mintlify dashboard.
-
-**Password**: Shared access with a single global password. Used for access control only. Does not allow for personalization.
-
-- Pros of password:
- - Simple setup with no configuration required to add new users, just share the password.
-- Cons of password:
- - Lose personalization features since there is no way to differentiate users with the same password.
- - Must change the password to revoke access.
-
-### Available for personalization
-
-**Shared session**: Use the same session token as your dashboard to personalize content.
-
-- Pros of shared session:
- - Users that are logged into your dashboard are automatically logged into your docs.
- - User sessions are persistent so you can refresh data without requiring a new login.
- - Minimal setup.
-- Cons of shared session:
- - Your docs will make a request to your backend.
- - You must have a dashboard that uses session authentication.
- - CORS configuration is generally required.
-
-## Content customization
-
-All three methods allow you to customize content with these features.
-
-### Dynamic `MDX` content
-
-Display dynamic content based on user information like name, plan, or organization.
-
-The `user` variable contains information sent to your docs from logged in users. See [Sending data](/authentication-personalization/sending-data) for more information.
-
-**Example**: Hello, {user.name ?? 'reader'}!
-
-```jsx
-Hello, {user.name ?? 'reader'}!
-```
-
-This feature is more powerful when you pair it with custom data about your users. For example, you can give different instructions based on a user's plan.
-
-**Example**: Authentication is an enterprise feature. {
-user.org === undefined
-? <>To access this feature, first create an account at the Mintlify dashboard.>
-: user.org.plan !== 'enterprise'
-? <>You are currently on the ${user.org.plan ?? 'free'} plan. To speak to our team about upgrading, contact our sales team.>
-: <>To request this feature for your enterprise org, contact our team.>
-}
-
-```jsx
-Authentication is an enterprise feature. {
- user.org === undefined
- ? <>To access this feature, first create an account at the Mintlify dashboard.>
- : user.org.plan !== 'enterprise'
- ? <>You are currently on the ${user.org.plan ?? 'free'} plan. To speak to our team about upgrading, contact our sales team.>
- : <>To request this feature for your enterprise org, contact our team.>
-}
-```
-
-
- The information in `user` is only available for logged in users. For logged
- out users, the value of `user` will be `{}`. To prevent the page from crashing
- for logged out users, always use optional chaining on your `user` fields. For
- example, `{user.org?.plan}`.
-
-
-### API key prefilling
-
-Automatically populate API playground fields with user-specific values by returning matching field names in your user data. The field names in your user data must exactly match the names in the API playground for automatic prefilling to work.
-
-### Page visibility
-
-Restrict which pages are visible to your users by adding `groups` fields to your pages' frontmatter. By default, every page is visible to every user.
-
-Users will only see pages for `groups` that they are in.
-
-```mdx
----
-title: "Managing your users"
-description: "Adding and removing users from your organization"
-groups: ["admin"]
----
-```
diff --git a/authentication-personalization/partial-authentication-setup.mdx b/authentication-personalization/partial-authentication-setup.mdx
deleted file mode 100644
index f3b0e384a..000000000
--- a/authentication-personalization/partial-authentication-setup.mdx
+++ /dev/null
@@ -1,25 +0,0 @@
----
-title: "Partial authentication setup"
-description: "Control access to specific pages"
-icon: "file-lock-2"
-keywords: ["auth"]
----
-
-Partial authentication lets you protect private documentation while keeping other pages publicly viewable. Users can browse public content freely and authenticate only when accessing protected pages.
-
-Partial authentication shares all the same features as authentication, but with the ability to allow unauthenticated users to view certain pages.
-
-## Setup
-
-Follow the [Authentication Setup](/authentication-personalization/authentication-setup) guide and select **Partial Authentication** when configuring your chosen handshake method.
-
-## Making pages public
-
-By default, all pages are protected. Add the `public` property to the page's frontmatter to make it viewable without authentication:
-
-```mdx
----
-title: "My Page"
-public: true
----
-```
diff --git a/authentication-personalization/personalization-setup.mdx b/authentication-personalization/personalization-setup.mdx
deleted file mode 100644
index 4f8d0e901..000000000
--- a/authentication-personalization/personalization-setup.mdx
+++ /dev/null
@@ -1,216 +0,0 @@
----
-title: "Personalization setup"
-description: "Let users log in for customized documentation experiences"
-icon: "user-cog"
----
-
-Personalization lets you customize your documentation based on user information. This guide covers setup for each available handshake method.
-
-**Need help choosing?** See the [overview](/authentication-personalization/overview) to compare options.
-
-## Configuring personalization
-
-Select the handshake method that you want to configure.
-
-
-
-### Prerequisites
-
-* A login system that can generate and sign JWTs.
-* A backend service that can create redirect URLs.
-
-### Implementation
-
-
-
- 1. In your dashboard, go to [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication).
- 2. Select **Personalization**.
- 3. Select **JWT**.
- 4. Enter the URL of your existing login flow and select **Save changes**.
- 5. Select **Generate new key**.
- 6. Store your key securely where it can be accessed by your backend.
-
-
- Modify your existing login flow to include these steps after user login:
-
- * Create a JWT containing the logged in user's info in the `User` format. See [Sending Data](/authentication-personalization/sending-data) for more information.
- * Sign the JWT with the secret key, using the ES256 algorithm.
- * Create a redirect URL back to your docs, including the JWT as the hash.
-
-
-
-### Example
-
-Your documentation is hosted at `docs.foo.com`. You want your docs to be separate from your dashboard (or you don't have a dashboard) and enable personalization.
-
-Generate a JWT secret. Then create a login endpoint at `https://foo.com/docs-login` that initiates a login flow to your documentation.
-
-After verifying user credentials:
-* Generate a JWT with user data in Mintlify's format.
-* Sign the JWT and redirect to `https://docs.foo.com#{SIGNED_JWT}`.
-
-```ts
-import * as jose from 'jose';
-import { Request, Response } from 'express';
-
-const TWO_WEEKS_IN_MS = 1000 * 60 * 60 * 24 * 7 * 2;
-
-const signingKey = await jose.importPKCS8(process.env.MINTLIFY_PRIVATE_KEY, 'ES256');
-
-export async function handleRequest(req: Request, res: Response) {
- const user = {
- expiresAt: Math.floor((Date.now() + TWO_WEEKS_IN_MS) / 1000),
- groups: res.locals.user.groups,
- content: {
- firstName: res.locals.user.firstName,
- lastName: res.locals.user.lastName,
- },
- };
-
- const jwt = await new jose.SignJWT(user)
- .setProtectedHeader({ alg: 'ES256' })
- .setExpirationTime('10 s')
- .sign(signingKey);
-
- return res.redirect(`https://docs.foo.com#${jwt}`);
-}
-```
-
-### Preserving page anchors
-
-To redirect users to specific sections after login, use this URL format: `https://docs.foo.com/page#jwt={SIGNED_JWT}&anchor={ANCHOR}`.
-
-**Example**:
-* Original URL: `https://docs.foo.com/quickstart#step-one`
-* Redirect URL: `https://docs.foo.com/quickstart#jwt={SIGNED_JWT}&anchor=step-one`
-
-
-
-### Prerequisites
-* An OAuth server that supports the Auth Code with PKCE Flow.
-* Ability to create an API endpoint accessible by OAuth access tokens.
-
-### Implementation
-
-
- Create an API endpoint that:
- * Accepts OAuth access tokens for authentication.
- * Returns user data in the `User` format. See [Sending Data](/authentication-personalization/sending-data) for more information.
- * Defines the scopes for access.
-
-
- 1. In your dashboard, go to [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication).
- 2. Select **Personalization**.
- 3. Select **OAuth** and configure these fields:
- * **Authorization URL**: Your OAuth authorization endpoint.
- * **Client ID**: Your OAuth 2.0 client identifier.
- * **Scopes**: Permissions to request. Must match the scopes of the endpoint that you configured in the first step.
- * **Token URL**: Your OAuth token exchange endpoint.
- * **Info API URL**: Endpoint to retrieve user data for personalization. Created in the first step.
- 4. Select **Save changes**
-
-
- 1. Copy the **Redirect URL** from your [authentication settings](https://dashboard.mintlify.com/settings/deployment/authentication).
- 2. Add this URL as an authorized redirect URL in your OAuth server configuration.
-
-
-
-### Example
-
-Your documentation is hosted at `foo.com/docs` and you have an existing OAuth server that supports the PKCE flow. You want to personalize your docs based on user data.
-
-**Create a user info endpoint** at `api.foo.com/docs/user-info`, which requires an OAuth access token with the `docs-user-info` scope and responds with the user's custom data:
-
-```json
-{
- "content": {
- "firstName": "Jane",
- "lastName": "Doe"
- },
- "groups": ["engineering", "admin"]
-}
-```
-
-**Configure your OAuth server details** in your dashboard:
-* **Authorization URL**: `https://auth.foo.com/authorization`
-* **Client ID**: `ydybo4SD8PR73vzWWd6S0ObH`
-* **Scopes**: `['docs-user-info']`
-* **Token URL**: `https://auth.foo.com/exchange`
-* **Info API URL**: `https://api.foo.com/docs/user-info`
-
-**Configure your OAuth server** to allow redirects to your callback URL.
-
-
-### Prerequisites
-
-* A dashboard or user portal with cookie-based session authentication.
-* Ability to create an API endpoint at the same origin or subdomain as your dashboard.
- * If your dashboard is at `foo.com`, the **API URL** must start with `foo.com` or `*.foo.com`.
- * If your dashboard is at `dash.foo.com`, the **API URL** must start with `dash.foo.com` or `*.dash.foo.com`.
-* Your docs are hosted at the same domain or subdomain as your dashboard.
- * If your dashboard is at `foo.com`, your **docs** must be hosted at `foo.com` or `*.foo.com`.
- * If your dashboard is at `*.foo.com`, your **docs** must be hosted at `foo.com` or `*.foo.com`.
-
-### Implementation
-
-
-
- Create an API endpoint that:
- * Uses your existing session authentication to identify users
- * Returns user data in the `User` format (see [Sending Data](/authentication-personalization/sending-data))
- * If the API domain and the docs domain **do not exactly match**:
- * Add the docs domain to your API's `Access-Control-Allow-Origin` header (must not be `*`).
- * Set your API's `Access-Control-Allow-Credentials` header to `true`.
-
-
- Only enable CORS headers on this specific endpoint, not your entire dashboard API.
-
-
-
- 1. In your dashboard, go to [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication).
- 2. Select **Personalization**.
- 3. Select **Shared Session**.
- 4. Enter your **Info API URL**, which is the endpoint from the first step.
- 5. Enter your **Login URL**, where users log into your dashboard.
- 6. Select **Save changes**.
-
-
-
-### Examples
-
-#### Dashboard at subdomain, docs at subdomain
-
-You have a dashboard at `dash.foo.com`, which uses cookie-based session authentication. Your dashboard API routes are hosted at `dash.foo.com/api`. You want to set up personalization for your docs hosted at `docs.foo.com`.
-
-**Setup process**:
-1. **Create endpoint** `dash.foo.com/api/docs/user-info` that identifies users via session authentication and responds with their user data.
-2. **Add CORS headers** for this route only:
- * `Access-Control-Allow-Origin`: `https://docs.foo.com`
- * `Access-Control-Allow-Credentials`: `true`
-3. **Configure API URL** in authentication settings: `https://dash.foo.com/api/docs/user-info`.
-
-#### Dashboard at subdomain, docs at root
-
-You have a dashboard at `dash.foo.com`, which uses cookie-based session authentication. Your dashboard API routes are hosted at `dash.foo.com/api`. You want to set up personalization for your docs hosted at `foo.com/docs`.
-
-**Setup process**:
-1. **Create endpoint** `dash.foo.com/api/docs/user-info` that identifies users via session authentication and responds with their user data.
-2. **Add CORS headers** for this route only:
- * `Access-Control-Allow-Origin`: `https://foo.com`
- * `Access-Control-Allow-Credentials`: `true`
-3. **Configure API URL** in authentication settings: `https://dash.foo.com/api/docs/user-info`.
-
-#### Dashboard at root, docs at root
-
-You have a dashboard at `foo.com/dashboard`, which uses cookie-based session authentication. Your dashboard API routes are hosted at `foo.com/api`. You want to set up personalization for your docs hosted at `foo.com/docs`.
-
-**Setup process**:
-1. **Create endpoint** `foo.com/api/docs/user-info` that identifies users via session authentication and responds with their user data.
-2. **Configure API URL** in authentication settings: `https://foo.com/api/docs/user-info`
-
-
-No CORS configuration is needed since the dashboard and docs share the same domain.
-
-
-
-
diff --git a/authentication-personalization/sending-data.mdx b/authentication-personalization/sending-data.mdx
deleted file mode 100644
index 2323f0b17..000000000
--- a/authentication-personalization/sending-data.mdx
+++ /dev/null
@@ -1,100 +0,0 @@
----
-title: "Sending data"
-description: "User data format for personalizing your documentation"
-icon: "send"
----
-
-When implementing authentication or personalization, your system returns user data in a specific format that enables content customization. This data can be sent as either a raw JSON object or within a signed JWT, depending on your handshake method. The shape of the data is the same for both.
-
-## User data format
-
-```tsx
-type User = {
- expiresAt?: number;
- groups?: string[];
- content?: Record;
- apiPlaygroundInputs?: {
- header?: Record;
- query?: Record;
- cookie?: Record;
- server?: Record;
- };
-};
-```
-
-
- Session expiration time in **seconds since epoch**. If the user loads a page after this time, their stored data is automatically deleted and they must reauthenticate.
- For JWT handshakes: This differs from the JWT's `exp` claim, which determines when a JWT is considered invalid. Set the JWT `exp` claim to a short duration (10 seconds or less) for security. Use `expiresAt` for the actual session length (hours to weeks).
-
-
- A list of groups that the user belongs to. Pages with a matching `groups` field in their metadata will be visible to this user.
-
- **Example**: User with `groups: ["admin", "engineering"]` can access pages tagged with either the `admin` or `engineering` groups.
-
-
- Custom data accessible in your `MDX` content via the `user` variable. Use this for dynamic personalization throughout your documentation.
-
- **Example**:
- ```json
- { "firstName": "Ronan", "company": "Acme Corp", "plan": "Enterprise" }
- ```
-
- **Usage in `MDX`**:
- ```mdx
- Welcome back, {user.firstName}! Your {user.plan} plan includes...
- ```
- With the example `user` data, this would render as: Welcome back, Ronan! Your Enterprise plan includes...
-
-
- User-specific values that will be prefilled in the API playground if supplied. Save users time when testing your APIs with their own data.
-
- **Example**:
- ```json
- {
- "header": { "X-API-Key": "user_api_key_123" },
- "server": { "subdomain": "foo" },
- "query": { "org_id": "12345" }
- }
- ```
- If a user makes requests at a specific subdomain, you can send `{ server: { subdomain: 'foo' } }` as an `apiPlaygroundInputs` field. This value will be prefilled on any API page with the `subdomain` value.
-
- The `header`, `query`, and `cookie` fields will only prefill if they are part of your [OpenAPI security scheme](https://swagger.io/docs/specification/authentication/). If a field is in either the `Authorization` or `Server` sections, it will prefill. Creating a standard header parameter named `Authorization` will not enable this feature.
-
-
-## Example user data
-
-```json
-{
- "expiresAt": 1735689600,
- "groups": ["admin", "beta-users"],
- "content": {
- "firstName": "Jane",
- "lastName": "Smith",
- "company": "TechCorp",
- "plan": "Enterprise",
- "region": "us-west"
- },
- "apiPlaygroundInputs": {
- "header": {
- "Authorization": "Bearer abc123",
- "X-Org-ID": "techcorp"
- },
- "server": {
- "environment": "production",
- "region": "us-west"
- }
- }
-}
-```
diff --git a/docs.json b/docs.json
index c2e333f18..b0d961acd 100644
--- a/docs.json
+++ b/docs.json
@@ -111,13 +111,11 @@
]
},
{
- "group": "Authentication and personalization",
+ "group": "Protected pages",
"pages": [
- "authentication-personalization/overview",
- "authentication-personalization/authentication-setup",
- "authentication-personalization/partial-authentication-setup",
- "authentication-personalization/personalization-setup",
- "authentication-personalization/sending-data"
+ "protected-pages/overview",
+ "protected-pages/password-protection",
+ "protected-pages/identity-provider-authentication"
]
},
{
@@ -498,6 +496,26 @@
{
"source": "ai-ingestion",
"destination": "ai/llmstxt"
+ },
+ {
+ "source": "authentication-personalization/overview",
+ "destination": "protected-pages/overview"
+ },
+ {
+ "source": "authentication-personalization/authentication-setup",
+ "destination": "protected-pages/setup"
+ },
+ {
+ "source": "authentication-personalization/partial-authentication-setup",
+ "destination": "protected-pages/overview"
+ },
+ {
+ "source": "authentication-personalization/personalization-setup",
+ "destination": "protected-pages/overview"
+ },
+ {
+ "source": "authentication-personalization/sending-data",
+ "destination": "protected-pages/sending-data"
}
],
"integrations": {
diff --git a/guides/hidden-page-example.mdx b/guides/hidden-page-example.mdx
index c8941fc23..e719afecf 100644
--- a/guides/hidden-page-example.mdx
+++ b/guides/hidden-page-example.mdx
@@ -11,7 +11,7 @@ See [Hidden pages](/guides/hidden-pages) for more information.
## Common use cases for hidden pages
- By default, hidden pages are publicly accessible, but not discoverable through the navigation. If you want to restrict access to a hidden page, you must configure [authentication](/authentication-personalization/authentication-setup).
+ By default, hidden pages are publicly accessible, but not discoverable through the navigation. If you want to restrict access to a hidden page, you must configure [protected pages](/protected-pages/overview).
- **Beta documentation**: Information that can be public, but should not be discoverable through the navigation.
diff --git a/guides/hidden-pages.mdx b/guides/hidden-pages.mdx
index a03592202..b594122af 100644
--- a/guides/hidden-pages.mdx
+++ b/guides/hidden-pages.mdx
@@ -8,9 +8,7 @@ Hidden pages are removed from your site's navigation but remain publicly accessi
Use hidden pages for content that you want to be accessible on your site or referenced as context for AI tools, but not discoverable through the navigation.
-For content requiring strict access control, you must configure [authentication](/authentication-personalization/authentication-setup).
-
-If you want to hide pages for specific groups of users, use personalization to control [page visibility](/authentication-personalization/overview#page-visibility).
+For content requiring strict access control, you must configure [protected pages](/protected-pages/overview).
## Hiding a page
diff --git a/guides/auth0.mdx b/protected-pages/auth0.mdx
similarity index 100%
rename from guides/auth0.mdx
rename to protected-pages/auth0.mdx
diff --git a/authentication-personalization/authentication-setup.mdx b/protected-pages/identity-provider-authentication.mdx
similarity index 66%
rename from authentication-personalization/authentication-setup.mdx
rename to protected-pages/identity-provider-authentication.mdx
index 2af330ffa..15ad69300 100644
--- a/authentication-personalization/authentication-setup.mdx
+++ b/protected-pages/identity-provider-authentication.mdx
@@ -1,20 +1,39 @@
---
-title: "Authentication setup"
-description: "Guarantee privacy of your docs by authenticating users"
+title: "Identity provider authentication"
+description: "Keep your docs private by authenticating users"
icon: "file-lock"
-keywords: ['auth']
+keywords: ['auth', 'authentication']
---
-Authentication requires users to log in before accessing your documentation. This guide covers setup for each available handshake method.
-**Need help choosing?** See the [overview](/authentication-personalization/overview) to compare options.
+Control access to your documentation by authenticating individual users.
Authentication methods are available on [Growth and Enterprise plans](https://mintlify.com/pricing?ref=authentication).
-## Configuring authentication
+## Choose your method
-Select the handshake method that you want to configure.
+**Use JWT if**:
+
+- You want full control over the login flow and user data.
+- You need custom authentication logic.
+- You prefer to manage tokens yourself.
+
+**Use OAuth 2.0 if**:
+
+- You want to integrate with third-party providers (Google, GitHub, etc.).
+- You want to leverage existing OAuth infrastructure.
+- You prefer standardized security protocols.
+
+**Use the Mintlify dashboard if**:
+
+- Your editors are also your documentation users.
+- You want a zero configuration setup.
+
+## Configuration
+
+Select the method that you want to configure.
+TODO: verify steps with new UI
@@ -27,17 +46,16 @@ Select the handshake method that you want to configure.
- 1. In your dashboard, go to [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication).
- 2. Select **Full Authentication** or **Partial Authentication**.
- 3. Select **JWT**.
- 4. Enter the URL of your existing login flow and select **Save changes**.
- 5. Select **Generate new key**.
- 6. Store your key securely where it can be accessed by your backend.
+ 1. In your dashboard, go to [Protected pages](https://dashboard.mintlify.com/settings/deployment/authentication).
+ 2. Select **JWT**.
+ 3. Enter the URL of your existing login flow and select **Save changes**.
+ 4. Select **Generate new key**.
+ 5. Store your key securely where it can be accessed by your backend.
Modify your existing login flow to include these steps after user authentication:
- * Create a JWT containing the authenticated user's info in the `User` format. See [Sending Data](/authentication-personalization/sending-data) for more information.
+ * TODO: what format is needed? Create a JWT containing the authenticated user's info in the `User` format. See [Sending Data](/protected-pages/sending-data) for more information.
* Sign the JWT with your secret key, using the EdDSA algorithm.
* Create a redirect URL back to the `/login/jwt-callback` path of your docs, including the JWT as the hash.
@@ -45,7 +63,7 @@ Select the handshake method that you want to configure.
### Example
-Your documentation is hosted at `docs.foo.com` with an existing authentication system at `foo.com`. You want to extend your login flow to grant access to the docs while keeping your docs separate from your dashboard (or you don't have a dashboard).
+Your documentation is hosted at `docs.foo.com` with an existing authentication system at `foo.com`. You want to extend your login flow to grant access to the docs while keeping your docs separate from your dashboard.
Create a login endpoint at `https://foo.com/docs-login` that extends your existing authentication.
@@ -123,21 +141,20 @@ When an unauthenticated user tries to access a protected page, their intended de
### Prerequisites
* An OAuth server that supports the Authorization Code Flow.
-* Ability to create an API endpoint accessible by OAuth access tokens (optional, to enable personalization features).
### Implementation
- 1. In your dashboard, go to [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication).
- 2. Select **Full Authentication** or **Partial Authentication**.
- 3. Select **OAuth** and configure these fields:
+ 1. In your dashboard, go to [Protected pages](https://dashboard.mintlify.com/settings/deployment/authentication).
+ 2. Select **OAuth 2.0**.
+ 3. Configure these fields:
* **Authorization URL**: Your OAuth endpoint.
* **Client ID**: Your OAuth 2.0 client identifier.
* **Client Secret**: Your OAuth 2.0 client secret.
* **Scopes**: Permissions to request. Use multiple scopes if you need different access levels.
* **Token URL**: Your OAuth token exchange endpoint.
- * **Info API URL** (optional): Endpoint to retrieve user info for personalization. If omitted, the OAuth flow will only be used to verify identity and the user info will be empty.
+ * **Info API URL** (optional): Endpoint to retrieve user info for API prefilling. If omitted, the OAuth flow will only be used to verify identity and the user info will be empty.
4. Select **Save changes**.
@@ -145,9 +162,9 @@ When an unauthenticated user tries to access a protected page, their intended de
2. Add the redirect URL as an authorized redirect URL for your OAuth server.
- To enable personalization features, create an API endpoint that:
+ To enable API playground prefilling, create an API endpoint that:
* Accepts OAuth access tokens for authentication.
- * Returns user data in the `User` format. See [Sending Data](/authentication-personalization/sending-data) for more information.
+ * TODO: what data format is needed?Returns user data in the `User` format. See [Sending Data](/protected-pages/sending-data) for more information.
Add this endpoint URL to the **Info API URL** field in your [authentication settings](https://dashboard.mintlify.com/settings/deployment/authentication).
@@ -178,19 +195,18 @@ Your documentation is hosted at `foo.com/docs` and you have an existing OAuth se
**Configure your OAuth server to allow redirects** to your callback URL.
-
+
### Prerequisites
-* Your documentation users are also your documentation editors.
+* Your documentation users are also your editors.
### Implementation
- 1. In your dashboard, go to [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication).
- 2. Select **Full Authentication** or **Partial Authentication**.
- 3. Select **Mintlify Auth**.
- 4. Select **Enable Mintlify Auth**.
+ 1. In your dashboard, go to [Protected pages](https://dashboard.mintlify.com/settings/deployment/authentication).
+ 2. Select **Mintlify dashboard**.
+ 3. Select **Enable Mintlify dashboard**.
1. In your dashboard, go to [Members](https://dashboard.mintlify.com/settings/organization/members).
@@ -207,34 +223,4 @@ Your documentation is hosted at `docs.foo.com` and your team uses the dashboard
**Verify team access** by checking that all team members are added to your organization.
-
-
-Password authentication provides access control only and does **not** support content personalization.
-
-
-### Prerequisites
-
-* Your security requirements allow sharing passwords among users.
-
-### Implementation
-
-
-
- 1. In your dashboard, go to [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication).
- 2. Select **Full Authentication** or **Partial Authentication**.
- 3. Select **Password**.
- 4. Enter a secure password.
- 5. Select **Save changes**.
-
-
- Securely share the password and documentation URL with authorized users.
-
-
-
-## Example
-
-Your documentation is hosted at `docs.foo.com` and you need basic access control without tracking individual users. You want to prevent public access while keeping setup simple.
-
-**Create a strong password** in your dashboard. **Share credentials** with authorized users. That's it!
-
diff --git a/protected-pages/overview.mdx b/protected-pages/overview.mdx
new file mode 100644
index 000000000..dd7e1350a
--- /dev/null
+++ b/protected-pages/overview.mdx
@@ -0,0 +1,72 @@
+---
+title: "Overview"
+description: "Control access to your documentation"
+icon: "badge-info"
+keywords: ["auth", "authentication"]
+---
+
+
+ Authentication methods are available on the [Growth and Enterprise
+ plans](https://mintlify.com/pricing?ref=authentication).
+
+
+Choose how users authenticate to access your documentation.
+
+You can make all of your content private or control access on a page-by-page basis.
+
+## Authentication methods
+
+Choose between simple shared password access or individual user authentication based on your security needs.
+
+### Password protection
+
+Shared access with a single global password.
+
+- Pros of password protection:
+ - Simple setup with no configuration required to add new users. Just share the password.
+- Cons of password protection:
+ - Cannot differentiate between users with the same password.
+ - Must change the password to revoke access.
+
+### Identity provider authentication
+
+Authenticate individual users with one of the following methods.
+
+**JSON Web Token (JWT)**: Custom system where you manage user tokens with full control over the login flow.
+- Pros of JWT:
+ - Reduced risk of API endpoint abuse.
+ - No CORS configuration.
+ - No restrictions on API URLs.
+- Cons of JWT:
+ - Must be compatible with your existing login flow.
+ - Users log into your dashboard and docs separately.
+
+**OAuth 2.0**: Third-party login integration like Google, GitHub, or other OAuth providers.
+
+- Pros of OAuth 2.0:
+ - Heightened security standard.
+ - No restrictions on API URLs.
+- Cons of OAuth 2.0:
+ - Requires significant work if setting up an OAuth server for the first time.
+ - Users log into your dashboard and docs separately.
+
+**Mintlify dashboard**: Allow all of your dashboard users to access your docs.
+
+- Pros of Mintlify dashboard:
+ - No configuration required.
+ - Enables private preview deployments, restricting access to authenticated users only.
+- Cons of Mintlify dashboard:
+ - Requires all users of your docs to have an account in your Mintlify dashboard.
+
+## Choose your method
+
+**Use password protection if**:
+
+- You want a simple, quick setup.
+- All authorized users can share the same password.
+- You don't need to track individual users.
+
+**Use identity provider authentication if**:
+
+- You need to identify individual users.
+- You want to integrate with existing login flows.
diff --git a/protected-pages/password-protection.mdx b/protected-pages/password-protection.mdx
new file mode 100644
index 000000000..edb0f333e
--- /dev/null
+++ b/protected-pages/password-protection.mdx
@@ -0,0 +1,41 @@
+---
+title: "Password protection"
+description: "Restrict access to your documentation with a password"
+icon: "rectangle-ellipsis"
+---
+
+Password protection provides simple access control using a single shared password. All authorized users use the same password to access your documentation.
+
+Use password protection when you need basic security for your docs.
+
+## Prerequisites
+
+- You are on a Pro or Enterprise plan
+- You can securely distribute passwords to authorized users
+
+## Implementation
+
+TODO: verify steps with new UI
+
+
+
+ 1. In your dashboard, go to [Protected pages](https://dashboard.mintlify.com/settings/deployment/authentication).
+ 2. Select **Password**.
+ 3. Enter a secure password.
+ 4. Select **Save changes**.
+
+
+ Open your documentation in an incognito window to verify the password prompt appears and your password works.
+
+
+ Securely share the password and documentation URL with authorized users.
+
+
+
+## Security considerations
+
+- Rotate passwords regularly.
+- Use a strong, unique password.
+- Distribute passwords through secure channels like password managers or encrypted communication.
+- Change the password immediately if someone loses access privileges.
+- Change the password immediately if you need to revoke access.
diff --git a/protected-pages/sending-data.mdx b/protected-pages/sending-data.mdx
new file mode 100644
index 000000000..6824dd30f
--- /dev/null
+++ b/protected-pages/sending-data.mdx
@@ -0,0 +1,65 @@
+---
+title: "Sending data"
+description: "User data format for personalizing your documentation"
+icon: "send"
+---
+
+When implementing protected pages, your system returns user data in a specific format that enables content customization. This data can be sent as either a raw JSON object or within a signed JWT, depending on your handshake method. The shape of the data is the same for both.
+
+## User data format
+
+```tsx
+type User = {
+ apiPlaygroundInputs?: {
+ header?: Record;
+ query?: Record;
+ cookie?: Record;
+ server?: Record;
+ };
+};
+```
+
+
+ User-specific values that will be prefilled in the API playground if supplied. Save users time when testing your APIs with their own data.
+
+ **Example**:
+ ```json
+ {
+ "header": { "X-API-Key": "user_api_key_123" },
+ "server": { "subdomain": "foo" },
+ "query": { "org_id": "12345" }
+ }
+ ```
+ If a user makes requests at a specific subdomain, you can send `{ server: { subdomain: 'foo' } }` as an `apiPlaygroundInputs` field. This value will be prefilled on any API page with the `subdomain` value.
+
+ The `header`, `query`, and `cookie` fields will only prefill if they are part of your [OpenAPI security scheme](https://swagger.io/docs/specification/authentication/). If a field is in either the `Authorization` or `Server` sections, it will prefill. Creating a standard header parameter named `Authorization` will not enable this feature.
+
+
+## Example user data
+
+```json
+{
+ "expiresAt": 1735689600,
+ "groups": ["admin", "beta-users"],
+ "content": {
+ "firstName": "Jane",
+ "lastName": "Smith",
+ "company": "TechCorp",
+ "plan": "Enterprise",
+ "region": "us-west"
+ },
+ "apiPlaygroundInputs": {
+ "header": {
+ "Authorization": "Bearer abc123",
+ "X-Org-ID": "techcorp"
+ },
+ "server": {
+ "environment": "production",
+ "region": "us-west"
+ }
+ }
+}
+```
diff --git a/settings/preview-deployments.mdx b/settings/preview-deployments.mdx
index 091ac2297..0706ca0dd 100644
--- a/settings/preview-deployments.mdx
+++ b/settings/preview-deployments.mdx
@@ -51,4 +51,4 @@ Preview deployments can be publicly accessible or restricted to authenticated us
**Public access**: Preview URLs are publicly viewable by default. Share a preview link with anyone who needs to review your changes.
-**Restricted access**: Enable preview deployment authentication to limit preview access to authenticated Mintlify users only. See [Authentication Setup](/authentication-personalization/authentication-setup) for more information.
+**Restricted access**: Enable preview deployment authentication to limit preview access to authenticated Mintlify users only. See the protected pages [Overview](/protected-pages/overview) for more information.