chore: naming custom domain (#11383)

# Which Problems Are Solved

As part of the consistent naming effort, this PR focuses on "Custom
Domains".

# How the Problems Are Solved

- All terms referring to a domain identifying an instance were changed
to "Custom Domain" or "custom domain".
- All placeholders were changed to `${CUSTOM_DOMAIN}` or
`$CUSTOM_DOMAIN` (if escaping was not possible)
- Some other placeholders were change to the same style.
- One occurrence of custom domain was changed to organization domain to
prevent misunderstandings.

# Additional Changes

None

# Additional Context

- closes #11296 
- customer portal is fixed on
https://github.com/zitadel/website/pull/1570
- angular example is updated on
https://github.com/zitadel/zitadel-angular/pull/29
This commit is contained in:
Livio Spring
2026-01-20 10:26:57 +05:30
committed by GitHub
parent be57a08aaa
commit 8c0d6c6817
105 changed files with 315 additions and 315 deletions
+1 -1
View File
@@ -2,4 +2,4 @@ openapi: 3.1.0
info:
version: v2
servers:
- url: https://$CUSTOM-DOMAIN
- url: https://$CUSTOM_DOMAIN
+2 -2
View File
@@ -270,7 +270,7 @@ In the table below you can see the URI of those calls.
## Domains
ZITADEL hosts everything under a single domain: `{instance}.zitadel.cloud` or your custom domain `${CUSTOM_DOMAIN}`
ZITADEL hosts everything under a single domain: `{instance}.zitadel.cloud` or your Custom Domain `${CUSTOM_DOMAIN}`
The domain is used as the OIDC issuer and as the base url for the gRPC and REST APIs, the Login and Console UI, which you'll find under `${CUSTOM_DOMAIN}/ui/console/`.
@@ -278,7 +278,7 @@ Are you self-hosting and having troubles with _Instance not found_ errors? [Chec
## API path prefixes
If you run ZITADEL on a custom domain, you may want to reuse that domain for other applications.
If you run ZITADEL on a Custom Domain, you may want to reuse that domain for other applications.
For easy copying to your reverse proxy configuration, here is the list of URL path prefixes, ZITADEL uses.
```yaml
+2 -2
View File
@@ -46,7 +46,7 @@ JWT
| Claim | Example | Description |
|:------|:---------------------------|:----------------------------------------------------------------------------------------------------------------|
| aud | `"https://$CUSTOM-DOMAIN"` | String or Array of intended audiences MUST include ZITADEL's issuing domain |
| aud | `"https://${CUSTOM_DOMAIN}"` | String or Array of intended audiences MUST include ZITADEL's issuing domain |
| exp | `1605183582` | Unix timestamp of the expiry |
| iat | `1605179982` | Unix timestamp of the creation singing time of the JWT, MUST NOT be older than 1h |
| iss | `"78366401571920522@acme"` | String which represents the requesting party (owner of the key), normally the `clientID` from the json key file |
@@ -56,7 +56,7 @@ JWT
{
"iss": "78366401571920522@acme",
"sub": "78366401571920522@acme",
"aud": "https://$CUSTOM-DOMAIN",
"aud": "https://${CUSTOM_DOMAIN}",
"exp": 1605183582,
"iat": 1605179982
}
+2 -2
View File
@@ -47,7 +47,7 @@ Please check below the matrix for an overview where which scope is asserted.
| Claims | Example | Description |
|:-------------------|:---------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| acr | TBA | TBA |
| act | `{"iss": "$CUSTOM-DOMAIN","sub": "259241944654282754"}` | JSON object describing the actor from the `actor_token` after [token exchange](/docs/guides/integrate/token-exchange#actor-token) |
| act | `{"iss": "${CUSTOM_DOMAIN}","sub": "259241944654282754"}` | JSON object describing the actor from the `actor_token` after [token exchange](/docs/guides/integrate/token-exchange#actor-token) |
| address | `Lerchenfeldstrasse 3, 9014 St. Gallen` | TBA |
| amr | `pwd mfa` | Authentication Method References as defined in [RFC8176](https://tools.ietf.org/html/rfc8176) <br/> `password` value is deprecated, please check `pwd` |
| aud | `69234237810729019` | The audience of the token, by default all client id's and the project id are included |
@@ -61,7 +61,7 @@ Please check below the matrix for an overview where which scope is asserted.
| gender | `other` | Gender of the subject |
| given_name | `Road` | First name of the subject |
| iat | `1311280970` | Time of the token was issued at (as unix time) |
| iss | `$CUSTOM-DOMAIN` | Issuing domain of a token |
| iss | `${CUSTOM_DOMAIN}` | Issuing domain of a token |
| jti | `69234237813329048` | Unique id of the token |
| locale | `en` | Language from the subject |
| name | `Road Runner` | The subjects full name |
+2 -2
View File
@@ -78,7 +78,7 @@ JWT
| Claim | Example | Description |
| :---- | :------------------------- | :------------------------------------------------------------------------------------------------------------ |
| aud | `"https://$CUSTOM-DOMAIN"` | String or Array of intended audiences MUST include ZITADEL's issuing domain |
| aud | `"https://${CUSTOM_DOMAIN}"` | String or Array of intended audiences MUST include ZITADEL's issuing domain |
| exp | `1605183582` | Unix timestamp of the expiry |
| iat | `1605179982` | Unix timestamp of the creation singing time of the JWT, MUST NOT be older than 1h |
| iss | `"77479219772321307"` | String which represents the requesting party (owner of the key), normally the `userId` from the json key file |
@@ -88,7 +88,7 @@ JWT
{
"iss": "77479219772321307",
"sub": "77479219772321307",
"aud": "https://$CUSTOM-DOMAIN",
"aud": "https://${CUSTOM_DOMAIN}",
"exp": 1605183582,
"iat": 1605179982
}
+14 -14
View File
@@ -4,7 +4,7 @@ title: SAML Endpoints in ZITADEL
## SAML 2.0 metadata
The SAML Metadata is located within the issuer domain. This would give us $CUSTOM-DOMAIN/saml/v2/metadata.
The SAML Metadata is located within the issuer domain. This would give us `${CUSTOM_DOMAIN}/saml/v2/metadata`.
This metadata contains all the information defined in the spec.
@@ -13,14 +13,14 @@ spec.** [Metadata for the OASIS Security Assertion Markup Language (SAML) V2.0
## Certificate endpoint
$CUSTOM-DOMAIN/saml/v2/certificate
`${CUSTOM_DOMAIN}/saml/v2/certificate`
The certificate endpoint provides the certificate which is used to sign the responses for download, for easier use with
different service providers which want the certificate separately instead of inside the metadata.
## SSO endpoint
$CUSTOM-DOMAIN/saml/v2/SSO
`${CUSTOM_DOMAIN}/saml/v2/SSO`
The SSO endpoint is the starting point for all initial user authentications. The user agent (browser) will be redirected
to this endpoint to authenticate the user.
@@ -33,23 +33,23 @@ spec.** [Bindings for the OASIS Security Assertion Markup Language (SAML) V2.0
### Required request parameters
| Parameter | Description |
|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| RelayState | (Optional) ID to associate the exchange with the original request. |
| Parameter | Description |
|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| RelayState | (Optional) ID to associate the exchange with the original request. |
| SAMLRequest | The request made to the SAML IDP. (base64 encoded) |
| SigAlg | Algorithm used to sign the request, only if binding is 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' as signature has to be provided es separate parameter. (base64 encoded) |
| Signature | Signature of the request as parameter with 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' binding. (base64 encoded) |
| SigAlg | Algorithm used to sign the request, only if binding is 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' as signature has to be provided es separate parameter. (base64 encoded) |
| Signature | Signature of the request as parameter with 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' binding. (base64 encoded) |
### Successful response
Depending on the content of the request the response comes back in the requested binding, but the content is the same.
| Parameter | Description |
|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| RelayState | ID to associate the exchange with the original request. |
| SAMLResponse | The response form the SAML IDP. (base64 encoded) |
| SigAlg | Algorithm used to sign the response, only if binding is 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' as signature has to be provided es separate parameter. (base64 encoded) |
| Signature | Signature of the response as parameter with 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' binding. (base64 encoded) |
| Parameter | Description |
|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| RelayState | ID to associate the exchange with the original request. |
| SAMLResponse | The response form the SAML IDP. (base64 encoded) |
| SigAlg | Algorithm used to sign the response, only if binding is 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' as signature has to be provided es separate parameter. (base64 encoded) |
| Signature | Signature of the response as parameter with 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' binding. (base64 encoded) |
### Error response
+1 -1
View File
@@ -36,7 +36,7 @@ The same view is available on several other objects such as organization or proj
### Event View
Administrators can see all events across an instance and filter them directly in [Console](/docs/guides/manage/console/console-overview).
Go to your default settings and then click on the Tab **Events** to open the Event Viewer or browse to $CUSTOM-DOMAIN/ui/console/events
Go to your default settings and then click on the Tab **Events** to open the Event Viewer or browse to $CUSTOM_DOMAIN/ui/console/events
![Event viewer](/img/concepts/audit-trail/event-viewer.png)
+1 -1
View File
@@ -6,7 +6,7 @@ sidebar_label: Console
The ZITADEL console is a web-based interface designed to facilitate the management and administration of ZITADEL resources and configurations.
It serves as a central hub where administrators can perform various tasks related to identity and access management within their organization's infrastructure.
The console is available by navigating to the [custom domain](/docs/concepts/features/custom-domain) of your instance and appending the path `/ui/console`.
The console is available by navigating to the [Custom Domain](/docs/concepts/features/custom-domain) of your instance and appending the path `/ui/console`.
Administrators can [restrict end-users from accessing the console](/docs/guides/solution-scenarios/restrict-console).
Here's an overview of what the console enables users to do:
+6 -6
View File
@@ -1,13 +1,13 @@
---
title: Custom domain
sidebar_label: Custom domain
title: Custom Domain
sidebar_label: Custom Domain
---
A ZITADEL custom domain refers to the ability for organizations to personalize the authentication experience by using their own domain name rather than the default ZITADEL domain.
A ZITADEL Custom Domain refers to the ability for organizations to personalize the authentication experience by using their own domain name rather than the default ZITADEL domain.
This feature allows organizations to maintain their brand identity throughout the authentication process, providing a seamless and consistent user experience.
By configuring a custom domain within ZITADEL, organizations can replace the default authentication URLs with their own domain, such as "login.example.com" or "auth.companyname.com".
By configuring a Custom Domain within ZITADEL, organizations can replace the default authentication URLs with their own domain, such as "login.example.com" or "auth.companyname.com".
This not only enhances the overall user experience but also reinforces the organization's brand presence. Additionally, custom domains can contribute to trust and credibility, as users are more likely to recognize and trust URLs associated with the organization rather than generic domains. Overall, ZITADEL's custom domain feature empowers organizations to tailor the authentication process to align with their brand identity and user expectations.
This not only enhances the overall user experience but also reinforces the organization's brand presence. Additionally, Custom Domains can contribute to trust and credibility, as users are more likely to recognize and trust URLs associated with the organization rather than generic domains. Overall, ZITADEL's Custom Domain feature empowers organizations to tailor the authentication process to align with their brand identity and user expectations.
Learn how to [configure a custom domain in ZITADEL Cloud](/docs/guides/manage/cloud/instances#add-custom-domain) or how to configure [custom domain when self-hosting](/docs/self-hosting/manage/custom-domain).
Learn how to [configure a Custom Domain in ZITADEL Cloud](/docs/guides/manage/cloud/instances#add-custom-domain) or how to configure [Custom Domain when self-hosting](/docs/self-hosting/manage/custom-domain).
+1 -1
View File
@@ -32,6 +32,6 @@ Imagine signing in without passwords! Passkeys, replacing traditional passwords,
* Passkey support is still evolving in browsers and platforms. Check compatibility for your target audience.
* ZITADEL actively develops its passkey features. Stay updated with documentation and releases.
* Passkeys are bound to your domain, thus we recommend configuring a [custom domain](/docs/concepts/features/custom-domain.md) before setting up passkeys.
* Passkeys are bound to your domain, thus we recommend configuring a [Custom Domain](/docs/concepts/features/custom-domain.md) before setting up passkeys.
Don't hesitate to ask if you have further questions about integrating passkeys in your ZITADEL application!
+1 -1
View File
@@ -78,7 +78,7 @@ A client can also implement this, by calling the [specific endpoint](/apis/openi
## Profile
These actions are available for authenticated users only.
ZITADEL provides a self-service UI for the user profile out-of-the box under the path _$CUSTOM-DOMAIN/ui/console/users/me_.
ZITADEL provides a self-service UI for the user profile out-of-the box under the path _$CUSTOM_DOMAIN/ui/console/users/me_.
You can also implement your own version in your application by using our APIs.
### Change password
@@ -14,4 +14,4 @@ ZITADEL allows you to give other organizations permission to manage certain aspe
![Organization Grant](/img/concepts/objects/organization_grants.png)
Each organization has its own pool of usernames, which includes human and service users, for its domain (`{username}@{domainname}.{zitadeldomain}`). A username is unique within your organization. You can configure ZITADEL to use your own domain, and simplify user experience (`{loginname}@{yourdomain.tld}`).
Each organization has its own pool of usernames, which includes human and service users, for its domain (`{username}@{OrganizationDomain}.$CUSTOM_DOMAIN`). A username is unique within your organization. You can configure ZITADEL to use your own domain, and simplify user experience (`{loginname}@{yourdomain.tld}`).
+1 -1
View File
@@ -26,7 +26,7 @@ You will find more detailed explanations around the different concepts in the fo
ZITADEL has the concept of virtual instances.
When installing ZITADEL from scratch, one instance is always automatically created for you.
Nevertheless, you can add more virtual instances via the [system API](/apis/resources/system).
This is useful if you have business customers, which in turn have their business customers with self service and custom domain demands.
This is useful if you have business customers, which in turn have their business customers with self service and Custom Domain demands.
By providing a virtual ZITADEL instances, your customers have all the customization options available in ZITADEL.
Scaling ZITADEL instances virtually enables you to easily distribute your limited compute resources to all your customers.
@@ -43,7 +43,7 @@ provider = "oidc"
user_id_claim = "sub" #uses the subject as ID instead of the email
provider_display_name = "ZITADEL"
redirect_url = "http://127.0.0.1:4180/oauth2/callback"
oidc_issuer_url = "https://$CUSTOM-DOMAIN"
oidc_issuer_url = "https://$CUSTOM_DOMAIN"
upstreams = [
"https://example.corp.com"
]
+2 -2
View File
@@ -122,14 +122,14 @@ https://github.com/zitadel/zitadel-go/blob/next/example/app/templates/profile.ht
### Start your application
You will need to provide some values for the program to run:
- `domain`: Your ZITADEL custom domain, e.g. my-domain.zitadel.cloud
- `domain`: Your ZITADEL Custom Domain, e.g. my-domain.zitadel.cloud
- `key`: Random secret string. Used for symmetric encryption of state parameters, cookies and PKCE.
- `clientID`: The clientID provided by ZITADEL
- `redirectURI`: The redirectURI registered at ZITADEL
- `port`: The port on which the API will be accessible, default it 8089
```bash
go run main.go --domain <your domain> --key <key> -- clientID <clientID> --redirectURI <redirectURI>
go run main.go --domain <custom domain> --key <key> -- clientID <clientID> --redirectURI <redirectURI>
```
This could look like:
+1 -1
View File
@@ -144,7 +144,7 @@ In case you've created your own application and depending on your development se
mvn clean package -DskipTests
```
You will need to provide the `issuer-uri` (your ZITADEL domain) and the `client-id` previously created:
You will need to provide the `issuer-uri` (your Custom Domain) and the `client-id` previously created:
```bash
java \
+13 -13
View File
@@ -22,7 +22,7 @@ First we need to create an organization that holds the Vendor's users, projects
### Vendor Organization
Navigate to `https://{YourDomain}.zitadel.cloud/ui/console/orgs` (replace \{YourDomain}), and click on the button "New".
Navigate to `https://$CUSTOM_DOMAIN.zitadel.cloud/ui/console/orgs` (replace $CUSTOM_DOMAIN), and click on the button "New".
Toggle the setting "Use your personal account as organization owner".
Enter the name `Demo-Vendor`, and click "Create". Then click on that organization.
@@ -31,7 +31,7 @@ Enter the name `Demo-Vendor`, and click "Create". Then click on that organizatio
To setup this sample you have to create a project and an application in the vendor organization (`Demo-Vendor`) first.
Open the Console (`https://{YourDomain}.zitadel.cloud/ui/console/projects`) and create a new project. Let's call it `Portal`.
Open the Console (`https://$CUSTOM_DOMAIN.zitadel.cloud/ui/console/projects`) and create a new project. Let's call it `Portal`.
Then on the project detail page click on new application and enter a name for this app.
Let's call this one `portal-web`.
@@ -81,12 +81,12 @@ Create a file `.env.local` and copy paste the following:
```text
NEXTAUTH_URL=http://localhost:3000
NEXT_PUBLIC_ZITADEL_ISSUER=https://{YourDomain}.zitadel.cloud
ZITADEL_API=https://{YourDomain}.zitadel.cloud
ORG_ID={YourOrgId}
PROJECT_ID={YourProjectId}
ZITADEL_CLIENT_ID={YourClientID}
SERVICE_ACCOUNT_ACCESS_TOKEN={YourServiceAccountSecret}
NEXT_PUBLIC_ZITADEL_ISSUER=https://$CUSTOM_DOMAIN.zitadel.cloud
ZITADEL_API=https://$CUSTOM_DOMAIN.zitadel.cloud
ORG_ID=${YOUR_ORG_ID}
PROJECT_ID=${PROJECT_ID}
ZITADEL_CLIENT_ID=${CLIENT_ID}
SERVICE_ACCOUNT_ACCESS_TOKEN=${SERVICE_ACCOUNT_SECRET}
NEXTAUTH_SECRET=randomsecret
```
@@ -98,13 +98,13 @@ Replace the values as follows
`ZITADEL_API`: URL of the Management API. Typically the same as `ZITADEL_ISSUER`.
`ORG_ID`: We will create an organization during later steps. You can find `{YourOrgId}` by selecting the `Demo-Vendor` organization in Console. `{YourOrgId}` is displayed on top of the organization detail page as "Resource Id".
`ORG_ID`: We will create an organization during later steps. You can find `${YOUR_ORG_ID}` by selecting the `Demo-Vendor` organization in Console. `${YOUR_ORG_ID}` is displayed on top of the organization detail page as "Resource Id".
`PROJECT_ID`: You can find `{YourProjectId}` by clicking on "Projects" in the navigation and select the Project `Portal`. `{YourProjectId}` is displayed on the top as "Resource Id".
`PROJECT_ID`: You can find `${PROJECT_ID}` by clicking on "Projects" in the navigation and select the Project `Portal`. `${PROJECT_ID}` is displayed on the top as "Resource Id".
`ZITADEL_CLIENT_ID`: Having the project `Portal` selected, click on the Application `portal-web`. `{YourClientID}` is displayed as a field in the OIDC configuration, labelled "Client ID" and has the format `12345678@portal`.
`ZITADEL_CLIENT_ID`: Having the project `Portal` selected, click on the Application `portal-web`. `${CLIENT_ID}` is displayed as a field in the OIDC configuration, labelled "Client ID" and has the format `12345678@portal`.
`SERVICE_ACCOUNT_ACCESS_TOKEN`: Setup a service user, add a Personal Access Token and copy the secret here (see below).
`SERVICE_ACCOUNT_ACCESS_TOKEN`: Set up a service user, add a Personal Access Token and copy the secret here (see below).
## Install and Run
@@ -152,7 +152,7 @@ Login with your user on the customer organization to validate the setup.
### Organization Grant
Switch to the `Demo-Vendor` organization, select Projects in the navigation, and click on `Portal` and then `Grants`.
[Grant all roles of the Project](/guides/manage/console/projects-overview#granted-projects-b2b) to the organization `demo-customer.{YourDomain}.zitadel.cloud`.
[Grant all roles of the Project](/guides/manage/console/projects-overview#granted-projects-b2b) to the organization `demo-customer.$CUSTOM_DOMAIN.zitadel.cloud`.
### Authorization
+1 -1
View File
@@ -375,7 +375,7 @@ OIDC_CLIENT_ID="248680248240075805@dev"
OIDC_CLIENT_SECRET="BJPhEJULSUXseC4geqg5Yg4wWMoy7RgZKar86mbIpt8ZekC5kixMzYGcXLDeeJv7"
```
> The well-known URL needs to be adjusted to your own custom domain.
> The well-known URL needs to be adjusted to your own Custom Domain.
Activate the route that is used as callback by the OIDC bundle:
+2 -2
View File
@@ -98,7 +98,7 @@ https://github.com/zitadel/zitadel-go/blob/next/example/api/http/main.go
```
You will need to provide some values for the program to run:
- `domain`: Your ZITADEL custom domain, e.g. https://my-domain.zitadel.cloud
- `domain`: Your ZITADEL Custom Domain, e.g. https://my-domain.zitadel.cloud
- `key`: The path to the downloaded key.json
- `port`: The port on which the API will be accessible, default it 8089
@@ -107,7 +107,7 @@ You will need to provide some values for the program to run:
After you have configured everything correctly, you can simply start the example by:
```bash
go run main.go --domain <your domain> --key <path>
go run main.go --domain <custom domain> --key <path>
```
This could look like:
+1 -1
View File
@@ -91,7 +91,7 @@ In case you've created your own application and depending on your development se
mvn clean package -DskipTests
```
You will need to provide the `introspection-uri` (your ZITADEL domain> /oauth/v2/introspect), the `client-id` and `client-secret` previously created:
You will need to provide the `introspection-uri` ($CUSTOM_DOMAIN/oauth/v2/introspect), the `client-id` and `client-secret` previously created:
```bash
java \
@@ -74,7 +74,7 @@ target can be created as follows:
See [Create a target](/apis/resources/action_service_v2/action-service-create-target) for more detailed information.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/actions/targets' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -98,7 +98,7 @@ condition.
See [Set an execution](/apis/resources/action_service_v2/action-service-set-execution) for more detailed information.
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/actions/executions' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/actions/executions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -120,7 +120,7 @@ Now that you have set up the target and execution, you can test it by creating a
by calling the ZITADEL API to create a human user.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/users/new' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/users/new' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -100,7 +100,7 @@ As you see in the example above the target is created with HTTP and port '8090'
See [Create a target](/apis/resources/action_service_v2/action-service-create-target) for more detailed information.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/actions/targets' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -124,7 +124,7 @@ condition.
See [Set an execution](/apis/resources/action_service_v2/action-service-set-execution) for more detailed information.
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/actions/executions' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/actions/executions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -78,7 +78,7 @@ As you see in the example above the target is created with HTTP and port '8090'
See [Create a target](/apis/resources/action_service_v2/action-service-create-target) for more detailed information.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/actions/targets' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -102,7 +102,7 @@ condition.
See [Set an execution](/apis/resources/action_service_v2/action-service-set-execution) for more detailed information.
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/actions/executions' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/actions/executions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -129,7 +129,7 @@ As you see in the example above the target is created with HTTP and port '8090'
See [Create a target](/apis/resources/action_service_v2/action-service-create-target) for more detailed information.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/actions/targets' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -152,7 +152,7 @@ To call the target just created before, with the intention to manipulate the req
See [Set an execution](/apis/resources/action_service_v2/action-service-set-execution) for more detailed information.
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/actions/executions' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/actions/executions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -174,7 +174,7 @@ Now that you have set up the target and execution, you can test it by creating a
by calling the ZITADEL API to create a human user.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/users/new' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/users/new' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -203,7 +203,7 @@ Your server should now manipulate the request to something like the following. C
the [Sent information Request](./usage#sent-information-request) payload description.
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/users/new' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/users/new' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -47,7 +47,7 @@ See [Create a target](/apis/resources/action_service_v2/action-service-create-ta
Specify the `payloadType` according to the implementation you want to test: `PAYLOAD_TYPE_JSON`, `PAYLOAD_TYPE_JWT`, or `PAYLOAD_TYPE_JWE`.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/actions/targets' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -85,7 +85,7 @@ openssl rsa -pubout -in private_key.pem -out public_key.pem
Then upload the public key to ZITADEL using the following command. Replace `<TargetID>` with the ID of the target you created earlier.
Use the base64 encoded content of the `public_key.pem` file as the value for `publicKey`.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets/<TargetID>/publickeys' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/actions/targets/<TargetID>/publickeys' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -96,7 +96,7 @@ curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets/<TargetID>/publickeys
Be sure to also activate the public key for the target using the returned `<KeyID>` from the previous request:
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/actions/targets/<TargetID>/publickeys/<KeyID>/activate' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/actions/targets/<TargetID>/publickeys/<KeyID>/activate' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>'
@@ -110,7 +110,7 @@ condition.
See [Set an execution](/apis/resources/action_service_v2/action-service-set-execution) for more detailed information.
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/actions/executions' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/actions/executions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -157,7 +157,7 @@ Now that you have set up the target and execution, you can test it by creating a
by calling the ZITADEL API to create a human user.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/users/new' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/users/new' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -78,7 +78,7 @@ As you see in the example above the target is created with HTTP and port '8090'
See [Create a target](/apis/resources/action_service_v2/action-service-create-target) for more detailed information.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/actions/targets' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -102,7 +102,7 @@ condition.
See [Set an execution](/apis/resources/action_service_v2/action-service-set-execution) for more detailed information.
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/actions/executions' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/actions/executions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -124,7 +124,7 @@ Now that you have set up the target and execution, you can test it by creating a
by calling the ZITADEL API to create a human user.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/users/new' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/users/new' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -144,7 +144,7 @@ target can be created as follows:
See [Create a target](/apis/resources/action_service_v2/action-service-create-target) for more detailed information.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/actions/targets' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -168,7 +168,7 @@ we define an execution with a response condition.
See [Set an execution](/apis/resources/action_service_v2/action-service-set-execution) for more detailed information.
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/actions/executions' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/actions/executions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -78,7 +78,7 @@ As you see in the example above the target is created with HTTP and port '8090'
See [Create a target](/apis/resources/action_service_v2/action-service-create-target) for more detailed information.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/actions/targets' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -102,7 +102,7 @@ condition.
See [Set an execution](/apis/resources/action_service_v2/action-service-set-execution) for more detailed information.
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/actions/executions' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/actions/executions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -124,7 +124,7 @@ Now that you have set up the target and execution, you can test it by creating a
by calling the ZITADEL API to create a human user.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/users/new' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/users/new' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -80,7 +80,7 @@ As shown in the example above, the target is created with HTTP and port '8090'.
See [Create a target](/apis/resources/action_service_v2/action-service-create-target) for more detailed information. Notice that the `endpoint` is your Webhook.site URL.
```shell
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/actions/targets' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/actions/targets' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -117,7 +117,7 @@ See [Set an execution](/apis/resources/action_service_v2/action-service-set-exec
Here, `<TargetID returned>` is the `id` from the previous step.
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/actions/executions' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/actions/executions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -142,7 +142,7 @@ Now that you have set up the target and execution, you can test it by creating a
Here, we are creating a user via the API:
```shell
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/users/human' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/users/human' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -29,7 +29,7 @@ Configure ZITADEL as your _Custom JWT Provider_ following the [MongoDB docs](htt
Configure the following values:
- Signing Algorithm: RS256
- Signing Key: JWK or JWKS URL
- JWKS: https://$CUSTOM-DOMAIN/oauth/v2/keys
- JWKS: https://$CUSTOM_DOMAIN/oauth/v2/keys
- Audience: Your app's client ID which you copied when you created the ZITADEL app
Your configuration should look similar to this:
@@ -85,7 +85,7 @@ The following Claims are used within the Logout Token:
| Claim | Example | Description |
|--------|----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------|
| iss | `$CUSTOM-DOMAIN` | Issuer Identifier |
| iss | `${CUSTOM_DOMAIN}` | Issuer Identifier |
| sub | `77776025198584418` | Subject Identifier (the user who signed out) |
| aud | `69234237810729019` | Audience(s), will always contain your client_id |
| iat | `1311280970` | Issued at time |
@@ -39,7 +39,7 @@ You will have to paste it in the Apple service later.
4. Add a description and a unique identifier and click "register"
5. Select your registered service from the list and enable sign in with Apple, then click "configure"
6. Choose the previously created App in the Primary App ID List
7. Add your custom domain in the domains and subdomains field
7. Add your Custom Domain in the domains and subdomains field
- Example domain for `https://acme-gzoe4x.zitadel.cloud` would look like this: `acme-gzoe4x.zitadel.cloud`
8. [Paste the ZITADEL Callback URL you copied before](#open-the-apple-identity-provider-template) to the Return URLs
@@ -74,7 +74,7 @@ The authentication flow with JWT IdP looks like this:
// 2. Prepare the ZITADEL endpoint URL and copy all query params
const userUrl = new URL(request.url);
// Important: The ZITADEL_JWT_IDP_ENDPOINT should be your ZITADEL custom domain plus "/idps/jwt"
// Important: The ZITADEL_JWT_IDP_ENDPOINT should be your ZITADEL Custom Domain plus "/idps/jwt"
// For example: https://accounts.test.com/idps/jwt
const zitadelUrl = new URL(env.ZITADEL_JWT_IDP_ENDPOINT);
userUrl.searchParams.forEach((v, k) => zitadelUrl.searchParams.set(k, v));
@@ -99,7 +99,7 @@ The authentication flow with JWT IdP looks like this:
}
```
*(Replace `getJwtForCurrentSession` with your logic for retrieving/creating a JWT from the user's WAF session.
Note: `env.ZITADEL_JWT_IDP_ENDPOINT` should be set to the custom domain of your ZITADEL instance
Note: `env.ZITADEL_JWT_IDP_ENDPOINT` should be set to the Custom Domain of your ZITADEL instance
with the `/idps/jwt` path, e.g. `https://accounts.test.com/idps/jwt`.)*
5. **ZITADEL receives and validates the JWT (Server-side):**
@@ -25,7 +25,7 @@ import TestSetup from './_test_setup.mdx';
4. Go to the Auth Settings of the App and add the following URL to the "Authorized redirect URLs"
- Login V1: `${CUSTOM_DOMAIN}/ui/login/login/externalidp/callback`
- Example redirect url for the domain `https://acme.zitadel.cloud` would look like this: `https://acme.zitadel.cloud/ui/login/login/externalidp/callback`
- Login V2: `{LOGINGV2_DOMAIN}/idps/callback`
- Login V2: `${LOGINGV2_DOMAIN}/idps/callback`
- In this case the url would look like this: `https://acme.zitadel.cloud/idps/callback`
5. Verify the app as your company
6. In the Auth - OAuth 2.0 scopes section you should see `openid`, `profile` and `email` listed
@@ -76,7 +76,7 @@ While the hosted login page provides a default authentication interface out-of-t
Developers can customize elements such as logos, colors, and messaging to ensure a seamless integration with their application's user interface.
:::info Customization and Branding
The login page can be changed by customizing different branding aspects and you can define a custom domain for the login (eg, login.acme.com).
The login page can be changed by customizing different branding aspects and you can define a Custom Domain for the login (eg, login.acme.com).
By default, the displayed branding is defined [based on the user's domain](/docs/guides/solution-scenarios/domain-discovery). In case you want to show the branding of a specific organization by default, you need to either pass a primary domain scope (`urn:zitadel:iam:org:domain:primary:{domainname}`) with the authorization request, or define the behavior on your Project's settings.
:::
@@ -157,7 +157,7 @@ For the first implementation we have excluded the following features:
#### Step-by-step Guide
**Using the new login:** To use the new login without changing your current setup, the easiest way is to visit `https://<CUSTOM_DOMAIN>/ui/v2/login` on your Zitadel Cloud custom domain.
**Using the new login:** To use the new login without changing your current setup, the easiest way is to visit `https://${CUSTOM_DOMAIN}/ui/v2/login` on your Zitadel Cloud Custom Domain.
You can also activate the v2 login for your apps, so users are redirected to `/ui/v2/login` for authentication.
**Customizing the new login:** The easiest way to actually customizing it is to fork the https://github.com/zitadel/zitadel repo and use the [Deploy with Vercel button](https://github.com/zitadel/zitadel/blob/main/CONTRIBUTING.md#login-deploy) to run your login code on Vercel.
@@ -37,7 +37,7 @@ If you have specified some post_logout_redirect_uris on your client you have to
So ZITADEL is able to read the configured redirect uris.
```
GET $CUSTOM-DOMAIN/oidc/v1/end_session
GET ${CUSTOM_DOMAIN}/oidc/v1/end_session
?id_token_hint={id_token}
&post_logout_redirect_uri=https://rp.example.com/logged_out
&state=random_string
@@ -106,7 +106,7 @@ When the request does not contain any specific configuration,
[RSA](#rsa) is used as default with the default options as described below:
```bash
curl -L 'https://$CUSTOM-DOMAIN/v2/web_keys' \
curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -130,7 +130,7 @@ The RSA generator config takes two enum values.
For example, to create a RSA web key with the size of 3072 bits and the SHA512 algorithm (RS512):
```bash
curl -L 'https://$CUSTOM-DOMAIN/v2/web_keys' \
curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -154,7 +154,7 @@ The ECDSA generator config takes a single `curve` enum value which determines bo
For example, to create a ECDSA web key with a P-256 curve and the SHA256 algorithm:
```bash
curl -L 'https://$CUSTOM-DOMAIN/v2/web_keys' \
curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -178,7 +178,7 @@ Clients which support both curves must inspect `crv` header value to assert the
For example, to create a ed25519 web key:
```bash
curl -L 'https://$CUSTOM-DOMAIN/v2/web_keys' \
curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -240,11 +240,11 @@ For the sake of this example we will use simplified IDs and restrict timestamps
After one month, on 2025-02-01, we wish to activate the next available key and create a new key to be available for activation next month. This fulfills requirements 1 and 2.
```bash
curl -L -X POST 'https://$CUSTOM-DOMAIN/v2/web_keys/2/_activate' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/v2/web_keys/2/_activate' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>'
curl -L 'https://$CUSTOM-DOMAIN/v2/web_keys' \
curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -276,7 +276,7 @@ In addition to the activate and create calls we made on this iteration,
we can now safely delete the oldest key, as both requirement 3 and 4 are now fulfilled:
```bash
curl -L -X DELETE 'https://$CUSTOM-DOMAIN/v2/web_keys/1' \
curl -L -X DELETE 'https://${CUSTOM_DOMAIN}/v2/web_keys/1' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>'
```
@@ -170,7 +170,7 @@ Per default the user will automatically get "ORG_OWNER".
#### Example Request
```bash
curl -L -X POST 'https://$CUSTOM-DOMAIN/admin/v1/orgs/_setup' \
curl -L -X POST 'https://${CUSTOM_DOMAIN}/admin/v1/orgs/_setup' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -34,14 +34,14 @@ You will need to craft a POST request to ZITADEL's token endpoint:
```bash
curl --request POST \
--url https://$CUSTOM-DOMAIN/oauth/v2/token \
--url https://${CUSTOM_DOMAIN}/oauth/v2/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data grant_type=client_credentials \
--data scope='openid profile' \
--user "$CLIENT_ID:$CLIENT_SECRET"
```
* `CUSTOM_DOMAIN` should be set to your [custom domain](/docs/concepts/features/custom-domain)
* `CUSTOM_DOMAIN` should be set to your [Custom Domain](/docs/concepts/features/custom-domain)
* `grant_type` should be set to `client_credentials`
* `scope` should contain any [Scopes](/apis/openidoauth/scopes) you want to include, but must include `openid`. For this example, please include `profile`
* `CLIENT_ID` and `CLIENT_SECRET` should be set with the values shown in Console when generating a new secret to enable [basic authentication](/docs/apis/openidoauth/authn-methods)
@@ -50,7 +50,7 @@ In this example we read the organization of the service user.
```bash
curl --request GET \
--url $CUSTOM-DOMAIN/management/v1/orgs/me \
--url ${CUSTOM_DOMAIN}/management/v1/orgs/me \
--header 'Authorization: Bearer {PAT}'
```
@@ -108,7 +108,7 @@ Payload:
{
"iss": "100507859606888466",
"sub": "100507859606888466",
"aud": "https://$CUSTOM-DOMAIN",
"aud": "https://${CUSTOM_DOMAIN}",
"iat": [Current UTC timestamp, e.g. 1605179982, must be no older than 1 hour],
"exp": [Expiration UTC timestamp, e.g. 1605183582]
}
@@ -165,7 +165,7 @@ With the encoded JWT from the previous step, craft a POST request to ZITADEL's t
```bash
curl --request POST \
--url https:/$CUSTOM-DOMAIN/oauth/v2/token \
--url https:/${CUSTOM_DOMAIN}/oauth/v2/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer \
--data scope='openid' \
@@ -45,7 +45,7 @@ can connect to ZITADEL as a SAML2 IDP.
4. Download the ZITADEL-used certificate to sign the responses, so that AWS can validation the signature.
You can download the certificate from following
URL: \{your_instance_domain}/saml/v2/certificate
URL: `${CUSTOM_DOMAIN}/saml/v2/certificate`
5. Then upload the ".crt"-file to AWS and click "next".
@@ -51,7 +51,7 @@ Check your application, if everything is correct, press "Create".
Complete the configuration as follows:
- `Identity provider single sign-on URL`: $CUSTOM-DOMAIN/saml/v2/SSO
- `Identity provider single sign-on URL`: `${CUSTOM_DOMAIN}/saml/v2/SSO`
- `Certificate fingerprint`: You need to download the certificate from \{your_instance_domain}/saml/v2/certificate and create a SHA1 fingerprint
Save the changes.
@@ -39,7 +39,7 @@ Download the public certificate from your ZITADEL instance by requesting `${CUST
wget ${CUSTOM_DOMAIN}/saml/v2/certificate -O idp.crt
```
Always replace `${CUSTOM_DOMAIN}` with your custom domain.
Always replace `${CUSTOM_DOMAIN}` with your Custom Domain.
Use the following configuration
@@ -119,24 +119,24 @@ Open the Google settings for [SSO with third-party IdP](https://admin.google.com
![SSO with third-party IdP](/img/guides/integrate/services/google-workspace-sso-overview.png)
Download the public certificate from your ZITADEL instance by requesting `$YOUR_DOMAIN/saml/v2/certificate`
Download the public certificate from your ZITADEL instance by requesting `${CUSTOM_DOMAIN}/saml/v2/certificate`
```bash
wget $YOUR_DOMAIN/saml/v2/certificate -O idp.crt
wget ${CUSTOM_DOMAIN}/saml/v2/certificate -O idp.crt
```
Always replace `$YOUR_DOMAIN` with your custom domain.
Always replace `${CUSTOM_DOMAIN}` with your Custom Domain.
Use the following configuration
| Setting | Value |
| --- | --- |
| SSO profile name | ZITADEL SSO |
| IDP entity ID | $YOUR_DOMAIN/saml/v2/metadata |
| Sign-in page URL | $YOUR_DOMAIN/saml/v2/SSO |
| Sign-out page URL | $YOUR_DOMAIN/saml/v2/SLO |
| Change password URL | $YOUR_DOMAIN/ui/console/users/me?id=security |
| Verification Certificate | Upload the certificate (idp.crt) |
| Setting | Value |
|--------------------------|----------------------------------------------------|
| SSO profile name | ZITADEL SSO |
| IDP entity ID | `${CUSTOM_DOMAIN}`/saml/v2/metadata |
| Sign-in page URL | `${CUSTOM_DOMAIN}`/saml/v2/SSO |
| Sign-out page URL | `${CUSTOM_DOMAIN}`/saml/v2/SLO |
| Change password URL | `${CUSTOM_DOMAIN}`/ui/console/users/me?id=security |
| Verification Certificate | Upload the certificate (idp.crt) |
Now go ahead and click *SAVE*
@@ -190,7 +190,7 @@ These preparation steps are needed for all Token Exchange interaction, including
As Token Exchange is still a beta feature, the feature needs to be enabled for your instance by an `IAM_OWNER` first:
```bash
curl -L -X PUT 'https://$CUSTOM-DOMAIN/v2/features/instance' \
curl -L -X PUT 'https://${CUSTOM_DOMAIN}/v2/features/instance' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <IAM_OWNER_TOKEN>' \
@@ -829,7 +829,7 @@ And the `subject_token`:
}
```
In both cases the issuer is the web application, the audience must be the zitadel domain. For the assertion the subject is the application and for the subject token the subject is the impersonated user.
In both cases the issuer is the web application, the audience must be the Custom Domain. For the assertion the subject is the application and for the subject token the subject is the impersonated user.
Response:
@@ -82,10 +82,10 @@ To use Private Key JWT for introspection, you must register your client applicat
```
{
"type": "application",
"keyId": "<YOUR_KEY_ID>",
"key": "-----BEGIN RSA PRIVATE KEY-----\n<YOUR_PRIVATE_KEY>\n-----END RSA PRIVATE KEY-----\n",
"appId": "<YOUR_APP_ID>",
"clientId": "<YOUR_CLIENT_ID>"
"keyId": "${YOUR_KEY_ID}",
"key": "-----BEGIN RSA PRIVATE KEY-----\n${YOUR_PRIVATE_KEY}\n-----END RSA PRIVATE KEY-----\n",
"appId": "${YOUR_APP_ID}",
"clientId": "${YOUR_CLIENT_ID}"
}
```
@@ -111,11 +111,11 @@ To introspect an access token in ZITADEL, your backend must authenticate by prov
**Required request parameters:**
| **Parameter** | **Description** |
|------------------------- |---------------------------------------------------------------------------------------------------------------------|
| `client_assertion` | The JWT assertion created and signed as described below. |
| `client_assertion_type` | Must be `urn:ietf:params:oauth:client-assertion-type:jwt-bearer` |
| `token` | The access token you want to introspect. |
| **Parameter** | **Description** |
|-------------------------|------------------------------------------------------------------|
| `client_assertion` | The JWT assertion created and signed as described below. |
| `client_assertion_type` | Must be `urn:ietf:params:oauth:client-assertion-type:jwt-bearer` |
| `token` | The access token you want to introspect. |
### Creating the Client Assertion (JWT)
@@ -125,16 +125,16 @@ The `client_assertion` parameter is a signed JWT with the following structure:
```json
{
"alg": "RS256",
"kid": "<YOUR_KEY_ID>"
"kid": "${YOUR_KEY_ID}"
}
```
**Payload:**
```json
{
"iss": "<YOUR_CLIENT_ID>",
"sub": "<YOUR_CLIENT_ID>",
"aud": "https://${YOUR_DOMAIN}", // Your ZITADEL issuer URL
"iss": "${YOUR_CLIENT_ID}",
"sub": "${YOUR_CLIENT_ID}",
"aud": "https://${CUSTOM_DOMAIN}", // Your ZITADEL issuer URL / Custom Domain
"exp": 1605183582, // Expiry (Unix timestamp)
"iat": 1605179982 // Issued at (Unix timestamp, not older than 1 hour)
}
@@ -153,7 +153,7 @@ Make a POST request to the introspection endpoint, sending the above parameters:
```bash
curl --request POST \
--url ${YOUR_DOMAIN}/oauth/v2/introspect \
--url ${CUSTOM_DOMAIN}/oauth/v2/introspect \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer \
--data client_assertion=eyJhbGciOiJSUzI1Ni... \
@@ -7,7 +7,7 @@ You will need to craft a POST request to ZITADEL's token endpoint:
```bash
curl --request POST \
--url https://$CUSTOM-DOMAIN/oauth/v2/token \
--url https://${CUSTOM_DOMAIN}/oauth/v2/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic ${BASIC_AUTH}' \
--data grant_type=client_credentials \
@@ -40,7 +40,7 @@ You will need to craft a POST request to ZITADEL's token endpoint:
```bash
curl --request POST \
--url https://$CUSTOM-DOMAIN/oauth/v2/token \
--url https://${CUSTOM_DOMAIN}/oauth/v2/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic ${BASIC_AUTH}' \
--data grant_type=client_credentials \
@@ -68,7 +68,7 @@ Content-Type: application/json
```bash
curl --request GET \
--url $CUSTOM-DOMAIN/management/v1/orgs/me \
--url ${CUSTOM_DOMAIN}/management/v1/orgs/me \
--header "Authorization: Bearer $TOKEN"
```
@@ -109,7 +109,7 @@ A sample request will look like this
```bash {5}
curl --request POST \
--url $CUSTOM-DOMAIN/oauth/v2/token \
--url ${CUSTOM_DOMAIN}/oauth/v2/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer \
--data scope='openid profile urn:zitadel:iam:org:project:id:zitadel:aud' \
@@ -140,7 +140,7 @@ In the following example, we read the organization of the service user.
```bash
curl --request GET \
--url $CUSTOM-DOMAIN/management/v1/orgs/me \
--url ${CUSTOM_DOMAIN}/management/v1/orgs/me \
--header 'Authorization: Bearer ${TOKEN}'
```
@@ -181,7 +181,7 @@ You will need to craft a POST request to ZITADEL's token endpoint:
```bash {6}
curl --request POST \
--url https://$CUSTOM-DOMAIN/oauth/v2/token \
--url https://${CUSTOM_DOMAIN}/oauth/v2/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic ${BASIC_AUTH}' \
--data grant_type=client_credentials \
@@ -212,7 +212,7 @@ In this example we read the organization of the service user.
```bash
curl --request GET \
--url $CUSTOM-DOMAIN/management/v1/orgs/me \
--url ${CUSTOM_DOMAIN}/management/v1/orgs/me \
--header 'Authorization: Bearer ${TOKEN}'
```
@@ -225,7 +225,7 @@ In this example, we read the organization of the service user.
```bash
curl --request GET \
--url $CUSTOM-DOMAIN/management/v1/orgs/me \
--url ${CUSTOM_DOMAIN}/management/v1/orgs/me \
--header 'Authorization: Bearer {PAT}'
```
@@ -89,7 +89,7 @@ The JWT payload will need to contain the following claims:
{
"iss": "<userid>",
"sub": "<userid>",
"aud": "<https://$CUSTOM-DOMAIN>",
"aud": "<https://${CUSTOM_DOMAIN}>",
"exp": <now+1h>,
"iat": <now>
}
@@ -125,7 +125,7 @@ Now that you configured ZITADEL and created a JWT, you can call the System API a
```bash
curl --request POST \
--url $CUSTOM-DOMAIN/system/v1/instances/_search \
--url ${CUSTOM_DOMAIN}/system/v1/instances/_search \
--header 'Authorization: Bearer {token}' \
--header 'Content-Type: application/json'
```
@@ -24,7 +24,7 @@ To further restrict your result you can add the following filters:
```bash
curl --request POST \
--url $CUSTOM-DOMAIN/admin/v1/events/_search \
--url ${CUSTOM_DOMAIN}/admin/v1/events/_search \
--header "Authorization: Bearer $TOKEN"
```
@@ -34,7 +34,7 @@ To be able to filter for the different event types ZITADEL knows, you can reques
```bash
curl --request POST \
--url $CUSTOM-DOMAIN/admin/v1/events/types/_search \
--url ${CUSTOM_DOMAIN}/admin/v1/events/types/_search \
--header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \
'
@@ -70,7 +70,7 @@ To be able to filter for the different aggregate types (resources) ZITADEL knows
```bash
curl --request POST \
--url $CUSTOM-DOMAIN/admin/v1/aggregates/types/_search \
--url ${CUSTOM_DOMAIN}/admin/v1/aggregates/types/_search \
--header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json'
```
@@ -101,7 +101,7 @@ This example shows you how to get all events from users, filtered with the creat
```bash
curl --request POST \
--url $CUSTOM-DOMAIN/admin/v1/events/_search \
--url ${CUSTOM_DOMAIN}/admin/v1/events/_search \
--header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \
--data '{
@@ -124,7 +124,7 @@ Sessions without tokens events may by created during implicit flow with ID Token
```bash
curl --request POST \
--url $CUSTOM-DOMAIN/admin/v1/events/_search \
--url ${CUSTOM_DOMAIN}/admin/v1/events/_search \
--header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \
--data '{
@@ -148,7 +148,7 @@ The following example shows you how you could use the events search to get all e
```bash
curl --request POST \
--url $CUSTOM-DOMAIN/admin/v1/events/_search \
--url ${CUSTOM_DOMAIN}/admin/v1/events/_search \
--header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \
--data '{
@@ -177,7 +177,7 @@ In this case these are the following events:
```bash
curl --request POST \
--url $CUSTOM-DOMAIN/admin/v1/events/_search \
--url ${CUSTOM_DOMAIN}/admin/v1/events/_search \
--header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \
--data '{
@@ -49,7 +49,7 @@ https://github.com/zitadel/zitadel-go/blob/next/example/client/cli/cli.go
After you have configured everything correctly, you can simply start the example by:
```bash
go run cli.go --domain <your domain> --key <path>
go run cli.go --domain <custom domain> --key <path>
```
This could look like:
+8 -8
View File
@@ -16,7 +16,7 @@ To be able to add more instances please upgrade to "ZITADEL Pro".
## Overview
The overview shows all the instances that are registered for your customer.
You can directly see the custom domain and data region.
You can directly see the Custom Domain and data region.
With a click on an instance you get to the detail of the chosen instance.
@@ -34,7 +34,7 @@ Click on the new button above the instance table to create a new instance.
3. Instance created! You can now see the details of your first instance.
:::info
Every new instance gets a generated domain of the form [instancename][randomnumber].zitadel.cloud
Every new instance gets a generated Custom Domain of the form [instancename][randomnumber].zitadel.cloud
:::
![New Instance](/img/manuals/portal/customer_portal_new_instance.gif)
@@ -65,11 +65,11 @@ You can also upgrade manually at any time.
### Add Custom Domain
We recommend register a custom domain to access your ZITADEL instance.
The primary custom domain of your ZITADEL instance will be the issuer of the instance. All other custom domains can be used to access the instance itself
We recommend register a Custom Domain to access your ZITADEL instance.
The primary Custom Domain of your ZITADEL instance will be the issuer of the instance. All other Custom Domains can be used to access the instance itself
1. Browse to the "Custom Domains" Tab
2. Click **Add domain**
2. Click **Add Custom Domain**
3. Enter the domain you want and select the instance where the domain should belong to
4. In the next screen you will get all the information you will have to add to your DNS provider to verify your domain
@@ -80,14 +80,14 @@ Be aware that it has some impacts if you change the primary domain of your insta
1. The urls and issuer have to change in your app
2. Passkey authentication is based on the domain, if you change it, your users will not be able to login with the registered passkey authentication
![Add custom domain](/img/manuals/portal/customer_portal_add_domain.png)
![Add Custom Domain](/img/manuals/portal/customer_portal_add_domain.png)
#### Verify Custom Domain
As soon as you have added your custom domain you will have to verify it, by adding a CNAME record to your DNS provider.
As soon as you have added your Custom Domain you will have to verify it, by adding a CNAME record to your DNS provider.
1. Go to your DNS provider
2. Add a new CNAME record (You can find the target on the detail page of your instance)
3. After adding the CNAME you need to wait till the domain is verified (this can take some time)
You will now be able to use the added custom domain to access your ZITADEL instance
You will now be able to use the added Custom Domain to access your ZITADEL instance
@@ -11,7 +11,7 @@ While the Console is primarily a tool for administrators, it can also be accesse
## Accessing the Console
The console is available by navigating to the [custom domain](/docs/concepts/features/custom-domain) of your instance and appending the path `/ui/console`.
The console is available by navigating to the [Custom Domain](/docs/concepts/features/custom-domain) of your instance and appending the path `/ui/console`.
## Navigation and Context
@@ -87,7 +87,7 @@ You can configure on which changes the users will be notified. The text of the m
### SMTP
On each instance we configure our default SMTP provider. To make sure, that you only send some E-Mails from domains you own, you need to add a custom domain on your instance.
On each instance we configure our default SMTP provider. To make sure, that you only send some E-Mails from domains you own, you need to add a Custom Domain on your instance.
You can configure many SMTP providers using templates for popular providers. The templates will add known settings like host, port or default user and will suggest values for user and/or password.
@@ -102,7 +102,7 @@ Email delivery through this service may be **delayed or temporarily unstable**.
For any **production setup**, you must configure your own SMTP provider to ensure reliable and consistent email delivery.
:::
Go to the ZITADEL [customer portal](https://zitadel.cloud) to configure a custom domain.
Go to the ZITADEL [customer portal](https://zitadel.cloud) to configure a Custom Domain.
To configure your custom SMTP please fill the following fields:
@@ -277,7 +277,7 @@ If it is set to false, all registered domain will automatically be created as ve
### SMTP Sender Address matches Custom Domain
If enabled, the SMTP server address must match the instance's primary custom domain.
If enabled, the SMTP server address must match the instance's primary Custom Domain.
With that you can ensure that users receive notifications from the same domain that is used for login.
### Use email as username
@@ -23,7 +23,7 @@ If you choose your logged in user as organization manager, a membership for the
alt="Select Organization"
/>
If you want to enable your customers to create their organization by themselves, we provide a creation form for an organization. `<https://$CUSTOM-DOMAIN/ui/login/register/org`
If you want to enable your customers to create their organization by themselves, we provide a creation form for an organization. `https://${CUSTOM_DOMAIN}/ui/login/register/org`
The customer needs to fill in the form with the organization name and the contact details.
<img
+1 -1
View File
@@ -5,7 +5,7 @@ sidebar_label: Overview
## What is console?
Console is the Dashboard UI for your instance. It can be accessed from all configured custom domains, defined in the Customer Portal.
Console is the Dashboard UI for your instance. It can be accessed from all configured Custom Domains, defined in the Customer Portal.
The console is used to configure global default settings and can be used by multiple Managers.
Read more about [Console Managers](./managers) here.
@@ -43,7 +43,7 @@ A provider with HTTP type will send the messages and the data to a pre-defined w
First [add a new SMS Provider of type HTTP](/apis/resources/admin/admin-service-add-sms-provider-http) to create a new HTTP provider that can be used to send SMS messages:
```bash
curl -L 'https://$CUSTOM-DOMAIN/admin/v1/sms/http' \
curl -L 'https://${CUSTOM_DOMAIN}/admin/v1/sms/http' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -60,7 +60,7 @@ A provider with HTTP type will send the messages and the data to a pre-defined w
To use the HTTP provider you need to [activate the SMS provider](/apis/resources/admin/admin-service-activate-sms-provider):
```bash
curl -L 'https://$CUSTOM-DOMAIN/admin/v1/sms/:id/_activate' \
curl -L 'https://${CUSTOM_DOMAIN}/admin/v1/sms/:id/_activate' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -77,7 +77,7 @@ A provider with HTTP type will send the messages and the data to a pre-defined w
First [add a new Email Provider of type HTTP](/apis/resources/admin/admin-service-add-email-provider-http) to create a new HTTP provider that can be used to send Email messages:
```bash
curl -L 'https://$CUSTOM-DOMAIN/admin/v1/email/http' \
curl -L 'https://${CUSTOM_DOMAIN}/admin/v1/email/http' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -94,7 +94,7 @@ A provider with HTTP type will send the messages and the data to a pre-defined w
To use the HTTP provider you need to [activate the Email provider](/apis/resources/admin/admin-service-activate-email-provider):
```bash
curl -L 'https://$CUSTOM-DOMAIN/admin/v1/email/:id/_activate' \
curl -L 'https://${CUSTOM_DOMAIN}/admin/v1/email/:id/_activate' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
@@ -50,7 +50,7 @@ Request the user information by calling the [userinfo endpoint](/docs/apis/openi
```bash
curl --request GET \
--url "https://$CUSTOM-DOMAIN/oidc/v1/userinfo" \
--url "https://${CUSTOM_DOMAIN}/oidc/v1/userinfo" \
--header "Authorization: Bearer $ACCESS_TOKEN"
```
@@ -161,10 +161,10 @@ If you get the error "invalid audience (APP-Zxfako)", then you need to add the r
You can request the user's metadata with the [List My Metadata](/docs/apis/resources/auth/auth-service-list-my-metadata) method:
```bash
curl -L -X POST "https://$CUSTOM-DOMAIN/auth/v1/users/me/metadata/_search" \
curl -L -X POST "https://${CUSTOM_DOMAIN}/auth/v1/users/me/metadata/_search" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
--data-raw '{
"query": {
"offset": "0",
@@ -174,7 +174,7 @@ curl -L -X POST "https://$CUSTOM-DOMAIN/auth/v1/users/me/metadata/_search" \
"queries": [
{
"keyQuery": {
"key": "$METADATA_KEY",
"key": "${METADATA_KEY}",
"method": "TEXT_QUERY_METHOD_EQUALS"
}
}
@@ -182,9 +182,9 @@ curl -L -X POST "https://$CUSTOM-DOMAIN/auth/v1/users/me/metadata/_search" \
}'
```
Replace `$ACCESS_TOKEN` with your user's access token.
Replace `$CUSTOM-DOMAIN` with your ZITADEL instance's url.
Replace `$METADATA_KEY` with they key you want to search for (f.e. "ContractNumber")
Replace `${ACCESS_TOKEN}` with your user's access token.
Replace `${CUSTOM_DOMAIN}` with your ZITADEL instance's url.
Replace `${METADATA_KEY}` with they key you want to search for (f.e. "ContractNumber")
:::info Get all metadata
You can omit the queries array to retrieve all metadata key-value pairs.
@@ -30,7 +30,7 @@ We can do so by calling the [create user schema endpoint](/docs/apis/resources/u
with the following data. Make sure to provide an `access_token` with an `IAM_OWNER` role.
```bash
curl -X POST "https://$CUSTOM-DOMAIN/v3alpha/user_schemas" \
curl -X POST "https://${CUSTOM_DOMAIN}/v3alpha/user_schemas" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H "Authorization: Bearer $ACCESS_TOKEN" \
@@ -92,7 +92,7 @@ Finally, we call the [update user schema endpoint](/docs/apis/resources/user_sch
with the following data. Be sure to provide the id of the previously created schema.
```bash
curl -X PUT "https://$CUSTOM-DOMAIN/v3alpha/user_schemas/$SCHEMA_ID" \
curl -X PUT "https://${CUSTOM_DOMAIN}/v3alpha/user_schemas/$SCHEMA_ID" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H "Authorization: Bearer $ACCESS_TOKEN" \
@@ -141,7 +141,7 @@ In this case we will query for the one with state `active`. Check out the api do
The API also allows retrieving a single [schema by ID](/apis/resources/user_schema_service_v3/user-schema-service-get-user-schema-by-id).
```bash
curl -X POST "https://$CUSTOM-DOMAIN/v3alpha/user_schemas/search" \
curl -X POST "https://${CUSTOM_DOMAIN}/v3alpha/user_schemas/search" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H "Authorization: Bearer $ACCESS_TOKEN" \
+1 -1
View File
@@ -144,7 +144,7 @@ There are two recommended authentication methods:
#### Example cURL request
```bash
curl --location 'https://<instance-domain>/admin/v1/import' \
curl --location 'https://${CUSTOM_DOMAIN}/admin/v1/import' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <access-token>' \
+2 -2
View File
@@ -128,7 +128,7 @@ Use your **access token** or **PAT** to authenticate, then call the [Management
```bash
curl --request POST \
--url https://<instance-domain>/admin/v1/import \
--url https://${CUSTOM_DOMAIN}/admin/v1/import \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <token>' \
--data @importBody.json
@@ -197,7 +197,7 @@ You can verify that users were imported successfully by querying the **events AP
Use the following request:
```bash
curl --location 'https://<instance-domain>/admin/v1/events/_search' \
curl --location 'https://${CUSTOM_DOMAIN}/admin/v1/events/_search' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
+2 -2
View File
@@ -18,10 +18,10 @@ Creation can be done from [ZITADEL Console](https://${CUSTOM_DOMAIN}.zitadel.clo
Depending on your Software Development Life Cycle (SDLC) you can create multiple organizations or projects to keep your applications environments separated.
### Custom domain
### Organization Domain
Right after org creation you'll be greeted with the domain section of your organization.
ZITADEL automatically creates a custom domain of the form `[orgname].zitadel.cloud`, but you can create your own. Depending on the settings on the [Domain Policy](../../concepts/structure/policies) it has to be verified by saving a verification file on the specified location.
ZITADEL automatically creates an organization domain of the form `[orgname].zitadel.cloud`, but you can create your own. Depending on the settings on the [Domain Policy](../../concepts/structure/policies) it has to be verified by saving a verification file on the specified location.
We recommend that you create your domains early as they create a sense of confidence and trust for your application and changes later on might create additional migration effort.
You can read more about how ZITADEL handles usernames [here](../manage/console/organizations#how-zitadel-handles-usernames).
@@ -11,7 +11,7 @@ Domain discovery is typically used in [B2B](./b2b) or [SaaS](./saas) scenarios w
![Overview Domain Discovery](/img/guides/solution-scenarios/domain-discovery.png)
In the example there is a service provider with a ZITADEL instance running on a [custom domain](/docs/guides/manage/cloud/instances#add-custom-domain) on `login.mycompany.com`.
In the example there is a service provider with a ZITADEL instance running on a [Custom Domain](/docs/guides/manage/cloud/instances#add-custom-domain) on `login.mycompany.com`.
By default all users login on the organization **CIAM** with their preferred social login provider.
Users of the two business customers **Alpha** and **Beta** should login according to their organization login and access policy settings.
@@ -51,7 +51,7 @@ Follow this [configuration guide](/docs/guides/solution-scenarios/configurations
### Other considerations
You can also have multiple custom domains pointing to the same instance as described in this [configuration guide](/docs/guides/solution-scenarios/configurations#custom-application-domain-per-organization). In our example you could also use `alpha.mycompany.com` to show the login page of your instance.
You can also have multiple Custom Domains pointing to the same instance as described in this [configuration guide](/docs/guides/solution-scenarios/configurations#custom-application-domain-per-organization). In our example you could also use `alpha.mycompany.com` to show the login page of your instance.
The domain of your email notification can be changed by [setting up your SMTP](/docs/guides/manage/console/default-settings#smtp).
@@ -104,7 +104,7 @@ You should be all setup to try out domain discovery.
The user journeys for the different users would look as follows:
- User (Alice, Bob, Chuck) clicks a login button in your application
- Redirected to `login.mycompany.com` (ZITADEL running under a custom domain)
- Redirected to `login.mycompany.com` (ZITADEL running under a Custom Domain)
Chuck
@@ -57,10 +57,10 @@ More detailed information about creating a PAT and manager roles you can find [h
Then you have to send the following request:
```bash
curl -L -X PUT "https://${CUSTOM_DOMAIN}/management/v1/projects/$PROJECT_ID" \
curl -L -X PUT "https://${CUSTOM_DOMAIN}/management/v1/projects/${PROJECT_ID}" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H "Authorization: Bearer $PAT" \
-H "Authorization: Bearer ${PAT}" \
--data-raw '{
"name": "ZITADEL",
"projectRoleAssertion": false,
@@ -71,9 +71,9 @@ curl -L -X PUT "https://${CUSTOM_DOMAIN}/management/v1/projects/$PROJECT_ID" \
```
Where
- CUSTOM_DOMAIN is your domain, f.e. mydemo.zitadel.cloud
- PAT is your service user's personal access token
- PROJECT_ID is the default-project's ID that can be found in Console, see screenshot above
- `${CUSTOM_DOMAIN}` is your Custom Domain, f.e. mydemo.zitadel.cloud
- `${PAT}` is your service user's personal access token
- `${PROJECT_ID}` is the default-project's ID that can be found in Console, see screenshot above
You should now be able to login with users of organization that have the grant (in this example users of the organization "Customer-A").
All other users should see the following error message after authentication:
@@ -1,5 +1,5 @@
`ID=QUERY-n0wng Message=Instance not found`
If you're self hosting with a custom domain, you need to instruct ZITADEL to use the `ExternalDomain`.
You can find further instructions in our guide about [custom domains](/docs/self-hosting/manage/custom-domain).
If you're self hosting with a Custom Domain, you need to instruct ZITADEL to use the `ExternalDomain`.
You can find further instructions in our guide about [Custom Domains](/docs/self-hosting/manage/custom-domain).
We also provide a guide on how to [configure](/docs/self-hosting/manage/configure) ZITADEL with variables from files or environment variables.
+1 -1
View File
@@ -161,7 +161,7 @@ Caches:
All HTTP and gRPC requests sent to ZITADEL receive an instance context. The instance is usually resolved by the domain from the request. In some cases, like the [system service](/docs/apis/resources/system/system-service), the instance can be resolved by its ID. An instance object contains many of the [default settings](/docs/guides/manage/console/default-settings):
- Instance [features](/docs/guides/manage/console/default-settings#features)
- Custom domains: generated and [custom](/docs/guides/manage/cloud/instances#add-custom-domain)
- Custom Domains: generated and [custom](/docs/guides/manage/cloud/instances#add-custom-domain)
- [Trusted domains](/docs/apis/resources/admin/admin-service-add-instance-trusted-domain)
- Security settings ([IFrame policy](/docs/guides/solution-scenarios/configurations#embedding-zitadel-in-an-iframe))
- Limits[^2]
@@ -23,7 +23,7 @@ ExternalPort: 8080
ExternalSecure: false
```
For productive setups however, we recommend using HTTPS and a custom domain:
For productive setups however, we recommend using HTTPS and a Custom Domain:
```yaml
ExternalDomain: 'zitadel.my.domain'
+1 -1
View File
@@ -70,7 +70,7 @@ Instead of `urn:zitadel:iam:org:project:id:zitadel:aud` you could also use `urn:
The WebFinger requirement and setup is a step a user has to take outside of their IdP set-up. WebFinger is a protocol which supports the ability for OIDC issuer discovery, and we use it to prove that the user has administrative control over the domain and to retrieve the issuer. This is a requirement we have in place for all users, regardless of their IdP, who use custom OIDC with Tailscale.
On their custom domain, e.g example.com, users need to host a WebFinger endpoint at https://example.com/.well-known/webfinger. When queried, this endpoint returns a JSON response detailing the issuer. Users would need to host the endpoint with the link to the ZITADEL issuer. Tailscale only looks up this endpoint once when a user signs up, and will only look up this endpoint again if the user needs to make a configuration change to their identity provider.
On their Custom Domain, e.g example.com, users need to host a WebFinger endpoint at https://example.com/.well-known/webfinger. When queried, this endpoint returns a JSON response detailing the issuer. Users would need to host the endpoint with the link to the ZITADEL issuer. Tailscale only looks up this endpoint once when a user signs up, and will only look up this endpoint again if the user needs to make a configuration change to their identity provider.
The requirements and a set up guide is detailed in the [Tailscale documentation](https://tailscale.com/kb/1240/sso-custom-oidc/).
+1 -1
View File
@@ -1094,7 +1094,7 @@ module.exports = {
title: "Instance Service API",
slug: "/apis/resources/instance_service_v2",
description:
"This API is intended to manage instances, custom domains and trusted domains in ZITADEL.\n" +
"This API is intended to manage instances, Custom Domains and trusted domains in ZITADEL.\n" +
"\n" +
"This v2 of the API provides the same functionalities as the v1, but organised on a per resource basis.\n" +
"The whole functionality related to domains (custom and trusted) has been moved under this instance API."
+1 -1
View File
@@ -39,7 +39,7 @@ export function SetEnvironment() {
return (
<div>
<div className={styles.inputwrapper}>
<label className={styles.label}>Your custom domain</label>
<label className={styles.label}>Your Custom Domain</label>
<input
className={styles.input}
id="instance"
+1 -1
View File
@@ -70,7 +70,7 @@ Errors:
NotFound: SMTP configuration not found
AlreadyExists: SMTP configuration already exists
AlreadyDeactivated: SMTP configuration already deactivated
SenderAdressNotCustomDomain: The sender address must be configured as custom domain on the instance.
SenderAdressNotCustomDomain: The sender address must be configured as Custom Domain on the instance.
TestEmailNotFound: Email address for test not found
Notification:
NoDomain: No Domain found for message
+3 -3
View File
@@ -46,7 +46,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -59,8 +59,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -46,7 +46,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -59,8 +59,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
+3 -3
View File
@@ -134,7 +134,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/admin/v1";
external_docs: {
@@ -154,8 +154,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -10,7 +10,7 @@ option go_package = "github.com/zitadel/zitadel/pkg/grpc/analytics/v2beta;analyt
message InstanceInformation {
// The unique identifier of the instance.
string id = 1;
// The custom domains (incl. generated ones) of the instance.
// The Custom Domains (incl. generated ones) of the instance.
repeated string domains = 2;
// The creation date of the instance.
google.protobuf.Timestamp created_at = 3;
+3 -3
View File
@@ -45,7 +45,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -58,8 +58,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
+3 -3
View File
@@ -80,7 +80,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
produces: "application/grpc";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/auth/v1";
external_docs: {
@@ -100,8 +100,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -40,7 +40,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -53,8 +53,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -40,7 +40,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -53,8 +53,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
+3 -3
View File
@@ -43,7 +43,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -56,8 +56,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
+3 -3
View File
@@ -39,7 +39,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -52,8 +52,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
+2 -2
View File
@@ -113,7 +113,7 @@ message Filter {
// Filter for one or more specific instance IDs.
zitadel.filter.v2.InIDsFilter in_ids_filter = 1;
// Filter for instances that have at least one of the specified custom domains.
// Filter for instances that have at least one of the specified Custom Domains.
CustomDomainsFilter custom_domains_filter = 2;
}
}
@@ -134,7 +134,7 @@ message CustomDomainFilter {
oneof filter {
option (validate.required) = true;
// Filter for a specific custom domain.
// Filter for a specific Custom Domain.
DomainFilter domain_filter = 1;
// Filter whether the domain is auto-generated.
@@ -94,8 +94,8 @@ service InstanceService {
// Add Custom Domain
//
// Adds a custom domain to the instance.
// The custom domain must be unique across all instances.
// Adds a Custom Domain to the instance.
// The Custom Domain must be unique across all instances.
// Once the domain is added, it will be used to route requests to this instance.
// This method requires system level permissions and cannot be called from an instance context.
//
@@ -111,7 +111,7 @@ service InstanceService {
// Remove Custom Domain
//
// Removes a custom domain from the instance.
// Removes a Custom Domain from the instance.
// Be aware that this will stop routing requests from this domain to the instance and
// might break existing setups or integrations.
// This method requires system level permissions and cannot be called from an instance context.
@@ -128,7 +128,7 @@ service InstanceService {
// List Custom Domains
//
// Lists custom domains of the instance.
// Lists Custom Domains of the instance.
//
// By default the instance will be determined by the context of the request,
// e.g. the host header.
@@ -158,8 +158,8 @@ service InstanceService {
// Once the domain is added, it can be used in API responses like OIDC discovery,
// email templates, and more.
// This can be used in cases where the API is accessed through a different domain
// than the instance domain, e.g. proxy setups and custom login UIs.
// Unlike custom domain, trusted domains are not used to route requests to this instance
// than the Custom Domain, e.g. proxy setups and custom login UIs.
// Unlike Custom Domain, trusted domains are not used to route requests to this instance
// and therefore do not need to be uniquely assigned to an instance.
//
// Required permissions:
@@ -320,7 +320,7 @@ message AddCustomDomainRequest {
(google.api.field_behavior) = REQUIRED
];
// Custom domain to add to the instance.
// Custom Domain to add to the instance.
// Must be a valid domain name.
// Once the domain is added, it will be used to route requests to this instance.
string custom_domain = 2 [
@@ -397,7 +397,7 @@ message ListCustomDomainsRequest {
}
message ListCustomDomainsResponse {
// The list of custom domains matching the query.
// The list of Custom Domains matching the query.
repeated CustomDomain domains = 1;
// Contains the total number of domains matching the query and the applied limit.
@@ -421,8 +421,8 @@ message AddTrustedDomainRequest {
// Once the domain is added, it can be used in API responses like OIDC discovery,
// email templates, and more.
// This can be used in cases where the API is accessed through a different domain
// than the instance domain, e.g. proxy setups and custom login UIs.
// Unlike custom domains, trusted domains are not used to route requests to this instance
// than the Custom Domain, e.g. proxy setups and custom login UIs.
// Unlike Custom Domains, trusted domains are not used to route requests to this instance
// and therefore do not need to be uniquely assigned to an instance.
string trusted_domain = 2 [
(validate.rules).string = {min_len: 1, max_len: 253},
@@ -42,7 +42,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -55,8 +55,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -241,7 +241,7 @@ service InstanceService {
//
// Deprecated: please move to the corresponding endpoint under instance service v2. This endpoint will be removed with the next major version of ZITADEL.
//
// Adds a custom domain to the instance in context.
// Adds a Custom Domain to the instance in context.
//
// The instance_id in the input message will be used in the future
//
@@ -253,7 +253,7 @@ service InstanceService {
responses: {
key: "200";
value: {
description: "The added custom domain.";
description: "The added Custom Domain.";
}
};
};
@@ -274,7 +274,7 @@ service InstanceService {
//
// Deprecated: please move to the corresponding endpoint under instance service v2. This endpoint will be removed with the next major version of ZITADEL.
//
// Removes a custom domain from the instance.
// Removes a Custom Domain from the instance.
//
// The instance_id in the input message will be used in the future.
//
@@ -286,7 +286,7 @@ service InstanceService {
responses: {
key: "200";
value: {
description: "The removed custom domain.";
description: "The removed Custom Domain.";
}
};
};
@@ -306,7 +306,7 @@ service InstanceService {
//
// Deprecated: please move to the corresponding endpoint under instance service v2. This endpoint will be removed with the next major version of ZITADEL.
//
// Lists custom domains of the instance.
// Lists Custom Domains of the instance.
//
// The instance_id in the input message will be used in the future.
//
@@ -318,7 +318,7 @@ service InstanceService {
responses: {
key: "200";
value: {
description: "The list of custom domains.";
description: "The list of Custom Domains.";
}
};
};
@@ -44,7 +44,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -57,8 +57,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
+4 -4
View File
@@ -146,7 +146,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/management/v1";
external_docs: {
@@ -166,8 +166,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -193,7 +193,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
extensions: {
key: "x-zitadel-orgid";
value: {
string_value: "$YOUR-ORGANIZATION";
string_value: "$YOUR_ORGANIZATION";
}
}
};
+3 -3
View File
@@ -39,7 +39,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -52,8 +52,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
+3 -3
View File
@@ -39,7 +39,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -52,8 +52,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
+4 -4
View File
@@ -52,7 +52,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -65,8 +65,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -615,7 +615,7 @@ message UpdateOrganizationRequest {
// changing the name will also change the domain.
// Additionally, if the domain is used as suffix for user logins,
// their login names will also change accordingly.
// It will not affect any custom domains added to the organization.
// It will not affect any organization domains added to the organization.
string name = 2 [
(validate.rules).string = {min_len: 1, max_len: 200},
(google.api.field_behavior) = REQUIRED,
+3 -3
View File
@@ -46,7 +46,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -59,8 +59,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -44,7 +44,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -57,8 +57,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -42,7 +42,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/resources/v3alpha/debug";
external_docs: {
@@ -55,8 +55,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -45,7 +45,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -58,8 +58,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -42,7 +42,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -55,8 +55,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
+3 -3
View File
@@ -39,7 +39,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -52,8 +52,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -43,7 +43,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -56,8 +56,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -43,7 +43,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -56,8 +56,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -16,7 +16,7 @@ message DomainSettings {
// If disabled, organization domains will be created as already verified automatically.
bool require_org_domain_verification = 2;
// If enabled, the SMTP sender address domain must match custom domain on the instance.
// If enabled, the SMTP sender address domain must match Custom Domain on the instance.
bool smtp_sender_address_matches_instance_domain = 3;
// ResourceOwnerType returns if the setting is managed on the organization explicitly or
@@ -50,7 +50,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -63,8 +63,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";
@@ -48,7 +48,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
consumes: "application/grpc-web+proto";
produces: "application/grpc-web+proto";
host: "$CUSTOM-DOMAIN";
host: "$CUSTOM_DOMAIN";
base_path: "/";
external_docs: {
@@ -61,8 +61,8 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
value: {
type: TYPE_OAUTH2;
flow: FLOW_ACCESS_CODE;
authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM-DOMAIN/oauth/v2/token";
authorization_url: "$CUSTOM_DOMAIN/oauth/v2/authorize";
token_url: "$CUSTOM_DOMAIN/oauth/v2/token";
scopes: {
scope: {
key: "openid";

Some files were not shown because too many files have changed in this diff Show More