mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-18 05:52:51 +00:00
docs: fixed some typos, formatting, grammar (#11540)
# Which Problems Are Solved - Typos - Punctuation - Markdown table formatting - ... (A bunch of issues my editor gave) # How the Problems Are Solved # Additional Changes # Additional Context
This commit is contained in:
+26
-22
@@ -1,30 +1,34 @@
|
|||||||
## Adopters
|
## Adopters
|
||||||
|
|
||||||
Sharing experiences and learning from other users is essential. We are frequently asked who is using a particular feature of Zitadel so people can get in touch with other users to share experiences and best practices. People also often want to know if a specific product or platform has integrated Zitadel. While the Zitadel Discord Community allows users to get in touch, it can be challenging to find this information quickly.
|
Sharing experiences and learning from other users is essential. We are frequently asked who is using a particular
|
||||||
|
feature of Zitadel so people can get in touch with other users to share experiences and best practices. People also
|
||||||
|
often want to know if a specific product or platform has integrated Zitadel. While the Zitadel Discord Community allows
|
||||||
|
users to get in touch, it can be challenging to find this information quickly.
|
||||||
|
|
||||||
The following is a directory of adopters to help identify users of individual features. The users themselves directly maintain the list.
|
The following is a directory of adopters to help identify users of individual features. The users themselves directly
|
||||||
|
maintain the list.
|
||||||
|
|
||||||
### Adding yourself as a user
|
### Adding yourself as a user
|
||||||
|
|
||||||
If you are using Zitadel, please consider adding yourself as a user with a quick description of your use case by opening a pull request to this file and adding a section describing your usage of Zitadel.
|
If you are using Zitadel, please consider adding yourself as a user with a quick description of your use case by opening
|
||||||
|
a pull request to this file and adding a section describing your usage of Zitadel.
|
||||||
|
|
||||||
| Organization/Individual | Contact Information | Description of Usage |
|
| Organization/Individual | Contact Information | Description of Usage |
|
||||||
| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------- |
|
|-------------------------|---------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Zitadel | [@fforootd](https://github.com/fforootd) (and many more) | Zitadel Cloud makes heavy use of of Zitadel ;-) |
|
| Zitadel | [@fforootd](https://github.com/fforootd) (and many more) | Zitadel Cloud makes heavy use of of Zitadel ;-) |
|
||||||
| Rawkode Academy | [@RawkodeAcademy](https://github.com/RawkodeAcademy) | Rawkode Academy Platform & Zulip use Zitadel for all user and M2M authentication |
|
| Rawkode Academy | [@RawkodeAcademy](https://github.com/RawkodeAcademy) | Rawkode Academy Platform & Zulip use Zitadel for all user and M2M authentication |
|
||||||
| XPeditionist | [@XPeditionistTravel](https://github.com/XPeditionistTravel) | An innovative all-in-one travel solution use Zitadel as complete auth solution. |
|
| XPeditionist | [@XPeditionistTravel](https://github.com/XPeditionistTravel) | An innovative all-in-one travel solution use Zitadel as complete auth solution. |
|
||||||
| devOS: Sanity Edition | [@devOS-Sanity-Edition](https://github.com/devOS-Sanity-Edition) | Uses SSO Auth for every piece of our internal and external infrastructure |
|
| devOS: Sanity Edition | [@devOS-Sanity-Edition](https://github.com/devOS-Sanity-Edition) | Uses SSO Auth for every piece of our internal and external infrastructure |
|
||||||
| CNAP.tech | [@cnap-tech](https://github.com/cnap-tech) | Using Zitadel for authentication and authorization in cloud-native applications |
|
| CNAP.tech | [@cnap-tech](https://github.com/cnap-tech) | Using Zitadel for authentication and authorization in cloud-native applications |
|
||||||
| Minekube | [@minekube](https://github.com/minekube) | Leveraging Zitadel for secure user authentication in gaming infrastructure |
|
| Minekube | [@minekube](https://github.com/minekube) | Leveraging Zitadel for secure user authentication in gaming infrastructure |
|
||||||
| Dribdat | [@dribdat](https://github.com/dribdat) | Educating people about strong auth and resilient identity at hackathons |
|
| Dribdat | [@dribdat](https://github.com/dribdat) | Educating people about strong auth and resilient identity at hackathons |
|
||||||
| Micromate | [@sschoeb](https://github.com/sschoeb) | Using Zitadel for authentication and authorization for learners and managers in our digital learning assistant as well as in the Micromate manage platform |
|
| Micromate | [@sschoeb](https://github.com/sschoeb) | Using Zitadel for authentication and authorization for learners and managers in our digital learning assistant as well as in the Micromate manage platform |
|
||||||
| Smat.io | [@smatio](https://github.com/smatio) - [@lukasver](https://github.com/lukasver) | Zitadel for authentication in cloud applications while offering B2B portfolio management solutions for professional investors |
|
| Smat.io | [@smatio](https://github.com/smatio) - [@lukasver](https://github.com/lukasver) | Zitadel for authentication in cloud applications while offering B2B portfolio management solutions for professional investors |
|
||||||
|hirschengraben | [hirschengraben.io](hirschengraben.io) | Using Zitadel as IDP for a multitenant B2B dispatch app for bike messengers |
|
| hirschengraben | [hirschengraben.io](hirschengraben.io) | Using Zitadel as IDP for a multitenant B2B dispatch app for bike messengers |
|
||||||
| OpenAIP | [@openaip](https://github.com/openAIP) | Using Zitadel Cloud for everything related to user authentication. |
|
| OpenAIP | [@openaip](https://github.com/openAIP) | Using Zitadel Cloud for everything related to user authentication. |
|
||||||
| Smat.io | [@smatio](https://github.com/smatio) - [@lukasver](https://github.com/lukasver) | Zitadel for authentication in cloud applications while offering B2B portfolio management solutions for professional investors |
|
| roclub GmbH | [@holgerson97](https://github.com/holgerson97) | Roclub builds a telehealth application to enable remote MRI/CT examinations. |
|
||||||
| roclub GmbH | [@holgerson97](https://github.com/holgerson97) | Roclub builds a telehealth application to enable remote MRI/CT examinations. |
|
| CEEX AG | [@cleanenergyexchange](https://github.com/cleanenergyexchange) | Using Zitadel cloud for our SaaS products that support the sustainabel energy transistion |
|
||||||
| CEEX AG | [@cleanenergyexchange](https://github.com/cleanenergyexchange) | Using Zitadel cloud for our SaaS products that support the sustainabel energy transistion |
|
| D1V.AI | [d1v.ai](https://d1v.ai) | Powering the *fastest way from prompt to profit*. Zitadel Cloud delivers the secure, scalable user authentication that makes our vibe coding platform possible. |
|
||||||
| D1V.AI | [d1v.ai](https://d1v.ai) | Powering the *fastest way from prompt to profit*. Zitadel Cloud delivers the secure, scalable user authentication that makes our vibe coding platform possible. |
|
| Organization Name | contact@example.com | Description of how they use Zitadel |
|
||||||
| Organization Name | contact@example.com | Description of how they use Zitadel |
|
| Individual Name | contact@example.com | Description of how they use Zitadel |
|
||||||
| Individual Name | contact@example.com | Description of how they use Zitadel |
|
|
||||||
|
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ Use our Login widget to allow easy and secure access to your applications and en
|
|||||||
|
|
||||||
### Management Console
|
### Management Console
|
||||||
|
|
||||||
Use [Console](https://zitadel.com/docs/guides/manage/console/console-overview) or our [APIs](https://zitadel.com/docs/apis/introduction) to setup organizations, projects and applications.
|
Use [Console](https://zitadel.com/docs/guides/manage/console/console-overview) or our [APIs](https://zitadel.com/docs/apis/introduction) to set up organizations, projects and applications.
|
||||||
|
|
||||||
[](http://www.youtube.com/watch?v=RPpHktAcCtk "Console Showcase")
|
[](http://www.youtube.com/watch?v=RPpHktAcCtk "Console Showcase")
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -3,7 +3,7 @@
|
|||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
At ZITADEL we are extremely grateful for security aware people who disclose vulnerabilities to us and the open source community.
|
At ZITADEL we are extremely grateful for security aware people who disclose vulnerabilities to us and the open source community.
|
||||||
All reports will be investigated by our team and we will work with you closely to validate and fix vulnerabilities reported to us.
|
All reports will be investigated by our team, and we will work with you closely to validate and fix vulnerabilities reported to us.
|
||||||
|
|
||||||
We require that you keep vulnerabilities confidential until we are able to address them, since public disclosure of security vulnerabilities could put the ZITADEL community at risk.
|
We require that you keep vulnerabilities confidential until we are able to address them, since public disclosure of security vulnerabilities could put the ZITADEL community at risk.
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ To file an incident, please disclose it by e-mail to [[email protected]](mail
|
|||||||
At the moment GPG encryption is no yet supported, however you may sign your message at will.
|
At the moment GPG encryption is no yet supported, however you may sign your message at will.
|
||||||
|
|
||||||
Your email will be acknowledged within 48 hours.
|
Your email will be acknowledged within 48 hours.
|
||||||
We will follow-up within the next 3 business days indicating next steps in handling your report.
|
We will follow up within the next 3 business days indicating next steps in handling your report.
|
||||||
|
|
||||||
If you haven't received a response within 48 hours, or you didn't get a reply from our security team within the last 5 days, please contact [[email protected]](mailto:[email protected]).
|
If you haven't received a response within 48 hours, or you didn't get a reply from our security team within the last 5 days, please contact [[email protected]](mailto:[email protected]).
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ We will not publish this information by default to protect your privacy.
|
|||||||
|
|
||||||
### When should I NOT report a vulnerability
|
### When should I NOT report a vulnerability
|
||||||
|
|
||||||
- Disclosure of known public files or directories, e.g. robots.txt, files under .well-known, or files that are included in our public repositories (eg, go.mod)
|
- Disclosure of known public files or directories, e.g. robots.txt, files under .well-known, or files that are included in our public repositories (e.g. `go.mod`)
|
||||||
- DoS of users when [Lockout Policy is enabled](https://zitadel.com/docs/guides/manage/console/default-settings#lockout)
|
- DoS of users when [Lockout Policy is enabled](https://zitadel.com/docs/guides/manage/console/default-settings#lockout)
|
||||||
- You need help applying security related settings
|
- You need help applying security related settings
|
||||||
|
|
||||||
|
|||||||
+12
-12
@@ -20,24 +20,24 @@ The site will be available at http://localhost:3000.
|
|||||||
|
|
||||||
Key scripts for documentation workflows:
|
Key scripts for documentation workflows:
|
||||||
|
|
||||||
| Script | Description |
|
| Script | Description |
|
||||||
| :--- | :--- |
|
|:-----------------------|:-----------------------------------------------------------------------------------------------------------------------------|
|
||||||
| `dev` | Starts the development server. |
|
| `dev` | Starts the development server. |
|
||||||
| `build` | Builds the production application. |
|
| `build` | Builds the production application. |
|
||||||
| `fetch:remote-content` | Fetches remote tags and referenced content. |
|
| `fetch:remote-content` | Fetches remote tags and referenced content. |
|
||||||
| `generate` | Runs all generation steps (`fetch:remote-content`, `generate:proto-docs`, `generate:api-reference`, `generate:index-pages`). |
|
| `generate` | Runs all generation steps (`fetch:remote-content`, `generate:proto-docs`, `generate:api-reference`, `generate:index-pages`). |
|
||||||
| `check:links` | Validates content integrity (broken links, missing frontmatter, schema errors). |
|
| `check:links` | Validates content integrity (broken links, missing frontmatter, schema errors). |
|
||||||
| `check-types` | Validates typescript types. |
|
| `check-types` | Validates typescript types. |
|
||||||
| `test` | Runs all validation steps (`check-types`, `check:links`). |
|
| `test` | Runs all validation steps (`check-types`, `check:links`). |
|
||||||
| `lint` | checks for code style and syntax errors (ESLint). |
|
| `lint` | checks for code style and syntax errors (ESLint). |
|
||||||
| `clean` | Cleans the build output and generated files. |
|
| `clean` | Cleans the build output and generated files. |
|
||||||
|
|
||||||
### Validation
|
### Validation
|
||||||
|
|
||||||
* **Code Quality**: Run `pnpm lint` to check for syntax and style issues in JS/TS/MDX files.
|
* **Code Quality**: Run `pnpm lint` to check for syntax and style issues in JS/TS/MDX files.
|
||||||
* **Content Integrity**: Run `pnpm check:links` to validate content structure, including:
|
* **Content Integrity**: Run `pnpm check:links` to validate content structure, including:
|
||||||
* Broken internal links
|
* Broken internal links
|
||||||
* Missing required frontmatter (e.g., `title`)
|
* Missing required front-matter (e.g., `title`)
|
||||||
* Image references
|
* Image references
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import React, { useMemo } from 'react';
|
import React, { useMemo } from 'react';
|
||||||
import yaml from 'js-yaml';
|
import yaml from 'js-yaml';
|
||||||
import { Check, X } from 'lucide-react';
|
import { Check, X } from 'lucide-react';
|
||||||
import { cn } from '@/utils/cn'; // Assuming utils/cn exists or I'll use clsx/tailwind-merge directly if not sure
|
import { cn } from '@/utils/cn'; // Assuming utils/cn exists, or I'll use clsx/tailwind-merge directly if not sure
|
||||||
|
|
||||||
// Fallback utility if generic cn doesn't exist, checking imports first is safer but I'll inline a simple merge if needed
|
// Fallback utility if generic cn doesn't exist, checking imports first is safer, but I'll inline a simple merge if needed
|
||||||
// Checking package.json I saw clsx and tailwind-merge are dependencies.
|
// Checking package.json I saw clsx and tailwind-merge are dependencies.
|
||||||
|
|
||||||
function classNames(...classes) {
|
function classNames(...classes) {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export function VersionSelector() {
|
|||||||
|
|
||||||
// Handle basePath issues: usePathname() typically returns path relative to basePath if configured?
|
// Handle basePath issues: usePathname() typically returns path relative to basePath if configured?
|
||||||
// But purely relying on that is tricky. Let's normalize.
|
// But purely relying on that is tricky. Let's normalize.
|
||||||
// If pathname starts with /docs, assume it's the full path and we strip it for logic,
|
// If pathname starts with /docs, assume it's the full path, and we strip it for logic,
|
||||||
// then let router handle re-adding it if needed (or we check behaviors).
|
// then let router handle re-adding it if needed (or we check behaviors).
|
||||||
// Actually, Next.js router.push() expects path relative to basePath usually?
|
// Actually, Next.js router.push() expects path relative to basePath usually?
|
||||||
// Let's implement robust segment swapping.
|
// Let's implement robust segment swapping.
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ The trigger is represented by the following Ids in the API: `TRIGGER_TYPE_PRE_CR
|
|||||||
- `setLastName(string)`
|
- `setLastName(string)`
|
||||||
Sets the last name
|
Sets the last name
|
||||||
- `setNickName(string)`
|
- `setNickName(string)`
|
||||||
Sets the nick name
|
Sets the nickname
|
||||||
- `setDisplayName(string)`
|
- `setDisplayName(string)`
|
||||||
Sets the display name
|
Sets the display name
|
||||||
- `setPreferredLanguage(string)`
|
- `setPreferredLanguage(string)`
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ The trigger is represented by the following Ids in the API: `TRIGGER_TYPE_PRE_CR
|
|||||||
- `setLastName(string)`
|
- `setLastName(string)`
|
||||||
Sets the last name
|
Sets the last name
|
||||||
- `setNickName(string)`
|
- `setNickName(string)`
|
||||||
Sets the nick name
|
Sets the nickname
|
||||||
- `setDisplayName(string)`
|
- `setDisplayName(string)`
|
||||||
Sets the display name
|
Sets the display name
|
||||||
- `setPreferredLanguage(string)`
|
- `setPreferredLanguage(string)`
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ Actions are a key feature to extend the functionality of ZITADEL and continuousl
|
|||||||
|
|
||||||
The action object describes the logic defined by the user. Actions can be linked to multiple [triggers](#flows).
|
The action object describes the logic defined by the user. Actions can be linked to multiple [triggers](#flows).
|
||||||
|
|
||||||
The name of the action must corelate with the javascript function in the code section. This function will be called by ZITADEL.
|
The name of the action must correlate with the JavaScript function in the code section. This function will be called by ZITADEL.
|
||||||
|
|
||||||
For reading and mutating state, the runtime executes the function that has the same name as the action.
|
For reading and mutating state, the runtime executes the function that has the same name as the action.
|
||||||
The function receives the JavaScript objects `ctx` and `api`.
|
The function receives the JavaScript objects `ctx` and `api`.
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ title: Objects
|
|||||||
- `externalId` *string*
|
- `externalId` *string*
|
||||||
User id from the identity provider
|
User id from the identity provider
|
||||||
- `externalIdpId` *string*
|
- `externalIdpId` *string*
|
||||||
Id of the identity provider
|
ID of the identity provider
|
||||||
- `human`
|
- `human`
|
||||||
- `firstName` *string*
|
- `firstName` *string*
|
||||||
- `lastName` *string*
|
- `lastName` *string*
|
||||||
@@ -44,7 +44,7 @@ title: Objects
|
|||||||
## user grant
|
## user grant
|
||||||
|
|
||||||
- `projectID` *string*
|
- `projectID` *string*
|
||||||
Required. Id of the project to be granted
|
Required. ID of the project to be granted
|
||||||
- `projectGrantID` *string*
|
- `projectGrantID` *string*
|
||||||
Optional. If the grant is for a project grant, include projectGrantID
|
Optional. If the grant is for a project grant, include projectGrantID
|
||||||
- `roles` Array of *string*
|
- `roles` Array of *string*
|
||||||
@@ -57,7 +57,7 @@ title: Objects
|
|||||||
- `changeDate` *Date*
|
- `changeDate` *Date*
|
||||||
- `resourceOwner` *string*
|
- `resourceOwner` *string*
|
||||||
- `sequence` *number*
|
- `sequence` *number*
|
||||||
Unsigned 64 bit integer
|
Unsigned 64-bit integer
|
||||||
- `state` *number*
|
- `state` *number*
|
||||||
<ul><li>0: unspecified</li><li>1: active</li><li>2: inactive</li><li>3: deleted</li><li>4: locked</li><li>5: suspended</li><li>6: initial</li></ul>
|
<ul><li>0: unspecified</li><li>1: active</li><li>2: inactive</li><li>3: deleted</li><li>4: locked</li><li>5: suspended</li><li>6: initial</li></ul>
|
||||||
- `username` *string*
|
- `username` *string*
|
||||||
@@ -182,7 +182,7 @@ This object represents [the claims](../openidoauth/claims) which will be written
|
|||||||
- `email_verified` *bool*
|
- `email_verified` *bool*
|
||||||
- `updated_at` *Number*
|
- `updated_at` *Number*
|
||||||
|
|
||||||
Additionally there could additional fields depending on the configuration of your [project](../../guides/manage/console/projects-overview#role-settings) and your [application](../../guides/manage/console/applications-overview#token-settings)
|
Additionally, there could be fields depending on the configuration of your [project](../../guides/manage/console/projects-overview#role-settings) and your [application](../../guides/manage/console/applications-overview#token-settings)
|
||||||
|
|
||||||
## user grant list
|
## user grant list
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ title: Benchmarks
|
|||||||
sidebar_label: Benchmarks
|
sidebar_label: Benchmarks
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
import DocCardList from '@/components/docusaurus/doc-card-list';
|
import DocCardList from '@/components/docusaurus/doc-card-list';
|
||||||
|
|
||||||
Benchmarks are crucial to understand if ZITADEL fulfills your expected workload and what resources it needs to do so.
|
Benchmarks are crucial to understand if ZITADEL fulfills your expected workload and what resources it needs to do so.
|
||||||
|
|
||||||
This document explains the process and goals of load-testing zitadel in a cloud environment.
|
This document explains the process and goals of load-testing zitadel in a cloud environment.
|
||||||
|
|
||||||
The results can be found on sub pages.
|
The results can be found on sub-pages.
|
||||||
|
|
||||||
## Goals
|
## Goals
|
||||||
|
|
||||||
@@ -40,32 +41,32 @@ The tests must at least measure the request duration for each API call. This giv
|
|||||||
|
|
||||||
The following metrics must be collected for each test iteration. The metrics are used to follow the decision path of the [After test procedure](https://drive.google.com/open?id=1WVr7aA8dGgV1zd2jUg1y1h_o37mkZF2O6M5Mhafn_NM):
|
The following metrics must be collected for each test iteration. The metrics are used to follow the decision path of the [After test procedure](https://drive.google.com/open?id=1WVr7aA8dGgV1zd2jUg1y1h_o37mkZF2O6M5Mhafn_NM):
|
||||||
|
|
||||||
| Metric | Type | Description | Unit |
|
| Metric | Type | Description | Unit |
|
||||||
| :---- | :---- | :---- | :---- |
|
|:--------------------------------------|:------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | Comparison | Defines the baseline the test is compared against. If not specified the baseline defined in this document is used. | Link to test result |
|
| Baseline | Comparison | Defines the baseline the test is compared against. If not specified the baseline defined in this document is used. | Link to test result |
|
||||||
| Purpose | Description | Description what should been proved with this test run | text
|
| Purpose | Description | Description what should been proved with this test run | text |
|
||||||
| Test start | Setup | Timestamp when the test started. This is useful for gathering additional data like metrics or logs later | Date |
|
| Test start | Setup | Timestamp when the test started. This is useful for gathering additional data like metrics or logs later | Date |
|
||||||
| Test duration | Setup | Duration of the test | Duration |
|
| Test duration | Setup | Duration of the test | Duration |
|
||||||
| Executed test | Setup | Name of the make recipe executed. Further information about specific test cases can be found [here](?tab=t.0#heading=h.xav4f3s5r2f3). | Name of the make recipe |
|
| Executed test | Setup | Name of the make recipe executed. Further information about specific test cases can be found [here](?tab=t.0#heading=h.xav4f3s5r2f3). | Name of the make recipe |
|
||||||
| k6 version | Setup | Version of the test client (k6) used | semantic version |
|
| k6 version | Setup | Version of the test client (k6) used | semantic version |
|
||||||
| VUs | Setup | Virtual Users which execute the test scenario in parallel | Number |
|
| VUs | Setup | Virtual Users which execute the test scenario in parallel | Number |
|
||||||
| Client location | Setup | Region or location of the machine which executed the test client. If not further specified the hoster is Google Cloud | Location / Region |
|
| Client location | Setup | Region or location of the machine which executed the test client. If not further specified the hoster is Google Cloud | Location / Region |
|
||||||
| Client machine specification | Setup | Definition of the client machine the test client ran on. The resources of the machine could be maxed out during tests therefore we collect this metric as well. The description must at least clarify the following metrics: vCPU Memory egress bandwidth | **vCPU**: Amount of threads ([additional info](https://cloud.google.com/compute/docs/cpu-platforms)) **memory**: GB **egress bandwidth**:Gbps |
|
| Client machine specification | Setup | Definition of the client machine the test client ran on. The resources of the machine could be maxed out during tests therefore we collect this metric as well. The description must at least clarify the following metrics: vCPU Memory egress bandwidth | **vCPU**: Amount of threads ([additional info](https://cloud.google.com/compute/docs/cpu-platforms)) **memory**: GB **egress bandwidth**:Gbps |
|
||||||
| ZITADEL location | Setup | Region or location of the deployment of zitadel. If not further specified the hoster is Google Cloud | Location / Region |
|
| ZITADEL location | Setup | Region or location of the deployment of zitadel. If not further specified the hoster is Google Cloud | Location / Region |
|
||||||
| ZITADEL container specification | Setup | As ZITADEL is mainly run in cloud environments it should also be run as a container during the load tests. The description must at least clarify the following metrics: vCPU Memory egress bandwidth Scale | **vCPU**: Amount of threads ([additional info](https://cloud.google.com/compute/docs/cpu-platforms)) **memory**: GB **egress bandwidth**:Gbps **scale**: The amount of containers running during the test. The amount must not vary during the tests |
|
| ZITADEL container specification | Setup | As ZITADEL is mainly run in cloud environments it should also be run as a container during the load tests. The description must at least clarify the following metrics: vCPU Memory egress bandwidth Scale | **vCPU**: Amount of threads ([additional info](https://cloud.google.com/compute/docs/cpu-platforms)) **memory**: GB **egress bandwidth**:Gbps **scale**: The amount of containers running during the test. The amount must not vary during the tests |
|
||||||
| ZITADEL Version | Setup | The version of zitadel deployed | Semantic version or commit |
|
| ZITADEL Version | Setup | The version of zitadel deployed | Semantic version or commit |
|
||||||
| ZITADEL Configuration | Setup | Configuration of zitadel which deviates from the defaults and is not secret | yaml |
|
| ZITADEL Configuration | Setup | Configuration of zitadel which deviates from the defaults and is not secret | yaml |
|
||||||
| ZITADEL feature flags | Setup | Changed feature flags | yaml |
|
| ZITADEL feature flags | Setup | Changed feature flags | yaml |
|
||||||
| Database | Setup | Database type and version | **type**: psql **version**: semantic version |
|
| Database | Setup | Database type and version | **type**: psql **version**: semantic version |
|
||||||
| Database location | Setup | Region or location of the deployment of the database. If not further specified the hoster is Google Cloud SQL | Location / Region |
|
| Database location | Setup | Region or location of the deployment of the database. If not further specified the hoster is Google Cloud SQL | Location / Region |
|
||||||
| Database specification | Setup | The description must at least clarify the following metrics: vCPU, Memory and egress bandwidth (Scale) | **vCPU**: Amount of threads ([additional info](https://cloud.google.com/compute/docs/cpu-platforms)) **memory**: GB **egress bandwidth**:Gbps |
|
| Database specification | Setup | The description must at least clarify the following metrics: vCPU, Memory and egress bandwidth (Scale) | **vCPU**: Amount of threads ([additional info](https://cloud.google.com/compute/docs/cpu-platforms)) **memory**: GB **egress bandwidth**:Gbps |
|
||||||
| ZITADEL metrics during test | Result | This metric helps understanding the bottlenecks of the executed test. At least the following metrics must be provided: CPU usage Memory usage | **CPU usage** in percent **Memory usage** in percent |
|
| ZITADEL metrics during test | Result | This metric helps understanding the bottlenecks of the executed test. At least the following metrics must be provided: CPU usage Memory usage | **CPU usage** in percent **Memory usage** in percent |
|
||||||
| Observed errors | Result | Errors worth mentioning, mostly unexpected errors | description |
|
| Observed errors | Result | Errors worth mentioning, mostly unexpected errors | description |
|
||||||
| Top 3 most expensive database queries | Result | The execution plan of the top 3 most expensive database queries during the test execution | database execution plan |
|
| Top 3 most expensive database queries | Result | The execution plan of the top 3 most expensive database queries during the test execution | database execution plan |
|
||||||
| Database metrics during test | Result | This metric helps understanding the bottlenecks of the executed test. At least the following metrics must be provided: CPU usage Memory usage | **CPU usage** in percent **Memory usage** in percent |
|
| Database metrics during test | Result | This metric helps understanding the bottlenecks of the executed test. At least the following metrics must be provided: CPU usage Memory usage | **CPU usage** in percent **Memory usage** in percent |
|
||||||
| k6 Iterations per second | Result | How many test iterations were done per second | Number |
|
| k6 Iterations per second | Result | How many test iterations were done per second | Number |
|
||||||
| k6 overview | Result | Shows some basic metrics aggregated over the test run At least the following metrics must be included: duration per request (min, max, avg, p50, p95, p99) VUS For simplicity just add the whole test result printed to the terminal | terminal output |
|
| k6 overview | Result | Shows some basic metrics aggregated over the test run At least the following metrics must be included: duration per request (min, max, avg, p50, p95, p99) VUS For simplicity just add the whole test result printed to the terminal | terminal output |
|
||||||
| k6 output | Result | Trends and metrics generated during the test, this contains detailed information for each step executed during each iteration | csv |
|
| k6 output | Result | Trends and metrics generated during the test, this contains detailed information for each step executed during each iteration | csv |
|
||||||
|
|
||||||
### Test setup
|
### Test setup
|
||||||
|
|
||||||
|
|||||||
@@ -10,28 +10,28 @@ Tests are halted after this test run because of too many [client read events](ht
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
| :---- | :---- |
|
|:--------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Test start | 22-10-2024 16:20 UTC |
|
| Test start | 22-10-2024 16:20 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | machine\_jwt\_profile\_grant |
|
| Executed test | machine\_jwt\_profile\_grant |
|
||||||
| k6 version | v0.54.0 |
|
| k6 version | v0.54.0 |
|
||||||
| VUs | 50 |
|
| VUs | 50 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| Client machine specification | e2-high-cpu-4 |
|
| Client machine specification | e2-high-cpu-4 |
|
||||||
| Zitadel location | US1 |
|
| Zitadel location | US1 |
|
||||||
| Zitadel container specification | vCPUs: 2<br/>Memory: 512 MiB<br/>Container count: 2 |
|
| Zitadel container specification | vCPUs: 2<br/>Memory: 512 MiB<br/>Container count: 2 |
|
||||||
| Zitadel feature flags | none |
|
| Zitadel feature flags | none |
|
||||||
| Database | postgres v15 |
|
| Database | postgres v15 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPUs: 4<br/>Memory: 16 GiB |
|
| Database specification | vCPUs: 4<br/>Memory: 16 GiB |
|
||||||
| Zitadel metrics during test | |
|
| Zitadel metrics during test | |
|
||||||
| Observed errors | Many client read events during push |
|
| Observed errors | Many client read events during push |
|
||||||
| Top 3 most expensive database queries | 1: Query events `instance_id = $1 AND aggregate_type = $2 AND aggregate_id = $3 AND event_type = ANY($4)`<br/>2: latest sequence query during push events<br/>3: writing events during push (caused lock wait events) |
|
| Top 3 most expensive database queries | 1: Query events `instance_id = $1 AND aggregate_type = $2 AND aggregate_id = $3 AND event_type = ANY($4)`<br/>2: latest sequence query during push events<br/>3: writing events during push (caused lock wait events) |
|
||||||
| k6 iterations per second | 193 |
|
| k6 iterations per second | 193 |
|
||||||
| k6 overview | [output](#k6-output) |
|
| k6 overview | [output](#k6-output) |
|
||||||
| flowchart outcome | Halt tests, must resolve an issue |
|
| flowchart outcome | Halt tests, must resolve an issue |
|
||||||
|
|
||||||
## /token endpoint latencies
|
## /token endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ The tests showed heavy database load by time by the first two database queries.
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 15:39 UTC |
|
| Test start | 15:39 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | machine\_jwt\_profile\_grant |
|
| Executed test | machine\_jwt\_profile\_grant |
|
||||||
| k6 version | v0.54.0 |
|
| k6 version | v0.54.0 |
|
||||||
| VUs | 150 |
|
| VUs | 150 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 2<br/> Memory: 512 Mib <br/>Container count: 5 |
|
| ZITADEL container specification | vCPU: 2<br/> Memory: 512 Mib <br/>Container count: 5 |
|
||||||
| ZITADEL Version | v2.66.0 |
|
| ZITADEL Version | v2.66.0 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v15.8 |
|
| Database | type: psql<br />version: v15.8 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | |
|
| Observed errors | |
|
||||||
| Top 3 most expensive database queries | 1: Write events using the newly added eventstore.push function<br/>2: Query events by instance\_id, aggregate\_type, aggregate\_id, event\_types<br/>3: Query user<br/> |
|
| Top 3 most expensive database queries | 1: Write events using the newly added eventstore.push function<br/>2: Query events by instance\_id, aggregate\_type, aggregate\_id, event\_types<br/>3: Query user<br/> |
|
||||||
| k6 Iterations per second | 439 |
|
| k6 Iterations per second | 439 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | Scale out |
|
| flowchart outcome | Scale out |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ The performance goals of [this issue](https://github.com/zitadel/zitadel/issues/
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 09:48 UTC |
|
| Test start | 09:48 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | machine\_jwt\_profile\_grant |
|
| Executed test | machine\_jwt\_profile\_grant |
|
||||||
| k6 version | v0.57.0 |
|
| k6 version | v0.57.0 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v2.70.0 |
|
| ZITADEL Version | v2.70.0 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.2 |
|
| Database | type: psql<br />version: v17.2 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | |
|
| Observed errors | |
|
||||||
| Top 3 most expensive database queries | 1: Write events using eventstore.push function<br/>2: Query user<br/>3: Query events by instance id, aggregate type, aggregate id, event types, owner<br/> |
|
| Top 3 most expensive database queries | 1: Write events using eventstore.push function<br/>2: Query user<br/>3: Query events by instance id, aggregate type, aggregate id, event types, owner<br/> |
|
||||||
| k6 Iterations per second | 1806 |
|
| k6 Iterations per second | 1806 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | Scale out |
|
| flowchart outcome | Scale out |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -12,29 +12,29 @@ The tests showed that querying the user takes too much time because Zitadel ensu
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 14:24 UTC |
|
| Test start | 14:24 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | oidc\_session |
|
| Executed test | oidc\_session |
|
||||||
| k6 version | v0.57.0 |
|
| k6 version | v0.57.0 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v2.70.0 |
|
| ZITADEL Version | v2.70.0 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.2 |
|
| Database | type: psql<br />version: v17.2 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | |
|
| Observed errors | |
|
||||||
| Top 3 most expensive database queries | 1: lock current\_states table<br/>2: write events<br/>3: get events for projection<br/> |
|
| Top 3 most expensive database queries | 1: lock current\_states table<br/>2: write events<br/>3: get events for projection<br/> |
|
||||||
| k6 Iterations per second | 153 |
|
| k6 Iterations per second | 153 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | Resolve locking issue |
|
| flowchart outcome | Resolve locking issue |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ Benchmark results of v4 release of Zitadel.
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 11:31 UTC |
|
| Test start | 11:31 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | add\_session |
|
| Executed test | add\_session |
|
||||||
| k6 version | v1.0.0-rc1 |
|
| k6 version | v1.0.0-rc1 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v4.0.0-rc2 |
|
| ZITADEL Version | v4.0.0-rc2 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.4 |
|
| Database | type: psql<br />version: v17.4 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | |
|
| Observed errors | |
|
||||||
| Top 3 most expensive database queries | 1: Query events by instance_id, aggregate_types, event_types, position<br/>2: write events<br/>3: list members<br/> |
|
| Top 3 most expensive database queries | 1: Query events by instance_id, aggregate_types, event_types, position<br/>2: write events<br/>3: list members<br/> |
|
||||||
| k6 Iterations per second | 607 |
|
| k6 Iterations per second | 607 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | |
|
| flowchart outcome | |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -12,29 +12,29 @@ This benchmark tests the flow of a user signing in to Zitadel using username and
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 06:43 UTC |
|
| Test start | 06:43 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | human\_password\_login |
|
| Executed test | human\_password\_login |
|
||||||
| k6 version | v1.0.0-rc1 |
|
| k6 version | v1.0.0-rc1 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v4.0.0-rc2 |
|
| ZITADEL Version | v4.0.0-rc2 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.4 |
|
| Database | type: psql<br />version: v17.4 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | |
|
| Observed errors | |
|
||||||
| Top 3 most expensive database queries | 1: Locking projections for reduce<br/>2: Query events by aggregate type and event type<br/>3: Query events by instance id, aggregate types, event types, position<br/> |
|
| Top 3 most expensive database queries | 1: Locking projections for reduce<br/>2: Query events by aggregate type and event type<br/>3: Query events by instance id, aggregate types, event types, position<br/> |
|
||||||
| k6 Iterations per second | 39 |
|
| k6 Iterations per second | 39 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | |
|
| flowchart outcome | |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ Benchmark results of v4 release of Zitadel.
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 13:33 UTC |
|
| Test start | 13:33 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | introspect |
|
| Executed test | introspect |
|
||||||
| k6 version | v1.0.0-rc1 |
|
| k6 version | v1.0.0-rc1 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v4.0.0-rc2 |
|
| ZITADEL Version | v4.0.0-rc2 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.4 |
|
| Database | type: psql<br />version: v17.4 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | A lot of over fetching on the database |
|
| Observed errors | A lot of over fetching on the database |
|
||||||
| Top 3 most expensive database queries | 1: get app<br/>2: Query events by instance id, aggregate types, event types, position<br/>3: Query executions<br/> |
|
| Top 3 most expensive database queries | 1: get app<br/>2: Query events by instance id, aggregate types, event types, position<br/>3: Query executions<br/> |
|
||||||
| k6 Iterations per second | 18 |
|
| k6 Iterations per second | 18 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | |
|
| flowchart outcome | |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ Benchmark results of v4 release of Zitadel.
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 08:28 UTC |
|
| Test start | 08:28 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | machine\_client\_credentials\_login |
|
| Executed test | machine\_client\_credentials\_login |
|
||||||
| k6 version | v1.0.0-rc1 |
|
| k6 version | v1.0.0-rc1 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v4.0.0-rc2 |
|
| ZITADEL Version | v4.0.0-rc2 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.4 |
|
| Database | type: psql<br />version: v17.4 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | |
|
| Observed errors | |
|
||||||
| Top 3 most expensive database queries | 1: Locking projections for reduce<br/>2: Query events by aggregate type and event type<br/>3: user by id query<br/> |
|
| Top 3 most expensive database queries | 1: Locking projections for reduce<br/>2: Query events by aggregate type and event type<br/>3: user by id query<br/> |
|
||||||
| k6 Iterations per second | 424 |
|
| k6 Iterations per second | 424 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | |
|
| flowchart outcome | |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ Benchmark results of v4 release of Zitadel.
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 18:33 UTC |
|
| Test start | 18:33 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | machine\_jwt\_profile\_grant |
|
| Executed test | machine\_jwt\_profile\_grant |
|
||||||
| k6 version | v1.0.0-rc1 |
|
| k6 version | v1.0.0-rc1 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v4.0.0-rc2 |
|
| ZITADEL Version | v4.0.0-rc2 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.4 |
|
| Database | type: psql<br />version: v17.4 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | Zitadel containers did not scale but database would have headroom |
|
| Observed errors | Zitadel containers did not scale but database would have headroom |
|
||||||
| Top 3 most expensive database queries | 1: Query events by instance id, aggregate types, event types, position<br/>2: write events<br/>3: get user by id<br/> |
|
| Top 3 most expensive database queries | 1: Query events by instance id, aggregate types, event types, position<br/>2: write events<br/>3: get user by id<br/> |
|
||||||
| k6 Iterations per second | 851 |
|
| k6 Iterations per second | 851 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | |
|
| flowchart outcome | |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ Benchmark results of v4 release of Zitadel.
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 07:34 UTC |
|
| Test start | 07:34 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | machine\_pat\_login |
|
| Executed test | machine\_pat\_login |
|
||||||
| k6 version | v1.0.0-rc1 |
|
| k6 version | v1.0.0-rc1 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v4.0.0-rc2 |
|
| ZITADEL Version | v4.0.0-rc2 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.4 |
|
| Database | type: psql<br />version: v17.4 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | |
|
| Observed errors | |
|
||||||
| Top 3 most expensive database queries | 1: Locking projections for reduce<br/>2: Query events by aggregate type and event type<br/>3: Query events by instance id, aggregate types, event types, position<br/> |
|
| Top 3 most expensive database queries | 1: Locking projections for reduce<br/>2: Query events by aggregate type and event type<br/>3: Query events by instance id, aggregate types, event types, position<br/> |
|
||||||
| k6 Iterations per second | 1906 |
|
| k6 Iterations per second | 1906 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | |
|
| flowchart outcome | |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ Benchmark results of v4 release of Zitadel.
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 15:07 UTC |
|
| Test start | 15:07 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | manipulate\_user |
|
| Executed test | manipulate\_user |
|
||||||
| k6 version | v1.0.0-rc1 |
|
| k6 version | v1.0.0-rc1 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v4.0.0-rc2 |
|
| ZITADEL Version | v4.0.0-rc2 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.4 |
|
| Database | type: psql<br />version: v17.4 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | |
|
| Observed errors | |
|
||||||
| Top 3 most expensive database queries | 1: query events by instance id, aggregate types, event types, position<br/>2: write events<br/>3: query user by id<br/> |
|
| Top 3 most expensive database queries | 1: query events by instance id, aggregate types, event types, position<br/>2: write events<br/>3: query user by id<br/> |
|
||||||
| k6 Iterations per second | 16 |
|
| k6 Iterations per second | 16 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | |
|
| flowchart outcome | |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ Benchmark results of v4 release of Zitadel.
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 14:56 UTC |
|
| Test start | 14:56 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | otp_session |
|
| Executed test | otp_session |
|
||||||
| k6 version | v1.0.0-rc1 |
|
| k6 version | v1.0.0-rc1 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v4.0.0-rc2 |
|
| ZITADEL Version | v4.0.0-rc2 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.4 |
|
| Database | type: psql<br />version: v17.4 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | database usage was 80% |
|
| Observed errors | database usage was 80% |
|
||||||
| Top 3 most expensive database queries | 1: query events by instance id, aggregate types, event types, position<br/>2: lock projection<br/>3: write events<br/> |
|
| Top 3 most expensive database queries | 1: query events by instance id, aggregate types, event types, position<br/>2: lock projection<br/>3: write events<br/> |
|
||||||
| k6 Iterations per second | 60 |
|
| k6 Iterations per second | 60 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | |
|
| flowchart outcome | |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ Benchmark results of v4 release of Zitadel.
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 15:14 UTC |
|
| Test start | 15:14 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | password\_session |
|
| Executed test | password\_session |
|
||||||
| k6 version | v1.0.0-rc1 |
|
| k6 version | v1.0.0-rc1 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v4.0.0-rc2 |
|
| ZITADEL Version | v4.0.0-rc2 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.4 |
|
| Database | type: psql<br />version: v17.4 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | |
|
| ZITADEL metrics during test | |
|
||||||
| Observed errors | Container startup latency is > 3 minutes |
|
| Observed errors | Container startup latency is > 3 minutes |
|
||||||
| Top 3 most expensive database queries | 1: lock projection<br/>2: query events by instance id, aggregate types, event types, position<br/>3: query events by aggregate type, event type<br/> |
|
| Top 3 most expensive database queries | 1: lock projection<br/>2: query events by instance id, aggregate types, event types, position<br/>3: query events by aggregate type, event type<br/> |
|
||||||
| k6 Iterations per second | 51 |
|
| k6 Iterations per second | 51 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | |
|
| flowchart outcome | |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,29 @@ Benchmark results of v4 release of Zitadel.
|
|||||||
|
|
||||||
## Performance test results
|
## Performance test results
|
||||||
|
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|:--------------------------------------|:------|
|
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Baseline | none |
|
| Baseline | none |
|
||||||
| Purpose | Test current performance |
|
| Purpose | Test current performance |
|
||||||
| Test start | 16:06 UTC |
|
| Test start | 16:06 UTC |
|
||||||
| Test duration | 30min |
|
| Test duration | 30min |
|
||||||
| Executed test | user\_info |
|
| Executed test | user\_info |
|
||||||
| k6 version | v1.0.0-rc1 |
|
| k6 version | v1.0.0-rc1 |
|
||||||
| VUs | 600 |
|
| VUs | 600 |
|
||||||
| Client location | US1 |
|
| Client location | US1 |
|
||||||
| ZITADEL location | US1 |
|
| ZITADEL location | US1 |
|
||||||
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
| ZITADEL container specification | vCPU: 6<br/> Memory: 6 Gi <br/>Container min scale: 2<br/>Container max scale: 7 |
|
||||||
| ZITADEL Version | v4.0.0-rc2 |
|
| ZITADEL Version | v4.0.0-rc2 |
|
||||||
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
| ZITADEL feature flags | webKey: true, improvedPerformance: \[\"IMPROVED\_PERFORMANCE\_ORG\_BY\_ID\", \"IMPROVED\_PERFORMANCE\_PROJECT\", \"IMPROVED\_PERFORMANCE\_USER\_GRANT\", \"IMPROVED\_PERFORMANCE\_ORG\_DOMAIN\_VERIFIED\", \"IMPROVED\_PERFORMANCE\_PROJECT\_GRANT\"\] |
|
||||||
| Database | type: psql<br />version: v17.4 |
|
| Database | type: psql<br />version: v17.4 |
|
||||||
| Database location | US1 |
|
| Database location | US1 |
|
||||||
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
| Database specification | vCPU: 8<br/> memory: 32Gib |
|
||||||
| ZITADEL metrics during test | Container startup latency is > 3 minutes |
|
| ZITADEL metrics during test | Container startup latency is > 3 minutes |
|
||||||
| Observed errors | Container startup latency is > 3 minutes, elevated error rate during container startup |
|
| Observed errors | Container startup latency is > 3 minutes, elevated error rate during container startup |
|
||||||
| Top 3 most expensive database queries | 1: events by aggregate type and event type<br/>2: events by instance id, aggregate types, event types, position<br/>3: user by id<br/> |
|
| Top 3 most expensive database queries | 1: events by aggregate type and event type<br/>2: events by instance id, aggregate types, event types, position<br/>3: user by id<br/> |
|
||||||
| k6 Iterations per second | 2653 |
|
| k6 Iterations per second | 2653 |
|
||||||
| k6 output | [output](#k6-output) |
|
| k6 output | [output](#k6-output) |
|
||||||
| flowchart outcome | |
|
| flowchart outcome | |
|
||||||
|
|
||||||
## Endpoint latencies
|
## Endpoint latencies
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ It effectively replaces the previous REST gateway.
|
|||||||
For teams already using gRPC, your transition will be minimal.
|
For teams already using gRPC, your transition will be minimal.
|
||||||
For teams who were using the v1 REST API, migrating to v2 will involve adopting one of the following methods:
|
For teams who were using the v1 REST API, migrating to v2 will involve adopting one of the following methods:
|
||||||
|
|
||||||
- Native gRPC: For the highest performance and to leverage features like bi-directional streaming.
|
- Native gRPC: For the highest performance and to leverage features like bidirectional streaming.
|
||||||
- Connect RPC: For making CRUD-like (Create, Read, Update, Delete) calls over HTTP. This is the recommended path for most applications migrating from our v1 REST API.
|
- Connect RPC: For making CRUD-like (Create, Read, Update, Delete) calls over HTTP. This is the recommended path for most applications migrating from our v1 REST API.
|
||||||
|
|
||||||
A significant advantage of this new architecture remains the automatic generation of client libraries.
|
A significant advantage of this new architecture remains the automatic generation of client libraries.
|
||||||
@@ -147,7 +147,7 @@ The biggest change is in how you create/update applications.
|
|||||||
Instead of calling a specific endpoint for each type (e.g., CreateOidcApp, CreateSamlApp), you will now use a single CreateApp endpoint.
|
Instead of calling a specific endpoint for each type (e.g., CreateOidcApp, CreateSamlApp), you will now use a single CreateApp endpoint.
|
||||||
|
|
||||||
To specify the type of application, you will include its specific configuration object within the request body.
|
To specify the type of application, you will include its specific configuration object within the request body.
|
||||||
For example, to create a OIDC app, you will provide a oidc object in the request.
|
For example, to create a OIDC app, you will provide an oidc object in the request.
|
||||||
All properties that are common to every application, such as name, are now top-level fields in the request body, consistent across all types.
|
All properties that are common to every application, such as name, are now top-level fields in the request body, consistent across all types.
|
||||||
|
|
||||||
This approach simplifies client-side logic, as you no longer need to route requests to different endpoints.
|
This approach simplifies client-side logic, as you no longer need to route requests to different endpoints.
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ ZITADEL provides a `metrics` endpoint with the help of the [opentelemetry-go](ht
|
|||||||
|
|
||||||
If you are self-hosting ZITADEL, you can access this endpoint with on the path `/debug/metrics`.
|
If you are self-hosting ZITADEL, you can access this endpoint with on the path `/debug/metrics`.
|
||||||
For example when running ZITADEL locally the endpoint is accessible on `http://localhost:8080/debug/metrics`.
|
For example when running ZITADEL locally the endpoint is accessible on `http://localhost:8080/debug/metrics`.
|
||||||
The metrics endpoint can be scrubbed by any tool of choice that supports the `otel` format, e.g an existing Prometheus.
|
The metrics endpoint can be scrubbed by any tool of choice that supports the `otel` format, e.g. an existing Prometheus.
|
||||||
|
|
||||||
For our [Kubernetes/Helm](/self-hosting/deploy/kubernetes) users, we provide an out of the box support for the [ServiceMonitor](https://github.com/zitadel/zitadel-charts/blob/main/charts/zitadel/templates/servicemonitor.yaml) custom resource.
|
For our [Kubernetes/Helm](/self-hosting/deploy/kubernetes) users, we provide an out-of-the-box support for the [ServiceMonitor](https://github.com/zitadel/zitadel-charts/blob/main/charts/zitadel/templates/servicemonitor.yaml) custom resource.
|
||||||
|
|
||||||
By default, metrics are enabled but can be turned off through ZITADEL's [configuration](/self-hosting/manage/configure).
|
By default, metrics are enabled but can be turned off through ZITADEL's [configuration](/self-hosting/manage/configure).
|
||||||
The (default) configuration is located in the [defaults.yaml](https://github.com/zitadel/zitadel/blob/main/cmd/defaults.yaml).
|
The (default) configuration is located in the [defaults.yaml](https://github.com/zitadel/zitadel/blob/main/cmd/defaults.yaml).
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
| Parameter | Description |
|
| Parameter | Description |
|
||||||
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| grant_type | Must be `urn:ietf:params:oauth:grant-type:token-exchange` |
|
| grant_type | Must be `urn:ietf:params:oauth:grant-type:token-exchange` |
|
||||||
| subject_token | A token that represents the identity of the party on behalf of whom the request is being made. |
|
| subject_token | A token that represents the identity of the party on behalf of whom the request is being made. |
|
||||||
| subject_token_type | An identifier that indicates the type of the token in the subject_token parameter. |
|
| subject_token_type | An identifier that indicates the type of the token in the subject_token parameter. |
|
||||||
| actor_token | Optional. A token that represents the identity of the acting party. In ZITADEL this the impersonator. |
|
| actor_token | Optional. A token that represents the identity of the acting party. In ZITADEL this the impersonator. |
|
||||||
| actor_token_type | An identifier that indicates the type of the token in the actor_token parameter. Required when actor_token is provided |
|
| actor_token_type | An identifier that indicates the type of the token in the actor_token parameter. Required when actor_token is provided |
|
||||||
| requested_token_type | Optional. An identifier that indicates the type of the token requested. Defaults to access token if not provided. |
|
| requested_token_type | Optional. An identifier that indicates the type of the token requested. Defaults to access token if not provided. |
|
||||||
| scope | [Scopes](/apis/openidoauth/scopes) you would like to request from ZITADEL for the requested token. Scopes are space delimited, e.g. `openid email profile`. |
|
| scope | [Scopes](/apis/openidoauth/scopes) you would like to request from ZITADEL for the requested token. Scopes are space delimited, e.g. `openid email profile`. |
|
||||||
| audience | Optional. Must be a subset of the combined audiences from both subject and actor tokens. |
|
| audience | Optional. Must be a subset of the combined audiences from both subject and actor tokens. |
|
||||||
| resource | Currently not supported |
|
| resource | Currently not supported |
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
| Property | Description |
|
| Property | Description |
|
||||||
| ----------------- | ------------------------------------------------------------------------------------ |
|
|-------------------|--------------------------------------------------------------------------------------|
|
||||||
| access_token | An `access_token` as opaque token or JWT for the subject user |
|
| access_token | An `access_token` as opaque token or JWT for the subject user |
|
||||||
| token_type | Type of the `access_token`. Value can be `Bearer` or `N_A` |
|
| token_type | Type of the `access_token`. Value can be `Bearer` or `N_A` |
|
||||||
| issued_token_type | [Token type](#token-types) of the returned token, matches the `requested_token_type` |
|
| issued_token_type | [Token type](#token-types) of the returned token, matches the `requested_token_type` |
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
The following table provides a matrix of supported token type parameter and responses for Token Exchange.
|
The following table provides a matrix of supported token type parameter and responses for Token Exchange.
|
||||||
|
|
||||||
| Identifier | subject_token | actor_token | requested_token_type |
|
| Identifier | subject_token | actor_token | requested_token_type |
|
||||||
| ------------------------------------------------ | ------------------------------------------------------------ | ------------- | -------------------- |
|
|--------------------------------------------------|--------------------------------------------------------------|---------------|----------------------|
|
||||||
| `urn:ietf:params:oauth:token-type:access_token` | JWT or Opaque | JWT or Opaque | Opaque only |
|
| `urn:ietf:params:oauth:token-type:access_token` | JWT or Opaque | JWT or Opaque | Opaque only |
|
||||||
| `urn:ietf:params:oauth:token-type:refresh_token` | Not allowed | Not allowed | Not allowed |
|
| `urn:ietf:params:oauth:token-type:refresh_token` | Not allowed | Not allowed | Not allowed |
|
||||||
| `urn:ietf:params:oauth:token-type:id_token` | Allowed | Allowed | Allowed |
|
| `urn:ietf:params:oauth:token-type:id_token` | Allowed | Allowed | Allowed |
|
||||||
|
|||||||
@@ -44,13 +44,13 @@ Key JSON
|
|||||||
|
|
||||||
JWT
|
JWT
|
||||||
|
|
||||||
| Claim | Example | Description |
|
| 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 |
|
| 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 |
|
| 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 |
|
| iss | `"78366401571920522@acme"` | String which represents the requesting party (owner of the key), normally the `clientID` from the json key file |
|
||||||
| sub | `"78366401571920522@acme"` | The subject ID of the application, normally the `clientID` from the json key file |
|
| sub | `"78366401571920522@acme"` | The subject ID of the application, normally the `clientID` from the json key file |
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ An OpenID Connect (OIDC) [authentication request](https://openid.net/specs/openi
|
|||||||
|
|
||||||
## Why this OIDC playground?
|
## Why this OIDC playground?
|
||||||
|
|
||||||
Currently ZITADEL requires human users to authenticate trough the hosted login page.
|
Currently, ZITADEL requires human users to authenticate through the hosted login page.
|
||||||
Your application should initiate a login by issuing an authentication request and redirecting the user to the login page. You can customize the behavior of ZITADEL by providing additional parameters and scopes in the request.
|
Your application should initiate a login by issuing an authentication request and redirecting the user to the login page. You can customize the behavior of ZITADEL by providing additional parameters and scopes in the request.
|
||||||
|
|
||||||
This playground should help you to initially craft an authentication request and to explore the behavior of ZITADEL in more depth.
|
This playground should help you to initially craft an authentication request and to explore the behavior of ZITADEL in more depth.
|
||||||
@@ -117,7 +117,7 @@ Please refer to the full [guide on branding](/guides/manage/customize/branding).
|
|||||||
Pass the scope `urn:zitadel:iam:user:metadata` to request a user's metadata.
|
Pass the scope `urn:zitadel:iam:user:metadata` to request a user's metadata.
|
||||||
Please refer to the full [guide on user-metadata](/guides/manage/customize/user-metadata) for further details.
|
Please refer to the full [guide on user-metadata](/guides/manage/customize/user-metadata) for further details.
|
||||||
|
|
||||||
### Access core apis
|
### Access core APIs
|
||||||
|
|
||||||
Calling the [core API](/apis/introduction) with the authenticated user, requires that the projectID of ZITADEL is included in the audience claim.
|
Calling the [core API](/apis/introduction) with the authenticated user, requires that the projectID of ZITADEL is included in the audience claim.
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ Please check below the matrix for an overview where which scope is asserted.
|
|||||||
| Claims | Example | Description |
|
| Claims | Example | Description |
|
||||||
|:-------------------|:---------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|:-------------------|:---------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| acr | TBA | TBA |
|
| acr | TBA | TBA |
|
||||||
| act | `{"iss": "${CUSTOM_DOMAIN}","sub": "259241944654282754"}` | JSON object describing the actor from the `actor_token` after [token exchange](/guides/integrate/token-exchange#actor-token) |
|
| act | `{"iss": "${CUSTOM_DOMAIN}","sub": "259241944654282754"}` | JSON object describing the actor from the `actor_token` after [token exchange](/guides/integrate/token-exchange#actor-token) |
|
||||||
| address | `Lerchenfeldstrasse 3, 9014 St. Gallen` | TBA |
|
| 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` |
|
| 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 |
|
| aud | `69234237810729019` | The audience of the token, by default all client id's and the project id are included |
|
||||||
@@ -106,13 +106,13 @@ https://github.com/zitadel/actions/blob/main/examples/custom_roles.js#L20-L33
|
|||||||
|
|
||||||
ZITADEL reserves some claims to assert certain data. Please check out the [reserved scopes](./scopes#reserved-scopes).
|
ZITADEL reserves some claims to assert certain data. Please check out the [reserved scopes](./scopes#reserved-scopes).
|
||||||
|
|
||||||
| Claims | Example | Description |
|
| Claims | Example | Description |
|
||||||
|:--------------------------------------------------|:---------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|:--------------------------------------------------|:---------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| urn:zitadel:iam:action:\{actionname}:log | `{"urn:zitadel:iam:action:appendCustomClaims:log": ["test log", "another test log"]}` | This claim is set during Actions as a log, e.g. if two custom claims with the same keys are set. |
|
| urn:zitadel:iam:action:\{actionname}:log | `{"urn:zitadel:iam:action:appendCustomClaims:log": ["test log", "another test log"]}` | This claim is set during Actions as a log, e.g. if two custom claims with the same keys are set. |
|
||||||
| urn:zitadel:iam:org:domain:primary:\{domainname} | `{"urn:zitadel:iam:org:domain:primary": "acme.ch"}` | This claim represents the primary domain of the organization the user belongs to. |
|
| urn:zitadel:iam:org:domain:primary:\{domainname} | `{"urn:zitadel:iam:org:domain:primary": "acme.ch"}` | This claim represents the primary domain of the organization the user belongs to. |
|
||||||
| urn:zitadel:iam:org:project:roles | `{"urn:zitadel:iam:org:project:roles": [ {"user": {"id1": "acme.zitade.ch", "id2": "caos.ch"} } ] }` | When roles are asserted, ZITADEL does this by providing the `id` and `primaryDomain` below the role. This gives you the option to check in which organization a user has the role on the current project (where your application belongs to). |
|
| urn:zitadel:iam:org:project:roles | `{"urn:zitadel:iam:org:project:roles": [ {"user": {"id1": "acme.zitade.ch", "id2": "caos.ch"} } ] }` | When roles are asserted, ZITADEL does this by providing the `id` and `primaryDomain` below the role. This gives you the option to check in which organization a user has the role on the current project (where your application belongs to). |
|
||||||
| urn:zitadel:iam:org:project:\{projectid}:roles | `{"urn:zitadel:iam:org:project:id3:roles": [ {"user": {"id1": "acme.zitade.ch", "id2": "caos.ch"} } ] }` | When roles are asserted, ZITADEL does this by providing the `id` and `primaryDomain` below the role. This gives you the option to check in which organization a user has the role on a specific project. |
|
| urn:zitadel:iam:org:project:\{projectid}:roles | `{"urn:zitadel:iam:org:project:id3:roles": [ {"user": {"id1": "acme.zitade.ch", "id2": "caos.ch"} } ] }` | When roles are asserted, ZITADEL does this by providing the `id` and `primaryDomain` below the role. This gives you the option to check in which organization a user has the role on a specific project. |
|
||||||
| urn:zitadel:iam:user:metadata | `{"urn:zitadel:iam:user:metadata": [ {"key": "VmFsdWU=" } ] }` | The metadata claim will include all metadata of a user. The values are base64 encoded. |
|
| urn:zitadel:iam:user:metadata | `{"urn:zitadel:iam:user:metadata": [ {"key": "VmFsdWU=" } ] }` | The metadata claim will include all metadata of a user. The values are base64 encoded. |
|
||||||
| urn:zitadel:iam:user:resourceowner:id | `{"urn:zitadel:iam:user:resourceowner:id": "orgid"}` | This claim represents the user's organization ID. |
|
| urn:zitadel:iam:user:resourceowner:id | `{"urn:zitadel:iam:user:resourceowner:id": "orgid"}` | This claim represents the user's organization ID. |
|
||||||
| urn:zitadel:iam:user:resourceowner:name | `{"urn:zitadel:iam:user:resourceowner:name": "ACME"}` | This claim represents the user's organization's name. |
|
| urn:zitadel:iam:user:resourceowner:name | `{"urn:zitadel:iam:user:resourceowner:name": "ACME"}` | This claim represents the user's organization's name. |
|
||||||
| urn:zitadel:iam:user:resourceowner:primary_domain | `{"urn:zitadel:iam:user:resourceowner:primary_domain": "acme.ch"}` | This claim represents the user's organization's primary domain. |
|
| urn:zitadel:iam:user:resourceowner:primary_domain | `{"urn:zitadel:iam:user:resourceowner:primary_domain": "acme.ch"}` | This claim represents the user's organization's primary domain. |
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ sidebar_label: Grant Types
|
|||||||
For a list of supported or unsupported `Grant Types` please have a look at the table below.
|
For a list of supported or unsupported `Grant Types` please have a look at the table below.
|
||||||
|
|
||||||
| Grant Type | Supported |
|
| Grant Type | Supported |
|
||||||
| :---------------------------------------------------- | :-------- |
|
|:------------------------------------------------------|:----------|
|
||||||
| Authorization Code | yes |
|
| Authorization Code | yes |
|
||||||
| Authorization Code with PKCE | yes |
|
| Authorization Code with PKCE | yes |
|
||||||
| Client Credentials | yes |
|
| Client Credentials | yes |
|
||||||
@@ -57,7 +57,7 @@ Our service user work with the JWT profile to authenticate them against ZITADEL.
|
|||||||
Key JSON
|
Key JSON
|
||||||
|
|
||||||
| Key | Example | Description |
|
| Key | Example | Description |
|
||||||
| :----- | :------------------------------------------------------------------ | :----------------------------------------------------------------- |
|
|:-------|:--------------------------------------------------------------------|:-------------------------------------------------------------------|
|
||||||
| type | `"serviceaccount"` | The type of account, right now only serviceaccount is valid |
|
| type | `"serviceaccount"` | The type of account, right now only serviceaccount is valid |
|
||||||
| keyId | `"81693565968772648"` | This is unique ID of the key |
|
| keyId | `"81693565968772648"` | This is unique ID of the key |
|
||||||
| key | `"-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----"` | The private key generated by ZITADEL, this can not be regenerated! |
|
| key | `"-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----"` | The private key generated by ZITADEL, this can not be regenerated! |
|
||||||
@@ -76,13 +76,13 @@ Key JSON
|
|||||||
|
|
||||||
JWT
|
JWT
|
||||||
|
|
||||||
| Claim | Example | Description |
|
| 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 |
|
| 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 |
|
| 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 |
|
| iss | `"77479219772321307"` | String which represents the requesting party (owner of the key), normally the `userId` from the json key file |
|
||||||
| sub | `"77479219772321307"` | The subject ID of the service user, normally the `userId` from the json key file |
|
| sub | `"77479219772321307"` | The subject ID of the service user, normally the `userId` from the json key file |
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ ZITADEL supports the usage of scopes as way of requesting information from the i
|
|||||||
## Standard Scopes
|
## Standard Scopes
|
||||||
|
|
||||||
| Scopes | Description |
|
| Scopes | Description |
|
||||||
| :------------- | ------------------------------------------------------------------------------ |
|
|:---------------|--------------------------------------------------------------------------------|
|
||||||
| openid | When using openid connect this is a mandatory scope |
|
| openid | When using openid connect this is a mandatory scope |
|
||||||
| profile | Optional scope to request the profile of the subject |
|
| profile | Optional scope to request the profile of the subject |
|
||||||
| email | Optional scope to request the email of the subject |
|
| email | Optional scope to request the email of the subject |
|
||||||
@@ -21,14 +21,14 @@ ZITADEL supports the usage of scopes as way of requesting information from the i
|
|||||||
In addition to the standard compliant scopes we utilize the following scopes.
|
In addition to the standard compliant scopes we utilize the following scopes.
|
||||||
|
|
||||||
| Scopes | Example | Description |
|
| Scopes | Example | Description |
|
||||||
| :------------------------------------------------ | :----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|:--------------------------------------------------|:-------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| `urn:zitadel:iam:org:project:role:{rolekey}` | `urn:zitadel:iam:org:project:role:user` | By using this scope a client can request the claim `urn:zitadel:iam:org:project:roles` to be asserted when possible. As an alternative approach you can enable all roles to be asserted from the [project](/guides/manage/console/roles#authorizations) a client belongs to. |
|
| `urn:zitadel:iam:org:project:role:{rolekey}` | `urn:zitadel:iam:org:project:role:user` | By using this scope a client can request the claim `urn:zitadel:iam:org:project:roles` to be asserted when possible. As an alternative approach you can enable all roles to be asserted from the [project](/guides/manage/console/roles#authorizations) a client belongs to. |
|
||||||
| `urn:zitadel:iam:org:projects:roles` | `urn:zitadel:iam:org:projects:roles` | By using this scope a client can request the claim `urn:zitadel:iam:org:project:{projectid}:roles` to be asserted for each requested project. All projects of the token audience, requested by the `urn:zitadel:iam:org:project:id:{projectid}:aud` scopes will be used. |
|
| `urn:zitadel:iam:org:projects:roles` | `urn:zitadel:iam:org:projects:roles` | By using this scope a client can request the claim `urn:zitadel:iam:org:project:{projectid}:roles` to be asserted for each requested project. All projects of the token audience, requested by the `urn:zitadel:iam:org:project:id:{projectid}:aud` scopes will be used. |
|
||||||
| `urn:zitadel:iam:org:id:{id}` | `urn:zitadel:iam:org:id:178204173316174381` | When requesting this scope **ZITADEL** will enforce that the user is a member of the selected organization. If the organization does not exist a failure is displayed. It will assert the `urn:zitadel:iam:user:resourceowner` claims. |
|
| `urn:zitadel:iam:org:id:{id}` | `urn:zitadel:iam:org:id:178204173316174381` | When requesting this scope **ZITADEL** will enforce that the user is a member of the selected organization. If the organization does not exist a failure is displayed. It will assert the `urn:zitadel:iam:user:resourceowner` claims. |
|
||||||
| `urn:zitadel:iam:org:domain:primary:{domainname}` | `urn:zitadel:iam:org:domain:primary:acme.ch` | When requesting this scope **ZITADEL** will enforce that the user is a member of the selected organization and the username is suffixed by the provided domain. If the organization does not exist a failure is displayed |
|
| `urn:zitadel:iam:org:domain:primary:{domainname}` | `urn:zitadel:iam:org:domain:primary:acme.ch` | When requesting this scope **ZITADEL** will enforce that the user is a member of the selected organization and the username is suffixed by the provided domain. If the organization does not exist a failure is displayed |
|
||||||
| `urn:zitadel:iam:org:roles:id:{orgID}` | `urn:zitadel:iam:org:roles:id:178204173316174381` | This scope can be used one or more times to limit the granted organization IDs in the returned roles. Unknown organization IDs are ignored. When this scope is not used, all granted organizations are returned inside the roles. |
|
| `urn:zitadel:iam:org:roles:id:{orgID}` | `urn:zitadel:iam:org:roles:id:178204173316174381` | This scope can be used one or more times to limit the granted organization IDs in the returned roles. Unknown organization IDs are ignored. When this scope is not used, all granted organizations are returned inside the roles. |
|
||||||
| `urn:zitadel:iam:org:project:id:{projectid}:aud` | `urn:zitadel:iam:org:project:id:69234237810729019:aud` | By adding this scope, the requested project id will be added to the audience of the access token |
|
| `urn:zitadel:iam:org:project:id:{projectid}:aud` | `urn:zitadel:iam:org:project:id:69234237810729019:aud` | By adding this scope, the requested project id will be added to the audience of the access token |
|
||||||
| `urn:zitadel:iam:org:project:id:zitadel:aud` | `urn:zitadel:iam:org:project:id:zitadel:aud` | By adding this scope, the ZITADEL project id will be added to the audience of the access token |
|
| `urn:zitadel:iam:org:project:id:zitadel:aud` | `urn:zitadel:iam:org:project:id:zitadel:aud` | By adding this scope, the ZITADEL project id will be added to the audience of the access token |
|
||||||
| `urn:zitadel:iam:user:metadata` | `urn:zitadel:iam:user:metadata` | By adding this scope, the metadata of the user will be included in the token. The values are base64 encoded. |
|
| `urn:zitadel:iam:user:metadata` | `urn:zitadel:iam:user:metadata` | By adding this scope, the metadata of the user will be included in the token. The values are base64 encoded. |
|
||||||
| `urn:zitadel:iam:user:resourceowner` | `urn:zitadel:iam:user:resourceowner` | By adding this scope: id, name and primary_domain of the user's organization will be included in the token. |
|
| `urn:zitadel:iam:user:resourceowner` | `urn:zitadel:iam:user:resourceowner` | By adding this scope: id, name and primary_domain of the user's organization will be included in the token. |
|
||||||
| `urn:zitadel:iam:org:idp:id:{idp_id}` | `urn:zitadel:iam:org:idp:id:76625965177954913` | By adding this scope the user will directly be redirected to the identity provider to authenticate. Make sure you also send the primary domain scope if a custom login policy is configured. Otherwise the system will not be able to identify the identity provider. |
|
| `urn:zitadel:iam:org:idp:id:{idp_id}` | `urn:zitadel:iam:org:idp:id:76625965177954913` | By adding this scope the user will directly be redirected to the identity provider to authenticate. Make sure you also send the primary domain scope if a custom login policy is configured. Otherwise the system will not be able to identify the identity provider. |
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ This All in One (AiO) approach makes operating Zitadel simple.
|
|||||||
|
|
||||||
## The Architecture
|
## The Architecture
|
||||||
|
|
||||||
Zitadels software architecture is built around multiple components at different levels.
|
Zitadel's software architecture is built around multiple components at different levels.
|
||||||
This chapter should give you an idea of the components as well as the different layers.
|
This chapter should give you an idea of the components as well as the different layers.
|
||||||
|
|
||||||

|

|
||||||
@@ -63,7 +63,7 @@ The Command Side has some unique requirements, these include:
|
|||||||
|
|
||||||
The command handler receives all operations who alter a resource managed by Zitadel.
|
The command handler receives all operations who alter a resource managed by Zitadel.
|
||||||
For example if a user changes their name. The API Layer will pass the instruction received through the API call to the command handler for further processing.
|
For example if a user changes their name. The API Layer will pass the instruction received through the API call to the command handler for further processing.
|
||||||
The command handler is then responsible of creating the necessary commands.
|
The command handler is then responsible for creating the necessary commands.
|
||||||
After creating the commands the command hand them down to the command validation.
|
After creating the commands the command hand them down to the command validation.
|
||||||
|
|
||||||
##### Command Validation
|
##### Command Validation
|
||||||
@@ -76,7 +76,7 @@ These events now are being handed down to the storage layer for storage.
|
|||||||
#### Events
|
#### Events
|
||||||
|
|
||||||
Zitadel handles events in two ways.
|
Zitadel handles events in two ways.
|
||||||
Events that should be processed in near real time are processed by a in memory pub sub system.
|
Events that should be processed in near real time are processed by an in memory pub sub system.
|
||||||
Some events can be handled asynchronously using the spooler.
|
Some events can be handled asynchronously using the spooler.
|
||||||
|
|
||||||
##### Pub Sub
|
##### Pub Sub
|
||||||
@@ -103,7 +103,7 @@ Spoolers are especially necessary where someone can query datasets instead of si
|
|||||||
|
|
||||||
#### Projections
|
#### Projections
|
||||||
|
|
||||||
Projections are responsible of normalizing data for the query side or for analytical purpose.
|
Projections are responsible for normalizing data for the query side or for analytical purpose.
|
||||||
They generally work by being invoked either through a scheduled spooler or the pub sub subscription.
|
They generally work by being invoked either through a scheduled spooler or the pub sub subscription.
|
||||||
|
|
||||||
When they receive events they will create their normalized object and then store this into the query view and its storage layer.
|
When they receive events they will create their normalized object and then store this into the query view and its storage layer.
|
||||||
@@ -122,10 +122,10 @@ It has some unique requirements, which include:
|
|||||||
|
|
||||||
##### Query Handler
|
##### Query Handler
|
||||||
|
|
||||||
The query handler receives all read relevant operations. These can either be query or simple `getById` calls.
|
The query handler receives all read relevant operations. These can either be queries or simple `getById` calls.
|
||||||
When receiving a query it will proceed by passing this to the repository which will call the database and return the dataset.
|
When receiving a query it will proceed by passing this to the repository which will call the database and return the dataset.
|
||||||
If a request calls for a specific id the call will, most of the times, be revalidated against the Event Store.
|
If a request calls for a specific id the call will, most of the time, be revalidated against the Event Store.
|
||||||
This is achieved by triggering the projection to make sure that the last sequence of a id is loaded into the query view.
|
This is achieved by triggering the projection to make sure that the last sequence of an id is loaded into the query view.
|
||||||
|
|
||||||
> The query side has the option to dynamically check the Event Store for newer events on a certain id to make sure for consistent responses without delay.
|
> The query side has the option to dynamically check the Event Store for newer events on a certain id to make sure for consistent responses without delay.
|
||||||
|
|
||||||
|
|||||||
@@ -9,36 +9,36 @@ The goal is to give you a rough overview, so you know where which data is stored
|
|||||||
## Event
|
## Event
|
||||||
|
|
||||||
The single source of truth of ZITADEL are the events that are stored in the eventstore.
|
The single source of truth of ZITADEL are the events that are stored in the eventstore.
|
||||||
From these events all different kind of resources e.g Users, Projects, Applications, etc. can be computed.
|
From these events all different kind of resources e.g. Users, Projects, Applications, etc. can be computed.
|
||||||
|
|
||||||
An event has the following data:
|
An event has the following data:
|
||||||
|
|
||||||
| Attribute | Description | Example |
|
| Attribute | Description | Example |
|
||||||
| --- | --- | --- |
|
|----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------|
|
||||||
| id | unique identifier of the event, this is generated by the database | b6402a60-e4655-4cc0-904b-f5c6760c4406 |
|
| id | unique identifier of the event, this is generated by the database | b6402a60-e4655-4cc0-904b-f5c6760c4406 |
|
||||||
| aggregate_type | the type of the aggregate, an aggregate can be compared to a resource or an object. One aggregate contains multiple event types | user |
|
| aggregate_type | the type of the aggregate, an aggregate can be compared to a resource or an object. One aggregate contains multiple event types | user |
|
||||||
| aggregate_id | The unique identifier of an aggregate, this is generated by ZITADEL and is a sonyflake id | 168096909691353697 |
|
| aggregate_id | The unique identifier of an aggregate, this is generated by ZITADEL and is a sonyflake id | 168096909691353697 |
|
||||||
| aggregate_version | The aggregate version shows in which version of the aggregate the event was created. This is needed to be able to compute correct objects | v1 |
|
| aggregate_version | The aggregate version shows in which version of the aggregate the event was created. This is needed to be able to compute correct objects | v1 |
|
||||||
| event_type | The type of the event | user.human.added |
|
| event_type | The type of the event | user.human.added |
|
||||||
| event_sequence | The event sequence is a sequence number that is incremented by one for each event on the instance. For technical reasons, a number can be omitted in some cases. This is needed so that the sequence of the events can be ensured. | 1234 |
|
| event_sequence | The event sequence is a sequence number that is incremented by one for each event on the instance. For technical reasons, a number can be omitted in some cases. This is needed so that the sequence of the events can be ensured. | 1234 |
|
||||||
| previous_aggregate_sequence| This number is the sequence of the event last created on this specific aggregate. E.g. Last user with specific aggregate_id | 1233|
|
| previous_aggregate_sequence | This number is the sequence of the event last created on this specific aggregate. E.g. Last user with specific aggregate_id | 1233 |
|
||||||
| previous_aggregate_type_sequence | This number is the sequence of the event last created on this aggregate. E.g Last User | 1230 |
|
| previous_aggregate_type_sequence | This number is the sequence of the event last created on this aggregate. E.g Last User | 1230 |
|
||||||
| creation_date| timestamp when the event was created | 2022-07-05 13:57:56.358774+00 |
|
| creation_date | timestamp when the event was created | 2022-07-05 13:57:56.358774+00 |
|
||||||
| editor_user| The editor user contains mostly an unique identifier of a user. And tells who did the request that led to this event. Sometimes this can also be a name of a system within ZITADEL. | 165460784409638965, NOTIFICATION, LOGIN |
|
| editor_user | The editor user contains mostly an unique identifier of a user. And tells who did the request that led to this event. Sometimes this can also be a name of a system within ZITADEL. | 165460784409638965, NOTIFICATION, LOGIN |
|
||||||
| editor_service | The service defines which API was called when the event got created. If the event was created from the system itself this is empty. | Admin-API |
|
| editor_service | The service defines which API was called when the event got created. If the event was created from the system itself this is empty. | Admin-API |
|
||||||
| resource_owner | The resource owner defines to which organization/resource_owner the event belongs. This is an id generated by ZITADEL as sonyflake id | 168051083313153168 |
|
| resource_owner | The resource owner defines to which organization/resource_owner the event belongs. This is an id generated by ZITADEL as sonyflake id | 168051083313153168 |
|
||||||
| instance_id | ZITADEL is capable of containing multiple ZITADEL instances withing the system. This id is the unique identifier of the Instance and is generated by ZITADEL as sonyflake id. | 165460784409737865 |
|
| instance_id | ZITADEL is capable of containing multiple ZITADEL instances withing the system. This id is the unique identifier of the Instance and is generated by ZITADEL as sonyflake id. | 165460784409737865 |
|
||||||
|
|
||||||
## Schemas
|
## Schemas
|
||||||
|
|
||||||
| Schema | Description | Examples |
|
| Schema | Description | Examples |
|
||||||
| --- | --- | --- |
|
|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------|
|
||||||
| System | The system contains everything that is needed outside the ZITADEL instances. | assets, encryption_key |
|
| System | The system contains everything that is needed outside the ZITADEL instances. | assets, encryption_key |
|
||||||
| Eventstore | Eventstore is the base of ZITADEL and is the single source of truth. All the events stored in the eventstore can be used to generate different projections. | events, instance sequences, system wide unique constraints
|
| Eventstore | Eventstore is the base of ZITADEL and is the single source of truth. All the events stored in the eventstore can be used to generate different projections. | events, instance sequences, system wide unique constraints |
|
||||||
| Projections| The projections contain all the computed objects which are used for reading requests. | users, projects, etc|
|
| Projections | The projections contain all the computed objects which are used for reading requests. | users, projects, etc |
|
||||||
| Auth | This contains projections which are used for the auth api. All projections in this schema should be moved to Projections soon | users, auth_request, etc. |
|
| Auth | This contains projections which are used for the auth api. All projections in this schema should be moved to Projections soon | users, auth_request, etc. |
|
||||||
| Adminapi | This contains projections which are used for the admin api. All projections in this schema should be moved to Projections soon | styling|
|
| Adminapi | This contains projections which are used for the admin api. All projections in this schema should be moved to Projections soon | styling |
|
||||||
| Notification | This contains projections which are used for sending notification. All projections in this schema should be moved to Projections soon | styling|
|
| Notification | This contains projections which are used for sending notification. All projections in this schema should be moved to Projections soon | styling |
|
||||||
|
|
||||||
## Projections
|
## Projections
|
||||||
|
|
||||||
@@ -64,13 +64,13 @@ You can find the current sequence in the following tables:
|
|||||||
|
|
||||||
The current sequence is stored for each ZITADEL instance and table.
|
The current sequence is stored for each ZITADEL instance and table.
|
||||||
|
|
||||||
| Attribute | Description | Examples |
|
| Attribute | Description | Examples |
|
||||||
| --- | --- | --- |
|
|------------------|-------------------------------------------------------------|-------------------------------|
|
||||||
| projection_name | The name of the projection for which the sequence is valid. | projection.users |
|
| projection_name | The name of the projection for which the sequence is valid. | projection.users |
|
||||||
| aggregate_type | The aggregate type where the sequence was from | user |
|
| aggregate_type | The aggregate type where the sequence was from | user |
|
||||||
| current_sequence | The sequence that was last processed | 1234 |
|
| current_sequence | The sequence that was last processed | 1234 |
|
||||||
| instance_id | The instance to which the event belongs | 165460784409737834 |
|
| instance_id | The instance to which the event belongs | 165460784409737834 |
|
||||||
| timestamp | Timestamp when the table was updated | 2022-07-05 13:57:59.454798+00 |
|
| timestamp | Timestamp when the table was updated | 2022-07-05 13:57:59.454798+00 |
|
||||||
|
|
||||||
### Failed Events
|
### Failed Events
|
||||||
|
|
||||||
@@ -85,10 +85,10 @@ You can find the failed_events in the following tables:
|
|||||||
- auth.failed_events
|
- auth.failed_events
|
||||||
- adminapi.failed_events
|
- adminapi.failed_events
|
||||||
|
|
||||||
| Attribute | Description | Examples |
|
| Attribute | Description | Examples |
|
||||||
| --- | --- | --- |
|
|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------|
|
||||||
| projection_name | The name of the projection for which the failed event should have been processed. | projection.users |
|
| projection_name | The name of the projection for which the failed event should have been processed. | projection.users |
|
||||||
| failed_sequence | The sequence of the event that failed | 1234 |
|
| failed_sequence | The sequence of the event that failed | 1234 |
|
||||||
| failure_count | The number of times the event was attempted to be processed. If the number is lower than the max. attempts the event could be processed, but not on the first attempt | 5 |
|
| failure_count | The number of times the event was attempted to be processed. If the number is lower than the max. attempts the event could be processed, but not on the first attempt | 5 |
|
||||||
| error | The error message that occurred when the event could not be processed | User not found |
|
| error | The error message that occurred when the event could not be processed | User not found |
|
||||||
| instance_id | The instance to which the event belongs | 165460784409737834 |
|
| instance_id | The instance to which the event belongs | 165460784409737834 |
|
||||||
|
|||||||
@@ -3,16 +3,16 @@ title: ZITADEL's In-built Audit Trail
|
|||||||
sidebar_label: Audit Trail
|
sidebar_label: Audit Trail
|
||||||
---
|
---
|
||||||
|
|
||||||
ZITADEL provides you with an built-in audit trail to track all changes and events over an unlimited period of time.
|
ZITADEL provides you with a built-in audit trail to track all changes and events over an unlimited period of time.
|
||||||
Most other solutions replace a historic record and track changes in a separate log when information is updated.
|
Most other solutions replace a historical record and track changes in a separate log when information is updated.
|
||||||
ZITADEL only ever appends data in an [Eventstore](/concepts/eventstore/overview), keeping all historic record.
|
ZITADEL only ever appends data in an [Eventstore](/concepts/eventstore/overview), keeping all historical record.
|
||||||
The audit trail itself is identical to the state, since ZITADEL calculates the state from all the past changes.
|
The audit trail itself is identical to the state, since ZITADEL calculates the state from all the past changes.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
This form of audit log has several benefits over storing classic audit logs.
|
This form of audit log has several benefits over storing classic audit logs.
|
||||||
You can view past data in-context of the whole system at a single point in time.
|
You can view past data in-context of the whole system at a single point in time.
|
||||||
Reviewing a past state of the application can be important when tracing an incident that happened months back. Moreover the eventstore provides a truly complete and clean audit log.
|
Reviewing a past state of the application can be important when tracing an incident that happened months back. Moreover, the eventstore provides a truly complete and clean audit log.
|
||||||
|
|
||||||
<Callout title="Future Plans">
|
<Callout title="Future Plans">
|
||||||
There will be three major areas for future development on the audit data
|
There will be three major areas for future development on the audit data
|
||||||
@@ -28,7 +28,7 @@ There will be three major areas for future development on the audit data
|
|||||||
### Last changes of an object
|
### Last changes of an object
|
||||||
|
|
||||||
You can check the last changes of most objects in the [Console](/guides/manage/console/console-overview).
|
You can check the last changes of most objects in the [Console](/guides/manage/console/console-overview).
|
||||||
In the following screenshot you can see an example of last changes on an [user](/guides/manage/console/users-overview).
|
In the following screenshot you can see an example of last changes on a [user](/guides/manage/console/users-overview).
|
||||||
The same view is available on several other objects such as organization or project.
|
The same view is available on several other objects such as organization or project.
|
||||||
|
|
||||||

|

|
||||||
@@ -42,7 +42,7 @@ Go to your default settings and then click on the Tab **Events** to open the Eve
|
|||||||
|
|
||||||
### Event API
|
### Event API
|
||||||
|
|
||||||
Since everything that is available in Management Console can also be called with our APIs, you can access all events and audit data trough our APIs:
|
Since everything that is available in Management Console can also be called with our APIs, you can access all events and audit data through our APIs:
|
||||||
|
|
||||||
- [Event API Guide](/guides/integrate/zitadel-apis/event-api)
|
- [Event API Guide](/guides/integrate/zitadel-apis/event-api)
|
||||||
- [API Documentation](/reference/api/admin)
|
- [API Documentation](/reference/api/admin)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ title: Identity Brokering
|
|||||||
sidebar_label: Identity Brokering
|
sidebar_label: Identity Brokering
|
||||||
---
|
---
|
||||||
|
|
||||||
Link social logins and external identity providers with your identity management platform allowing users to login with their preferred identity provider.
|
Link social logins and external identity providers with your identity management platform allowing users to log in with their preferred identity provider.
|
||||||
|
|
||||||
Establish a trusted connection between your central identity provider (IdP) and third party identity providers.
|
Establish a trusted connection between your central identity provider (IdP) and third party identity providers.
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ A service provider that specializes in brokering access control between multiple
|
|||||||
Federated identity management is an arrangement that is made between two or more such identity brokers across organizations.
|
Federated identity management is an arrangement that is made between two or more such identity brokers across organizations.
|
||||||
|
|
||||||
For example, if Google is configured as an identity provider in your organization, the user will get the option to use his Google Account on the Login Screen of ZITADEL.
|
For example, if Google is configured as an identity provider in your organization, the user will get the option to use his Google Account on the Login Screen of ZITADEL.
|
||||||
Because Google is registered as a trusted identity provider, the user will be able to login in with the Google account after the user is linked with an existing ZITADEL account (if the user is already registered) or a new one with the claims provided by Google.
|
Because Google is registered as a trusted identity provider, the user will be able to log in with the Google account after the user is linked with an existing ZITADEL account (if the user is already registered) or a new one with the claims provided by Google.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -41,9 +41,9 @@ The schema is a very simplified version, but shows the essential steps for ident
|
|||||||
## Is single-sign-on (SSO) the same as identity brokering?
|
## Is single-sign-on (SSO) the same as identity brokering?
|
||||||
|
|
||||||
Sometimes single-sign-on (SSO) and login with third party identity providers is used interchangeably.
|
Sometimes single-sign-on (SSO) and login with third party identity providers is used interchangeably.
|
||||||
Typically SSO describes an authentication scheme that allows users to log in once at a central identity provider and access service providers (client applications) without to login again.
|
Typically, SSO describes an authentication scheme that allows users to log in once at a central identity provider and access service providers (client applications) without having to login again.
|
||||||
|
|
||||||
Identity brokering describes an authentication scheme where users can login with external identity providers that have a established trust with an identity provider which facilitates the authentication for the requested applications.
|
Identity brokering describes an authentication scheme where users can log in with external identity providers that have an established trust with an identity provider which facilitates the authentication for the requested applications.
|
||||||
|
|
||||||
The connection between the two lies in how SSO can be implemented as part of an identity brokering solution.
|
The connection between the two lies in how SSO can be implemented as part of an identity brokering solution.
|
||||||
In such cases, the identity broker uses SSO to enable seamless access across multiple systems, handling the complexities of different authentication protocols and standards behind the scenes.
|
In such cases, the identity broker uses SSO to enable seamless access across multiple systems, handling the complexities of different authentication protocols and standards behind the scenes.
|
||||||
@@ -52,7 +52,7 @@ This allows users to log in once and gain access to multiple systems that the br
|
|||||||
## Multitenancy and identity brokering
|
## Multitenancy and identity brokering
|
||||||
|
|
||||||
In a multi-tenancy application, you want to be able to configure an external identity provider per tenant.
|
In a multi-tenancy application, you want to be able to configure an external identity provider per tenant.
|
||||||
For example some organizations might use their EntraID, some other want to login with their OKTA, or Google Workspace.
|
For example some organizations might use their EntraID, some other want to log in with their OKTA, or Google Workspace.
|
||||||
|
|
||||||
Using an identity provider with strong multitenancy capabilities such as ZITADEL, you can configure a different set of external identity providers per organization.
|
Using an identity provider with strong multitenancy capabilities such as ZITADEL, you can configure a different set of external identity providers per organization.
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ title: Principles
|
|||||||
- Embrace stateless application design
|
- Embrace stateless application design
|
||||||
- System of records is the event store
|
- System of records is the event store
|
||||||
- Everything else needs to be able to be regenerated
|
- Everything else needs to be able to be regenerated
|
||||||
- Try not so solve complex problems outside of the IAM Domain
|
- Try not to solve complex problems outside the IAM Domain
|
||||||
- Use a scalable storage for the event store and read models
|
- Use a scalable storage for the event store and read models
|
||||||
- Try to be idempotent whenever possible
|
- Try to be idempotent whenever possible
|
||||||
- Reduce necessity of external systems or dependencies as much as possible
|
- Reduce necessity of external systems or dependencies as much as possible
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ sidebar_label: Instances
|
|||||||
An instance is the top node in ZITADEL's data hierarchy.
|
An instance is the top node in ZITADEL's data hierarchy.
|
||||||
Within an instance all the default [settings](/concepts/structure/policies),
|
Within an instance all the default [settings](/concepts/structure/policies),
|
||||||
such as branding, login policy, password policy, etc. for the system can be configured.
|
such as branding, login policy, password policy, etc. for the system can be configured.
|
||||||
One instance normally runs on one domain and represents one issuer (e.g login.customer.com).
|
One instance normally runs on one domain and represents one issuer (e.g. login.customer.com).
|
||||||
|
|
||||||
One instance can contain multiple [organizations](/guides/manage/console/organizations-overview),
|
One instance can contain multiple [organizations](/guides/manage/console/organizations-overview),
|
||||||
which in turn can represent your own company (e.g. departments), your business customers or a consumer organization.
|
which in turn can represent your own company (e.g. departments), your business customers or a consumer organization.
|
||||||
@@ -25,7 +25,7 @@ You will find more detailed explanations around the different concepts in the fo
|
|||||||
ZITADEL has the concept of virtual instances.
|
ZITADEL has the concept of virtual instances.
|
||||||
When installing ZITADEL from scratch, one instance is always automatically created for you.
|
When installing ZITADEL from scratch, one instance is always automatically created for you.
|
||||||
Nevertheless, you can add more virtual instances via the [system API](/reference/api/system).
|
Nevertheless, you can add more virtual instances via the [system API](/reference/api/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.
|
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.
|
Scaling ZITADEL instances virtually enables you to easily distribute your limited compute resources to all your customers.
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ Read more on how to [login users with ZITADEL](/guides/integrate/login/login-use
|
|||||||
|
|
||||||
### Service users
|
### Service users
|
||||||
|
|
||||||
Service users are for machine-to-machine communication and you would use those typically to access secure backend services.
|
Service users are for machine-to-machine communication, and you would use those typically to access secure backend services.
|
||||||
For example in ZITADEL you would require an authenticated Service User to access the Management API.
|
For example in ZITADEL you would require an authenticated Service User to access the Management API.
|
||||||
The main difference between users and service accounts is the type of credentials that can be used for authentication: users typically logon via an login prompt, but service accounts require a non-interactive logon process.
|
The main difference between users and service accounts is the type of credentials that can be used for authentication: users typically logon via a login prompt, but service accounts require a non-interactive logon process.
|
||||||
|
|
||||||
Learn how to [use service accounts](/guides/integrate/service-accounts/authenticate-service-accounts) with ZITADEL.
|
Learn how to [use service accounts](/guides/integrate/service-accounts/authenticate-service-accounts) with ZITADEL.
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ A user with an administrator role is not only an end-user of ZITADEL but can als
|
|||||||
### Federated users
|
### Federated users
|
||||||
|
|
||||||
Federated users are identities that are managed by a third-party identity provider.
|
Federated users are identities that are managed by a third-party identity provider.
|
||||||
Users can login via an external identity provider, using [identity brokering](../features/identity-brokering) ("Single-sign-on").
|
Users can log in via an external identity provider, using [identity brokering](../features/identity-brokering) ("Single-sign-on").
|
||||||
Federated user [accounts are linked](../features/account-linking) to internal users to be able to assign roles and keep an audit trail.
|
Federated user [accounts are linked](../features/account-linking) to internal users to be able to assign roles and keep an audit trail.
|
||||||
|
|
||||||
### External users
|
### External users
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
8. You will see the following screen afterwards.
|
8. You will see the following screen afterward.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,6 @@ In order to access this route, you must create the role `read:messages` in your
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
9. You will now see the your service user has been assigned the role **read:messages**.
|
9. You will now see the service user has been assigned the role **read:messages**.
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -66,7 +66,7 @@ Copy the following code to your service. This code provides a function `authenti
|
|||||||
https://github.com/zitadel/zitadel-angular/blob/main/src/app/services/authentication.service.ts
|
https://github.com/zitadel/zitadel-angular/blob/main/src/app/services/authentication.service.ts
|
||||||
```
|
```
|
||||||
|
|
||||||
Our example includes a _StatehandlerService_ that redirects the user back to the route from which they initially came.If you don't need such behavior, you can omit the following line from the `authenticate()` method above.
|
Our example includes a _StatehandlerService_ that redirects the user back to the route from which they initially came. If you don't need such behavior, you can omit the following line from the `authenticate()` method above.
|
||||||
|
|
||||||
```ts reference
|
```ts reference
|
||||||
https://github.com/zitadel/zitadel-angular/blob/main/src/app/services/authentication.service.ts#L45
|
https://github.com/zitadel/zitadel-angular/blob/main/src/app/services/authentication.service.ts#L45
|
||||||
|
|||||||
@@ -29,30 +29,30 @@ Enter the name `Demo-Vendor`, and click "Create". Then click on that organizatio
|
|||||||
|
|
||||||
### Portal Web Application
|
### Portal Web Application
|
||||||
|
|
||||||
To setup this sample you have to create a project and an application in the vendor organization (`Demo-Vendor`) first.
|
To set up this sample you have to create a project and an application in the vendor organization (`Demo-Vendor`) first.
|
||||||
|
|
||||||
Open the Management Console (`https://$CUSTOM_DOMAIN.zitadel.cloud/ui/console/projects`) and create a new project. Let's call it `Portal`.
|
Open the Management 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.
|
Then on the project detail page click on new application and enter a name for this app.
|
||||||
Let's call this one `portal-web`.
|
Let's call this one `portal-web`.
|
||||||
Select `Web`, continue, `CODE`, then enter `http://localhost:3000/api/auth/callback/zitadel` for the redirect, and `http://localhost:3000` for the post redirect. Then press on `create`.
|
Select `Web`, continue, `CODE`, then enter `http://localhost:3000/api/auth/callback/zitadel` for the redirect, and `http://localhost:3000` for the post redirect. Then press on `create`.
|
||||||
Because the requests from your NextJS application to ZITADEL are made on the server side, you can safely select `CODE`. You will get a secret at the end of the stepper. With NextAuth your secret never gets exposed on the browser since it is kept in your NextJS server.
|
Because the requests from your Next.js application to ZITADEL are made on the server side, you can safely select `CODE`. You will get a secret at the end of the stepper. With NextAuth your secret never gets exposed on the browser since it is kept in your Next.js server.
|
||||||
|
|
||||||
Copy the "Resource Id" of the project `Portal` as you will need this in your environment configuration file later.
|
Copy the "Resource ID" of the project `Portal` as you will need this in your environment configuration file later.
|
||||||
|
|
||||||
Click on the application `portal-web`.
|
Click on the application `portal-web`.
|
||||||
On the application detail page click on the section under redirect settings and enable `Development Mode`. This will allow you application to work on `localhost:3000`.
|
On the application detail page click on the section under redirect settings and enable `Development Mode`. This will allow you application to work on `localhost:3000`.
|
||||||
To read the user data and roles from ID Token, go to the section Token Settings and make sure both checkboxes, `User roles inside ID Token` and `User Info inside ID Token` are enabled.
|
To read the user data and roles from ID Token, go to the section Token Settings and make sure both checkboxes, `User roles inside ID Token` and `User Info inside ID Token` are enabled.
|
||||||
Make sure to save your changes.
|
Make sure to save your changes.
|
||||||
|
|
||||||
Copy the "Resource Id" of the application `portal-web` as you will need this in your environment configuration file later.
|
Copy the "Resource ID" of the application `portal-web` as you will need this in your environment configuration file later.
|
||||||
|
|
||||||
### Roles
|
### Roles
|
||||||
|
|
||||||
To setup the needed roles for your project, navigate to your `Portal` project, and add the following roles
|
To set up the needed roles for your project, navigate to your `Portal` project, and add the following roles
|
||||||
|
|
||||||
| Key | Display Name | Group | Description |
|
| Key | Display Name | Group | Description |
|
||||||
| :----- | :------------ | :---- | ---------------------------------------------------------------------- |
|
|:-------|:--------------|:------|------------------------------------------------------------------------|
|
||||||
| admin | Administrator | | The administrator, allowed to read granted projects and to user grants |
|
| admin | Administrator | | The administrator, allowed to read granted projects and to user grants |
|
||||||
| reader | Reader | | A user who is allowed to read his organizations granted projects only |
|
| reader | Reader | | A user who is allowed to read his organizations granted projects only |
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ To show granted projects, go to the `Demo-Vendor` organization and add the Servi
|
|||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
Now clone this project and navigate to its root folder.
|
Now clone this project and navigate to its root folder.
|
||||||
Create a file `.env.local` and copy paste the following:
|
Create a file `.env.local` and copy and paste the following:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
NEXTAUTH_URL=http://localhost:3000
|
NEXTAUTH_URL=http://localhost:3000
|
||||||
@@ -96,13 +96,13 @@ Replace the values as follows
|
|||||||
|
|
||||||
`NEXT_PUBLIC_ZITADEL_ISSUER`: The url to your zitadel instance. When using zitadel.cloud for this demo you can find the domain of your ZITADEL instance in the customer portal. You can also find this information by going to your application `portal-web` and click 'URLs' in the navigation. The variable is prefixed with `NEXT_PUBLIC_` such that it can be accessed from the application.
|
`NEXT_PUBLIC_ZITADEL_ISSUER`: The url to your zitadel instance. When using zitadel.cloud for this demo you can find the domain of your ZITADEL instance in the customer portal. You can also find this information by going to your application `portal-web` and click 'URLs' in the navigation. The variable is prefixed with `NEXT_PUBLIC_` such that it can be accessed from the application.
|
||||||
|
|
||||||
`ZITADEL_API`: URL of the Management API. Typically the same as `ZITADEL_ISSUER`.
|
`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 `${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".
|
`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 `${PROJECT_ID}` by clicking on "Projects" in the navigation and select the Project `Portal`. `${PROJECT_ID}` 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`. `${CLIENT_ID}` 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, labeled "Client ID" and has the format `12345678@portal`.
|
||||||
|
|
||||||
`SERVICE_ACCOUNT_ACCESS_TOKEN`: Set up 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).
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ Give `Alice Admin` the roles `reader` and `admin`.
|
|||||||
|
|
||||||
### Login
|
### Login
|
||||||
|
|
||||||
You should be able to login to the Demo Application with `Alice Admin` and see all granted projects.
|
You should be able to log in to the Demo Application with `Alice Admin` and see all granted projects.
|
||||||
|
|
||||||
You can log out and log in with `Eric Employee` and you should only have access to the granted projects, but not to the Authorizations tab.
|
You can log out and log in with `Eric Employee` and you should only have access to the granted projects, but not to the Authorizations tab.
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ On the user view, switch to *Service Users* and create a new one.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
Give the service user a name and a user name. Select `Bearer` as *Access Token Type*.
|
Give the service user a name and a username. Select `Bearer` as *Access Token Type*.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ Create a new go file with the content below. This will create an API with three
|
|||||||
|
|
||||||
If authorization is required, the token must not be expired and the API has to be part of the audience (either client_id or project_id).
|
If authorization is required, the token must not be expired and the API has to be part of the audience (either client_id or project_id).
|
||||||
|
|
||||||
For tests we will use a Personal Access Token.
|
For tests, we will use a Personal Access Token.
|
||||||
|
|
||||||
```go reference
|
```go reference
|
||||||
https://github.com/zitadel/zitadel-go/blob/next/example/api/http/main.go
|
https://github.com/zitadel/zitadel-go/blob/next/example/api/http/main.go
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ ZITADEL provides different solutions how to send events to external systems, the
|
|||||||
The following table shows the available integration patterns for streaming audit logs to external systems.
|
The following table shows the available integration patterns for streaming audit logs to external systems.
|
||||||
|
|
||||||
| | Description | Self-hosting | ZITADEL Cloud |
|
| | Description | Self-hosting | ZITADEL Cloud |
|
||||||
|-------------------------------------|----------------------------------------------------------------------------------------------------------------|-------------|---------------|
|
|-------------------------------------|----------------------------------------------------------------------------------------------------------------|--------------|---------------|
|
||||||
| Events-API | Pulling events of all ZITADEL resources such as Users, Projects, Apps, etc. (Events = Change Log of Resources) | ✅ | ✅ |
|
| Events-API | Pulling events of all ZITADEL resources such as Users, Projects, Apps, etc. (Events = Change Log of Resources) | ✅ | ✅ |
|
||||||
| ZITADEL Actions Log to Stdout | Custom log to messages possible on predefined triggers during login / register Flow | ✅ | ❌ |
|
| ZITADEL Actions Log to Stdout | Custom log to messages possible on predefined triggers during login / register Flow | ✅ | ❌ |
|
||||||
| ZITADEL Actions trigger API/Webhook | Custom API/Webhook request on predefined triggers during login / register | ✅ | ✅ |
|
| ZITADEL Actions trigger API/Webhook | Custom API/Webhook request on predefined triggers during login / register | ✅ | ✅ |
|
||||||
|
|
||||||
### Events API
|
### Events API
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ You will have to paste it in the Apple service later.
|
|||||||
Go back [to the Apple provider template you opened before in ZITADEL](#open-the-apple-identity-provider-template).
|
Go back [to the Apple provider template you opened before in ZITADEL](#open-the-apple-identity-provider-template).
|
||||||
|
|
||||||
1. Add the Client ID, this is [the identifier of the service you created in your Apple Account](#register-a-new-service)
|
1. Add the Client ID, this is [the identifier of the service you created in your Apple Account](#register-a-new-service)
|
||||||
2. Fill the Team ID, you can find it when you login to your Apple Developer account, in your membership
|
2. Fill the Team ID, you can find it when you log in to your Apple Developer account, in your membership
|
||||||
3. Enter the [Key ID and upload the Private Key you created before](#register-a-new-key)
|
3. Enter the [Key ID and upload the Private Key you created before](#register-a-new-key)
|
||||||
|
|
||||||
You can optionally configure the following settings.
|
You can optionally configure the following settings.
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ You need to have access to an Entra ID Tenant. If you do not yet have one follow
|
|||||||
### Register a new application
|
### Register a new application
|
||||||
|
|
||||||
1. Browse to the [App registration menus create dialog](https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/CreateApplicationBlade/quickStartType~/null/isMSAApp~/false) to create a new app.
|
1. Browse to the [App registration menus create dialog](https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/CreateApplicationBlade/quickStartType~/null/isMSAApp~/false) to create a new app.
|
||||||
2. Give the application a name and choose who should be able to login (Single-Tenant, Multi-Tenant, Personal Accounts, etc.) This setting will also have an impact on how to configure the provider later on in ZITADEL.
|
2. Give the application a name and choose who should be able to log in (Single-Tenant, Multi-Tenant, Personal Accounts, etc.) This setting will also have an impact on how to configure the provider later on in ZITADEL.
|
||||||
3. Choose "Web" in the redirect uri field and [paste the ZITADEL Callback URL you copied before](#open-the-microsoft-identity-provider-template).
|
3. Choose "Web" in the redirect uri field and [paste the ZITADEL Callback URL you copied before](#open-the-microsoft-identity-provider-template).
|
||||||
4. Save the Application (client) ID and the Directory (tenant) ID from the detail page
|
4. Save the Application (client) ID and the Directory (tenant) ID from the detail page
|
||||||
5. Register the application
|
5. Register the application
|
||||||
@@ -42,7 +42,7 @@ You need to have access to an Entra ID Tenant. If you do not yet have one follow
|
|||||||
Generate a new client secret to authenticate your user.
|
Generate a new client secret to authenticate your user.
|
||||||
|
|
||||||
1. Click on client credentials on the detail page of the application or use the menu "Certificates & secrets"
|
1. Click on client credentials on the detail page of the application or use the menu "Certificates & secrets"
|
||||||
2. Click on "+ New client secret" and enter a description and an expiry date, add the secret afterwards
|
2. Click on "+ New client secret" and enter a description and an expiry date, add the secret afterward
|
||||||
3. Copy the value of the secret. You will not be able to see the value again after some time
|
3. Copy the value of the secret. You will not be able to see the value again after some time
|
||||||
|
|
||||||

|

|
||||||
@@ -84,7 +84,7 @@ If you want to avoid that, make sure to enable "Email verified".
|
|||||||
In that case, the user is created with a verified email address.
|
In that case, the user is created with a verified email address.
|
||||||
|
|
||||||
**Tenant Type**: Configure the tenant type according to what you have chosen in the settings of your Entra ID application previously.
|
**Tenant Type**: Configure the tenant type according to what you have chosen in the settings of your Entra ID application previously.
|
||||||
- Common: Choose common if you want all Microsoft accounts being able to login.
|
- Common: Choose common if you want all Microsoft accounts being able to log in.
|
||||||
In this case, configure "Accounts in any organizational directory and personal Microsoft accounts" in your Entra ID App.
|
In this case, configure "Accounts in any organizational directory and personal Microsoft accounts" in your Entra ID App.
|
||||||
- Organizations: Choose organization if you have Entra ID Tenants and no personal accounts. (You have configured either "Accounts in this organization" or "Accounts in any organizational directory" on your Azure APP)
|
- Organizations: Choose organization if you have Entra ID Tenants and no personal accounts. (You have configured either "Accounts in this organization" or "Accounts in any organizational directory" on your Azure APP)
|
||||||
- Consumers: Choose this if you want to allow public accounts. (In your Entra ID App you have configured "Personal Microsoft accounts only")
|
- Consumers: Choose this if you want to allow public accounts. (In your Entra ID App you have configured "Personal Microsoft accounts only")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Your user has successfully authenticated, and now you ask them if they want to setup MFA to have a more secure account.
|
Your user has successfully authenticated, and now you ask them if they want to set up MFA to have a more secure account.
|
||||||
When the user starts the configuration, first you want to show them the possible methods.
|
When the user starts the configuration, first you want to show them the possible methods.
|
||||||
You can either list it implicitly or call the settings service from ZITADEL to get what is configured on the login settings.
|
You can either list it implicitly or call the settings service from ZITADEL to get what is configured on the login settings.
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@ curl --request GET \
|
|||||||
```
|
```
|
||||||
|
|
||||||
Response Example:
|
Response Example:
|
||||||
The relevant part for the list is the second factor and multi-factor list.
|
The relevant part for the list is the second factor and multifactor list.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,14 +13,14 @@ This documentation aims to guide you through the process of seamlessly integrati
|
|||||||
|
|
||||||
## Why Integrate with Zitadel?
|
## Why Integrate with Zitadel?
|
||||||
|
|
||||||
ZITADEL offers a comprehensive identity and access management solution, providing features like single sign-on (SSO), multi-factor authentication (MFA), user management, and more. By integrating your application with ZITADEL, you can leverage these powerful features to enhance the security and usability of your application without reinventing the wheel.
|
ZITADEL offers a comprehensive identity and access management solution, providing features like single sign-on (SSO), multifactor authentication (MFA), user management, and more. By integrating your application with ZITADEL, you can leverage these powerful features to enhance the security and usability of your application without reinventing the wheel.
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
To begin integrating your application with Zitadel using RFC 8628, follow the steps outlined in this documentation. We'll walk you through the process, from setting up your application in the Zitadel management console to handling user authentication and access tokens in your application code.
|
To begin integrating your application with Zitadel using RFC 8628, follow the steps outlined in this documentation. We'll walk you through the process, from setting up your application in the Zitadel management console to handling user authentication and access tokens in your application code.
|
||||||
|
|
||||||
1. Go to “Organization”/”Projects”.
|
1. Go to "Organization"/"Projects".
|
||||||
2. Under “Applications” click the “New” button.
|
2. Under "Applications" click the "New" button.
|
||||||
|
|
||||||
<img src="/docs/img/device-auth/device-auth-01.png" alt="Device Authorization Flow in ZITADEL"/>
|
<img src="/docs/img/device-auth/device-auth-01.png" alt="Device Authorization Flow in ZITADEL"/>
|
||||||
|
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ This guide shows you the different concepts and use cases of the logout process
|
|||||||
### Single Sign On (SSO) vs Single Logout (SLO)
|
### Single Sign On (SSO) vs Single Logout (SLO)
|
||||||
|
|
||||||
Single Sign On (SSO) allows a user to login once without the need for authentication across multiple applications.
|
Single Sign On (SSO) allows a user to login once without the need for authentication across multiple applications.
|
||||||
Single Logout (SLO) is the counterpart to SSO. With SLO a user can logout and terminate sessions across many applications, without actively logging out from them.
|
Single Logout (SLO) is the counterpart to SSO. With SLO a user can log out and terminate sessions across many applications, without actively logging out from them.
|
||||||
|
|
||||||
The purpose of a logout is to terminate a user session.
|
The purpose of a logout is to terminate a user session.
|
||||||
Depending on how the session handling is implemented, there are different mechanisms that can be used.
|
Depending on how the session handling is implemented, there are different mechanisms that can be used.
|
||||||
There are two possibilities where sessions are stored:
|
There are two possibilities where sessions are stored:
|
||||||
- The User Agent (e.g the Browser or Mobile App) stores the session information (e.g. in a cookie)
|
- The User Agent (e.g. the Browser or Mobile App) stores the session information (e.g. in a cookie)
|
||||||
- A Server stores the session information (e.g. in a database or api)
|
- A Server stores the session information (e.g. in a database or api)
|
||||||
|
|
||||||
### OpenID Connect Logout
|
### OpenID Connect Logout
|
||||||
@@ -27,14 +27,14 @@ OpenID Connect defines three logout mechanisms to address the different architec
|
|||||||
|
|
||||||
#### Session Management
|
#### Session Management
|
||||||
|
|
||||||
Session Management in OpenID Connect defines a mechanism for a client (Relying Party, RP) to monitor the state of the user session from a identity provider (OP, e.g ZITADEL).
|
Session Management in OpenID Connect defines a mechanism for a client (Relying Party, RP) to monitor the state of the user session from an identity provider (OP, e.g. ZITADEL).
|
||||||
When a user logs out of the provider, the user's session is terminated and the client can in turn reflect that in its behavior.
|
When a user logs out of the provider, the user's session is terminated and the client can in turn reflect that in its behavior.
|
||||||
|
|
||||||
#### RP initiated Logout
|
#### RP initiated Logout
|
||||||
|
|
||||||
With the RP initiated flow all logout processes are triggered by a request from the client (e.g your application) through a well defined standard API by redirecting the user-agent to the [end_session_endpoint](/apis/openidoauth/endpoints#end-session-endpoint).
|
With the RP initiated flow all logout processes are triggered by a request from the client (e.g. your application) through a well-defined standard API by redirecting the user-agent to the [end_session_endpoint](/apis/openidoauth/endpoints#end-session-endpoint).
|
||||||
If you have specified some post_logout_redirect_uris on your client you have to send either the id_token_hint or the client_id as param in your request.
|
If you have specified some post_logout_redirect_uris on your client you have to send either the id_token_hint or the client_id as param in your request.
|
||||||
So ZITADEL is able to read the configured redirect uris.
|
So ZITADEL is able to read the configured redirect URIs.
|
||||||
|
|
||||||
```
|
```
|
||||||
GET ${CUSTOM_DOMAIN}/oidc/v1/end_session
|
GET ${CUSTOM_DOMAIN}/oidc/v1/end_session
|
||||||
@@ -55,7 +55,7 @@ This is not yet implemented in ZITADEL
|
|||||||
#### Back-Channel Logout
|
#### Back-Channel Logout
|
||||||
|
|
||||||
The back-channel logout is a mechanism on the server-side and the user agent does not have to do anything.
|
The back-channel logout is a mechanism on the server-side and the user agent does not have to do anything.
|
||||||
The user will logout from all clients even in the case the user agent was closed.
|
The user will log out from all clients even in the case the user agent was closed.
|
||||||
|
|
||||||
<Callout>
|
<Callout>
|
||||||
This is not yet implemented in ZITADEL
|
This is not yet implemented in ZITADEL
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ sidebar_label: Recommended authorization flows
|
|||||||
|
|
||||||
In this guide we will go over some basics on how to obtain an authorization with OpenID Connect 1.x and OAuth 2.x.
|
In this guide we will go over some basics on how to obtain an authorization with OpenID Connect 1.x and OAuth 2.x.
|
||||||
|
|
||||||
ZITADEL does not make assumptions about the application type you are about to integrate. Therefore you must qualify and define an appropriate method for your users to gain authorization to access your application (“authentication flow”). Your choice depends on the application’s ability to maintain the confidentiality of client credentials and the technological capabilities of your application. If you choose a deprecated or unfeasible flow to obtain authorization for your application, your users’ credentials may be compromised.
|
ZITADEL does not make assumptions about the application type you are about to integrate. Therefore, you must qualify and define an appropriate method for your users to gain authorization to access your application (“authentication flow”). Your choice depends on the application’s ability to maintain the confidentiality of client credentials and the technological capabilities of your application. If you choose a deprecated or unfeasible flow to obtain authorization for your application, your users’ credentials may be compromised.
|
||||||
|
|
||||||
We invite you to further explore the different authorization flows in the OAuth 2.x standard. For the start we assume that you have a brand-new application (ie. without legacy requirements) and you found an reliable SDK/Library that does the heavy lifting for you.
|
We invite you to further explore the different authorization flows in the OAuth 2.x standard. For the start we assume that you have a brand-new application (i.e. without legacy requirements) and you found a reliable SDK/Library that does the heavy lifting for you.
|
||||||
|
|
||||||
So this module will only go over the basics and explain why we recommend the flow “Authorization Flow with PKCE” as default for most applications. We will also cover the case of machine-to-machine communication, ie. where there is no interactive login. Further we will guide you to further reading viable alternatives, if the default flow is not feasible.
|
So this module will only go over the basics and explain why we recommend the flow “Authorization Flow with PKCE” as default for most applications. We will also cover the case of machine-to-machine communication, i.e. where there is no interactive login. Further we will guide you to further reading viable alternatives, if the default flow is not feasible.
|
||||||
|
|
||||||
## Basics of Federated Identity
|
## Basics of Federated Identity
|
||||||
|
|
||||||
@@ -28,12 +28,12 @@ So what do we want to achieve with delegated authentication?
|
|||||||
|
|
||||||
- Instead of implementing authentication on each server and trusting each server
|
- Instead of implementing authentication on each server and trusting each server
|
||||||
|
|
||||||
- Users only **authenticate** with a trusted server (ie. ZITADEL), that validates the user’s identity through a challenge (eg, multiple authentication factors) and issues an **ID token** (OpenID Connect 1.x)
|
- Users only **authenticate** with a trusted server (i.e. ZITADEL), that validates the user’s identity through a challenge (eg, multiple authentication factors) and issues an **ID token** (OpenID Connect 1.x)
|
||||||
- Applications have means of **validating the integrity** of presented access and ID tokens
|
- Applications have means of **validating the integrity** of presented access and ID tokens
|
||||||
|
|
||||||
- Instead of sending around the user’s credentials
|
- Instead of sending around the user’s credentials
|
||||||
- Clients may access protected resources with an **access token** that is only valid for specific scope and limited lifetime (OAuth 2.x)
|
- Clients may access protected resources with an **access token** that is only valid for specific scope and limited lifetime (OAuth 2.x)
|
||||||
- Users have to **authorize** applications to access certain [**scopes**](/apis/openidoauth/scopes) (eg, email address or custom roles). Applications can request [**claims**](/apis/openidoauth/claims) (key:value pairs, eg email address) for the authorized scopes with the access token or ID token from ZITADEL
|
- Users have to **authorize** applications to access certain [**scopes**](/apis/openidoauth/scopes) (eg, email address or custom roles). Applications can request [**claims**](/apis/openidoauth/claims) (key:value pairs, e.g. email address) for the authorized scopes with the access token or ID token from ZITADEL
|
||||||
- Access tokens are bearer tokens, meaning that possession of the token provides access to a resource. But the tokens expire frequently and the application must request a new access token via **refresh token** or the user must reauthenticate
|
- Access tokens are bearer tokens, meaning that possession of the token provides access to a resource. But the tokens expire frequently and the application must request a new access token via **refresh token** or the user must reauthenticate
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -26,7 +26,7 @@ ZITADEL implements the [RFC7517 - JSON Web Key (JWK)](https://www.rfc-editor.org
|
|||||||
Web keys in ZITADEL support a number of [JSON Web Algorithms (JWA)](https://www.rfc-editor.org/rfc/rfc7518) for digital signatures:
|
Web keys in ZITADEL support a number of [JSON Web Algorithms (JWA)](https://www.rfc-editor.org/rfc/rfc7518) for digital signatures:
|
||||||
|
|
||||||
| Identifier | Description |
|
| Identifier | Description |
|
||||||
| ---------- | ------------------------------- |
|
|------------|---------------------------------|
|
||||||
| RS256 | RSASSA-PKCS1-v1_5 using SHA-256 |
|
| RS256 | RSASSA-PKCS1-v1_5 using SHA-256 |
|
||||||
| RS384 | RSASSA-PKCS1-v1_5 using SHA-384 |
|
| RS384 | RSASSA-PKCS1-v1_5 using SHA-384 |
|
||||||
| RS512 | RSASSA-PKCS1-v1_5 using SHA-512 |
|
| RS512 | RSASSA-PKCS1-v1_5 using SHA-512 |
|
||||||
@@ -73,7 +73,7 @@ Since the decision in the proposal isn't published yet,
|
|||||||
there is a big change some OIDC client libraries don't have proper support for EdDSA / ed25519.
|
there is a big change some OIDC client libraries don't have proper support for EdDSA / ed25519.
|
||||||
|
|
||||||
The ZITADEL back-end is written in Go. The Go developers have denied ed448 curve implementations to be included.
|
The ZITADEL back-end is written in Go. The Go developers have denied ed448 curve implementations to be included.
|
||||||
Therefore ZITADEL only uses ed25519 with a SHA512.
|
Therefore, ZITADEL only uses ed25519 with a SHA512.
|
||||||
The same counts for [zitadel/oidc](https://github.com/zitadel/oidc) Go library.
|
The same counts for [zitadel/oidc](https://github.com/zitadel/oidc) Go library.
|
||||||
|
|
||||||
## Web Key management
|
## Web Key management
|
||||||
@@ -127,7 +127,7 @@ The RSA generator config takes two enum values.
|
|||||||
- `RSA_HASHER_SHA384` results in the RS384 algorithm header.
|
- `RSA_HASHER_SHA384` results in the RS384 algorithm header.
|
||||||
- `RSA_HASHER_SHA512` results in the RS512 algorithm header.
|
- `RSA_HASHER_SHA512` results in the RS512 algorithm header.
|
||||||
|
|
||||||
For example, to create a RSA web key with the size of 3072 bits and the SHA512 algorithm (RS512):
|
For example, to create an RSA web key with the size of 3072 bits and the SHA512 algorithm (RS512):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
|
curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
|
||||||
@@ -175,7 +175,7 @@ Note that the `alg` header for ed25519 is `EdDSA` and refers to both ed25519 and
|
|||||||
Both curves specify different hashers.
|
Both curves specify different hashers.
|
||||||
Clients which support both curves must inspect `crv` header value to assert the difference.
|
Clients which support both curves must inspect `crv` header value to assert the difference.
|
||||||
|
|
||||||
For example, to create a ed25519 web key:
|
For example, to create an ed25519 web key:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
|
curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
|
||||||
@@ -188,7 +188,7 @@ curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
|
|||||||
```
|
```
|
||||||
|
|
||||||
[^2]: The ZITADEL back-end is written in Go. The Go developers have denied ed448 curve implementations to be included.
|
[^2]: The ZITADEL back-end is written in Go. The Go developers have denied ed448 curve implementations to be included.
|
||||||
Therefore ZITADEL won't support this either.
|
Therefore, ZITADEL won't support this either.
|
||||||
|
|
||||||
### Activation
|
### Activation
|
||||||
|
|
||||||
@@ -198,7 +198,7 @@ There can be only one active key on an instance.
|
|||||||
Activating a key implies deactivation of the previously active key.
|
Activating a key implies deactivation of the previously active key.
|
||||||
|
|
||||||
Public keys on the [JWKS](#json-web-key-set) endpoint may be [cached](#caching).
|
Public keys on the [JWKS](#json-web-key-set) endpoint may be [cached](#caching).
|
||||||
Therefore it is advised to delay activation after generating a key,
|
Therefore, it is advised to delay activation after generating a key,
|
||||||
at least for the duration of the max-age setting plus any time it might take for client applications to refresh.
|
at least for the duration of the max-age setting plus any time it might take for client applications to refresh.
|
||||||
|
|
||||||
### Deletion
|
### Deletion
|
||||||
@@ -207,8 +207,8 @@ Non-active keys may be [deleted](/apis/resources/webkey_service_v2/zitadel-webke
|
|||||||
Deletion also means tokens signed with this key become invalid.
|
Deletion also means tokens signed with this key become invalid.
|
||||||
Active keys can't be deleted.
|
Active keys can't be deleted.
|
||||||
As each public key is available on the [JWKS](#json-web-key-set) endpoint,
|
As each public key is available on the [JWKS](#json-web-key-set) endpoint,
|
||||||
it is important to cleanup old web keys that are no longer needed.
|
it is important to clean up old web keys that are no longer needed.
|
||||||
Otherwise the endpoint's response size will only grow over time, which might lead to performance issues.
|
Otherwise, the endpoint's response size will only grow over time, which might lead to performance issues.
|
||||||
|
|
||||||
Once a key was activated and deactivated (by activation of the next key) deletion should wait:
|
Once a key was activated and deactivated (by activation of the next key) deletion should wait:
|
||||||
|
|
||||||
@@ -224,16 +224,16 @@ This strategy aims to fulfill the following requirements:
|
|||||||
1. Web keys are rotated monthly.
|
1. Web keys are rotated monthly.
|
||||||
2. Applications have enough time to see the next activated web key on the [JWKS](#json-web-key-set) endpoint.
|
2. Applications have enough time to see the next activated web key on the [JWKS](#json-web-key-set) endpoint.
|
||||||
3. Web keys are kept long enough to cover the access and ID token validity of 24 hours.
|
3. Web keys are kept long enough to cover the access and ID token validity of 24 hours.
|
||||||
4. Web keys are kept long enough to to allow usage of the `id_token_hint` for at least 3 months.
|
4. Web keys are kept long enough to allow usage of the `id_token_hint` for at least 3 months.
|
||||||
Users that haven't logged in / refreshed tokens with the client application for that period,
|
Users that haven't logged in / refreshed tokens with the client application for that period,
|
||||||
will need to re-enter their username.
|
will need to re-enter their username.
|
||||||
|
|
||||||
When the instance was created, resp. the feature was rolled out, the instance got two keys with the first one activated. When this feature becomes generally available, instance creation will setup the first two keys in the same way. So the initial state always looks like this:
|
When the instance was created, resp. the feature was rolled out, the instance got two keys with the first one activated. When this feature becomes generally available, instance creation will set up the first two keys in the same way. So the initial state always looks like this:
|
||||||
|
|
||||||
| id | created | changed | state |
|
| id | created | changed | state |
|
||||||
| --- | ---------- | ---------- | --------------- |
|
|----|------------|------------|-----------------|
|
||||||
| 1 | 2025-01-01 | 2025-01-01 | `STATE_ACTIVE` |
|
| 1 | 2025-01-01 | 2025-01-01 | `STATE_ACTIVE` |
|
||||||
| 2 | 2025-01-01 | 2025-01-01 | `STATE_INITIAL` |
|
| 2 | 2025-01-01 | 2025-01-01 | `STATE_INITIAL` |
|
||||||
|
|
||||||
For the sake of this example we will use simplified IDs and restrict timestamps to dates.
|
For the sake of this example we will use simplified IDs and restrict timestamps to dates.
|
||||||
|
|
||||||
@@ -253,24 +253,24 @@ curl -L 'https://${CUSTOM_DOMAIN}/v2/web_keys' \
|
|||||||
|
|
||||||
Key ID 2 became active, Key ID 1 became inactive and a new key with ID 3 was created:
|
Key ID 2 became active, Key ID 1 became inactive and a new key with ID 3 was created:
|
||||||
|
|
||||||
| id | created | changed | state |
|
| id | created | changed | state |
|
||||||
| --- | ---------- | ---------- | ---------------- |
|
|----|------------|------------|------------------|
|
||||||
| 1 | 2025-01-01 | 2025-02-01 | `STATE_INACTIVE` |
|
| 1 | 2025-01-01 | 2025-02-01 | `STATE_INACTIVE` |
|
||||||
| 2 | 2025-01-01 | 2025-02-01 | `STATE_ACTIVE` |
|
| 2 | 2025-01-01 | 2025-02-01 | `STATE_ACTIVE` |
|
||||||
| 3 | 2025-02-01 | 2025-02-01 | `STATE_INITIAL` |
|
| 3 | 2025-02-01 | 2025-02-01 | `STATE_INITIAL` |
|
||||||
|
|
||||||
No keys are deleted yet.
|
No keys are deleted yet.
|
||||||
We continue like this monthly.
|
We continue like this monthly.
|
||||||
At one point (on 2025-05-01) we will have a web key with `STATE_INACTIVE` with a changed date of 3 months ago:
|
At one point (on 2025-05-01) we will have a web key with `STATE_INACTIVE` with a changed date of 3 months ago:
|
||||||
|
|
||||||
| id | created | changed | state |
|
| id | created | changed | state |
|
||||||
| --- | ---------- | ---------- | ---------------- |
|
|----|------------|------------|------------------|
|
||||||
| 1 | 2025-01-01 | 2025-02-01 | `STATE_INACTIVE` |
|
| 1 | 2025-01-01 | 2025-02-01 | `STATE_INACTIVE` |
|
||||||
| 2 | 2025-01-01 | 2025-03-01 | `STATE_INACTIVE` |
|
| 2 | 2025-01-01 | 2025-03-01 | `STATE_INACTIVE` |
|
||||||
| 3 | 2025-02-01 | 2025-04-01 | `STATE_INACTIVE` |
|
| 3 | 2025-02-01 | 2025-04-01 | `STATE_INACTIVE` |
|
||||||
| 4 | 2025-03-01 | 2025-05-01 | `STATE_INACTIVE` |
|
| 4 | 2025-03-01 | 2025-05-01 | `STATE_INACTIVE` |
|
||||||
| 5 | 2025-04-01 | 2025-05-01 | `STATE_ACTIVE` |
|
| 5 | 2025-04-01 | 2025-05-01 | `STATE_ACTIVE` |
|
||||||
| 6 | 2025-05-01 | 2025-05-01 | `STATE_INITIAL` |
|
| 6 | 2025-05-01 | 2025-05-01 | `STATE_INITIAL` |
|
||||||
|
|
||||||
In addition to the activate and create calls we made on this iteration,
|
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:
|
we can now safely delete the oldest key, as both requirement 3 and 4 are now fulfilled:
|
||||||
@@ -283,15 +283,15 @@ curl -L -X DELETE 'https://${CUSTOM_DOMAIN}/v2/web_keys/1' \
|
|||||||
|
|
||||||
The final state:
|
The final state:
|
||||||
|
|
||||||
| id | created | changed | state |
|
| id | created | changed | state |
|
||||||
| --- | ---------- | ---------- | ---------------- |
|
|----|------------|------------|------------------|
|
||||||
| 2 | 2025-01-01 | 2025-03-01 | `STATE_INACTIVE` |
|
| 2 | 2025-01-01 | 2025-03-01 | `STATE_INACTIVE` |
|
||||||
| 3 | 2025-02-01 | 2025-04-01 | `STATE_INACTIVE` |
|
| 3 | 2025-02-01 | 2025-04-01 | `STATE_INACTIVE` |
|
||||||
| 4 | 2025-03-01 | 2025-05-01 | `STATE_INACTIVE` |
|
| 4 | 2025-03-01 | 2025-05-01 | `STATE_INACTIVE` |
|
||||||
| 5 | 2025-04-01 | 2025-05-01 | `STATE_ACTIVE` |
|
| 5 | 2025-04-01 | 2025-05-01 | `STATE_ACTIVE` |
|
||||||
| 6 | 2025-05-01 | 2025-05-01 | `STATE_INITIAL` |
|
| 6 | 2025-05-01 | 2025-05-01 | `STATE_INITIAL` |
|
||||||
|
|
||||||
Next month, Key ID 6 will be activated, an new key added and Key ID 2 can be deleted.
|
Next month, Key ID 6 will be activated, a new key added and Key ID 2 can be deleted.
|
||||||
|
|
||||||
## JSON web key set
|
## JSON web key set
|
||||||
|
|
||||||
@@ -340,7 +340,7 @@ The legacy keys will disappear once they expire.
|
|||||||
As web keys can be created and distributed ahead of time, it is safe for JWKS responses to be cached at intermediate proxies.
|
As web keys can be created and distributed ahead of time, it is safe for JWKS responses to be cached at intermediate proxies.
|
||||||
Once the `web_key` feature is enabled, ZITADEL will send a `Cache-Control` header which allows caching.
|
Once the `web_key` feature is enabled, ZITADEL will send a `Cache-Control` header which allows caching.
|
||||||
|
|
||||||
By default and in ZITADEL Cloud we allow 5 minutes of caching:
|
By default, and in ZITADEL, Cloud we allow 5 minutes of caching:
|
||||||
|
|
||||||
```
|
```
|
||||||
Cache-Control: max-age=300, must-revalidate
|
Cache-Control: max-age=300, must-revalidate
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
Per default the login ui of the default organization is shown.
|
Per default the login ui of the default organization is shown.
|
||||||
To allow users of a specific organization to register with their IDP (e.g Entra ID) you have two options.
|
To allow users of a specific organization to register with their IDP (e.g. Entra ID) you have two options.
|
||||||
|
|
||||||
1. Identify organization with organization scope
|
1. Identify organization with organization scope
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ It is an alternative to the [private key JWT](./private-key-jwt) and [client cre
|
|||||||
|
|
||||||
1. Navigate to Service Users
|
1. Navigate to Service Users
|
||||||
2. Click on **New**
|
2. Click on **New**
|
||||||
3. Enter a user name and a display name
|
3. Enter a username and a display name
|
||||||
4. Click on the Personal Access Token menu point in the detail of your user
|
4. Click on the Personal Access Token menu point in the detail of your user
|
||||||
5. Click on **New**
|
5. Click on **New**
|
||||||
6. You can either set an expiration date or leave it empty if you don't want it to expire
|
6. You can either set an expiration date or leave it empty if you don't want it to expire
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ Add members to your policy.
|
|||||||
|
|
||||||
Now you should be all set to verify your setup:
|
Now you should be all set to verify your setup:
|
||||||
|
|
||||||
- Create an user in ZITADEL with the same email address as a member in your authentication policy.
|
- Create a user in ZITADEL with the same email address as a member in your authentication policy.
|
||||||
- In a new browser session go to https://id.atlassian.com
|
- In a new browser session go to https://id.atlassian.com
|
||||||
- Enter the user's email address
|
- Enter the user's email address
|
||||||
- You should be redirected to ZITADEL's Login screen
|
- You should be redirected to ZITADEL's Login screen
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ Prerequisites:
|
|||||||
- existing ZITADEL project, if not present follow the first 3 steps [here](/guides/manage/console/projects-overview)
|
- existing ZITADEL project, if not present follow the first 3 steps [here](/guides/manage/console/projects-overview)
|
||||||
- existing Auth0 tenant as described [here](https://auth0.com/docs/get-started/auth0-overview/create-tenants)
|
- existing Auth0 tenant as described [here](https://auth0.com/docs/get-started/auth0-overview/create-tenants)
|
||||||
|
|
||||||
> We have to switch between ZITADEL and a Auth0. If the headings begin with "ZITADEL" switch to the ZITADEL Management Console and if the headings start with "Auth0" please switch to the Auth0 GUI.
|
> We have to switch between ZITADEL and Auth0. If the headings begin with "ZITADEL" switch to the ZITADEL Management Console and if the headings start with "Auth0" please switch to the Auth0 GUI.
|
||||||
|
|
||||||
## **Auth0**: Create a new connection
|
## **Auth0**: Create a new connection
|
||||||
|
|
||||||
@@ -45,8 +45,8 @@ First of all we create the application in your project.
|
|||||||
|
|
||||||
## **Auth0**: Connect ZITADEL
|
## **Auth0**: Connect ZITADEL
|
||||||
|
|
||||||
1. Copy the client id from ZITADEL and past it into the **Client ID** field
|
1. Copy the client id from ZITADEL and paste it into the **Client ID** field
|
||||||
2. Copy the client secret from ZITADEL and past it into the **Client Secret** field
|
2. Copy the client secret from ZITADEL and paste it into the **Client Secret** field
|
||||||

|

|
||||||
3. click Create
|
3. click Create
|
||||||
4. To verify the connection go to the "Applications" tab and enable the Default App
|
4. To verify the connection go to the "Applications" tab and enable the Default App
|
||||||
@@ -54,6 +54,6 @@ First of all we create the application in your project.
|
|||||||
5. Click "Back to OpenID Connect"
|
5. Click "Back to OpenID Connect"
|
||||||
6. Click on the "..." button right to the newly created connection and click "Try"
|
6. Click on the "..." button right to the newly created connection and click "Try"
|
||||||

|

|
||||||
7. ZITADEL should open on a new tab and you can enter your login information
|
7. ZITADEL should open on a new tab, and you can enter your login information
|
||||||
8. After you logged in you should see the following:
|
8. After you logged in you should see the following:
|
||||||

|

|
||||||
|
|||||||
@@ -17,7 +17,7 @@ Prerequisites:
|
|||||||
- existing ZITADEL project, if not present follow the first 3 steps [here](/guides/manage/console/projects-overview)
|
- existing ZITADEL project, if not present follow the first 3 steps [here](/guides/manage/console/projects-overview)
|
||||||
- existing Auth0 tenant as described [here](https://auth0.com/docs/get-started/auth0-overview/create-tenants)
|
- existing Auth0 tenant as described [here](https://auth0.com/docs/get-started/auth0-overview/create-tenants)
|
||||||
|
|
||||||
> We have to switch between ZITADEL and a Auth0. If the headings begin with "ZITADEL" switch to the ZITADEL Management Console and
|
> We have to switch between ZITADEL and Auth0. If the headings begin with "ZITADEL" switch to the ZITADEL Management Console and
|
||||||
> if the headings start with "Auth0" please switch to the Auth0 GUI.
|
> if the headings start with "Auth0" please switch to the Auth0 GUI.
|
||||||
|
|
||||||
## **Auth0**: Create a new connection
|
## **Auth0**: Create a new connection
|
||||||
@@ -70,7 +70,7 @@ Everything on the side of ZITADEL is done if the application is correctly create
|
|||||||
|
|
||||||
## **Auth0**: Try the connection
|
## **Auth0**: Try the connection
|
||||||
|
|
||||||
To then test the connection you only have to press "Try" on the created connection in the Authentication -> Enterprise
|
To then test the connection you only have to press "Try" on the created connection in the Authentication → Enterprise
|
||||||
screen.
|
screen.
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -18,7 +18,7 @@ Prerequisites:
|
|||||||
- prerequisites on AWS side [here](https://docs.aws.amazon.com/singlesignon/latest/userguide/prereqs.html).
|
- prerequisites on AWS side [here](https://docs.aws.amazon.com/singlesignon/latest/userguide/prereqs.html).
|
||||||
- enabled AWS SSO [here](https://docs.aws.amazon.com/singlesignon/latest/userguide/step1.html?icmpid=docs_sso_console)
|
- enabled AWS SSO [here](https://docs.aws.amazon.com/singlesignon/latest/userguide/step1.html?icmpid=docs_sso_console)
|
||||||
|
|
||||||
> We have to switch between ZITADEL and a AWS. If the headings begin with "ZITADEL" switch to the ZITADEL Management Console and if
|
> We have to switch between ZITADEL and AWS. If the headings begin with "ZITADEL" switch to the ZITADEL Management Console and if
|
||||||
> the headings start with "AWS" please switch to the AWS GUI.
|
> the headings start with "AWS" please switch to the AWS GUI.
|
||||||
|
|
||||||
## **AWS**: Change to external identity provider ZITADEL
|
## **AWS**: Change to external identity provider ZITADEL
|
||||||
@@ -33,7 +33,7 @@ can connect to ZITADEL as a SAML2 IDP.
|
|||||||

|

|
||||||
|
|
||||||
2. Download the metadata file, to provide ZITADEL with all the information it needs, and save the AWS SSO Sign-in URL,
|
2. Download the metadata file, to provide ZITADEL with all the information it needs, and save the AWS SSO Sign-in URL,
|
||||||
which you use to login afterwards.
|
which you use to log in afterward.
|
||||||
|
|
||||||
3. Fill out the fields as follows, to provide AWS with all the information it needs:
|
3. Fill out the fields as follows, to provide AWS with all the information it needs:
|
||||||

|

|
||||||
@@ -75,5 +75,5 @@ Everything on the side of ZITADEL is done if the application is correctly create
|
|||||||
|
|
||||||
## **AWS**: Test the connection
|
## **AWS**: Test the connection
|
||||||
|
|
||||||
The result, you can now login to you AWS account through your ZITADEL-login with the AWS SSO Sign-in URL, which you
|
The result, you can now log in to you AWS account through your ZITADEL-login with the AWS SSO Sign-in URL, which you
|
||||||
should have saved in "Change to external identity provider ZITADEL" step 2.
|
should have saved in "Change to external identity provider ZITADEL" step 2.
|
||||||
|
|||||||
@@ -26,11 +26,11 @@ Follow [this guide](https://docs.gitlab.com/ee/administration/auth/oidc.html) of
|
|||||||
|
|
||||||
Replace the values of the following fields:
|
Replace the values of the following fields:
|
||||||
|
|
||||||
- `args.client_options.identifier` with the `ClientId` generated by ZITADEL in the last step of [Create application in ZITADEL])()
|
- `args.client_options.identifier` with the `ClientId` generated by ZITADEL
|
||||||
- `args.client_options.secret` with the `ClientSecret` generated by ZITADEL in the last step of [Create application in ZITADEL])()
|
- `args.client_options.secret` with the `ClientSecret` generated by ZITADEL
|
||||||
- `args.client_options.redirect_uri` with the proper URL to your gitlab instance and callback
|
- `args.client_options.redirect_uri` with the proper URL to your gitlab instance and callback
|
||||||
|
|
||||||
```yaml
|
```ruby
|
||||||
gitlab_rails['omniauth_providers'] = [
|
gitlab_rails['omniauth_providers'] = [
|
||||||
{
|
{
|
||||||
name: "openid_connect",
|
name: "openid_connect",
|
||||||
|
|||||||
@@ -23,8 +23,7 @@ Prerequisites:
|
|||||||
|
|
||||||
## **Ping**: Create a new external identity provider
|
## **Ping**: Create a new external identity provider
|
||||||
|
|
||||||
To add an
|
To add an [external identity provider](https://docs.pingidentity.com/bundle/pingone/page/jvz1567784210191.html), you
|
||||||
additional [external identity provider](https://docs.pingidentity.com/bundle/pingone/page/jvz1567784210191.html), you
|
|
||||||
can follow the instructions [here](https://docs.pingidentity.com/bundle/pingone/page/ovy1567784211297.html)
|
can follow the instructions [here](https://docs.pingidentity.com/bundle/pingone/page/ovy1567784211297.html)
|
||||||
|
|
||||||
1. As described you have to create a new provider, with a unique identifier:
|
1. As described you have to create a new provider, with a unique identifier:
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ This integration guide shows you the basic OpenID Connect integration with ZITAD
|
|||||||
|
|
||||||
## Setup PKCE client in ZITADEL
|
## Setup PKCE client in ZITADEL
|
||||||
|
|
||||||
- Go to your organization and setup a new application with the type PKCE
|
- Go to your organization and set up a new application with the type PKCE
|
||||||
- When created go to the "Redirect Settings" and *enable Development Mode*
|
- When created go to the "Redirect Settings" and *enable Development Mode*
|
||||||
- Add the Redirect Uri, f.e. `http://localhost:8080/secure/callback`
|
- Add the Redirect Uri, f.e. `http://localhost:8080/secure/callback`
|
||||||
- Add the Post Logout Uri, f.e. `http://localhost:8080/index.html`
|
- Add the Post Logout Uri, f.e. `http://localhost:8080/index.html`
|
||||||
@@ -38,14 +38,14 @@ OIDCPKCEMethod S256
|
|||||||
|
|
||||||
With the following parameters
|
With the following parameters
|
||||||
|
|
||||||
| Parameter | Description | Example value|
|
| Parameter | Description | Example value |
|
||||||
|---|---|---|
|
|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------|
|
||||||
| OIDCProviderMetadataURL | Is the url to the discovery endpoint | `https://${CUSTOM_DOMAIN}/.well-known/openid-configuration` |
|
| OIDCProviderMetadataURL | Is the url to the discovery endpoint | `https://${CUSTOM_DOMAIN}/.well-known/openid-configuration` |
|
||||||
| OIDCClientID | Is the ID of the zitadel application. You can find it on the settings page of the application. | 123456789123@apache_test |
|
| OIDCClientID | Is the ID of the zitadel application. You can find it on the settings page of the application. | 123456789123@apache_test |
|
||||||
| OIDCRedirectURI | Users will be redirected to this page after successful login. If you are using localhost or any other non-https endpoint, make sure to enable development mode in ZITADEL. | https://mysecureapp.io/secure/callback |
|
| OIDCRedirectURI | Users will be redirected to this page after successful login. If you are using localhost or any other non-https endpoint, make sure to enable development mode in ZITADEL. | https://mysecureapp.io/secure/callback |
|
||||||
| OIDCCryptoPassphrase | Create a secure passphrase. Consult the module's documentation for more details. | ... |
|
| OIDCCryptoPassphrase | Create a secure passphrase. Consult the module's documentation for more details. | ... |
|
||||||
| OIDCScope | OpenID Connect scopes that should be included. You can find a list of [all scopes](/apis/openidoauth/scopes) in our documentation. | "openid profile" |
|
| OIDCScope | OpenID Connect scopes that should be included. You can find a list of [all scopes](/apis/openidoauth/scopes) in our documentation. | "openid profile" |
|
||||||
| OIDCPKCEMethod | The method should be set to `S256` | S256 |
|
| OIDCPKCEMethod | The method should be set to `S256` | S256 |
|
||||||
|
|
||||||
### Secure a route
|
### Secure a route
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ In a second step fill out your user data like First-, Last- and Team-name.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
If you did start with your email instead of a social login (e.g Google) you have to fill a password for your authentication.
|
If you did start with your email instead of a social login (e.g. Google) you have to fill a password for your authentication.
|
||||||
In that case you will get an initialization mail to verify your account.
|
In that case you will get an initialization mail to verify your account.
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -18,9 +18,9 @@ You can specify a timeout and whether the action is allowed to fail too.
|
|||||||
<img src="/docs/img/guides/console/action.png" alt="Create Action" width="450px" />
|
<img src="/docs/img/guides/console/action.png" alt="Create Action" width="450px" />
|
||||||
|
|
||||||
To run those scripts, a flow with a trigger has to be created.
|
To run those scripts, a flow with a trigger has to be created.
|
||||||
This could for example be a **External Authentication** Flow, with a **Post Authentication** trigger.
|
This could for example be an **External Authentication** Flow, with a **Post Authentication** trigger.
|
||||||
|
|
||||||
<img src="/docs/img/guides/console/flow.png" alt="Flow" width="400px" />
|
<img src="/docs/img/guides/console/flow.png" alt="Flow" width="400px" />
|
||||||
|
|
||||||
Now whenever a user gets authenticated externally with an IDP, a action is triggered after the authentication itself.
|
Now whenever a user gets authenticated externally with an IDP, an action is triggered after the authentication itself.
|
||||||
If you want to know more where actions can be useful, take a look at the feature [here](/concepts/features/actions) or directly jump to an example of a custom behavior [here](/guides/manage/customize/behavior).
|
If you want to know more where actions can be useful, take a look at the feature [here](/concepts/features/actions) or directly jump to an example of a custom behavior [here](/guides/manage/customize/behavior).
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ In the right part of the management console you can find **ADMINISTRATORS** in t
|
|||||||
## Roles
|
## Roles
|
||||||
|
|
||||||
| Name | Role | Description |
|
| Name | Role | Description |
|
||||||
| ----------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------ |
|
|-------------------------------|-------------------------------|--------------------------------------------------------------------------------------------------------------|
|
||||||
| Instance Owner | IAM_OWNER | Manage the Instance, manage all organizations with their content |
|
| Instance Owner | IAM_OWNER | Manage the Instance, manage all organizations with their content |
|
||||||
| Instance Owner Viewer | IAM_OWNER_VIEWER | View the Instance and view all organizations with their content |
|
| Instance Owner Viewer | IAM_OWNER_VIEWER | View the Instance and view all organizations with their content |
|
||||||
| Instance Org Manager | IAM_ORG_MANAGER | Manage all organizations including their policies, projects and users |
|
| Instance Org Manager | IAM_ORG_MANAGER | Manage all organizations including their policies, projects and users |
|
||||||
|
|||||||
@@ -266,7 +266,7 @@ If an account is locked, the administrator has to unlock it in the ZITADEL Manag
|
|||||||
|
|
||||||
### Add organization domain as suffix to loginnames
|
### Add organization domain as suffix to loginnames
|
||||||
|
|
||||||
If you enable this setting, all loginnames will be suffixed with the organization domain. If this settings is disabled, you have to ensure that usernames are unique over all organizations.
|
If you enable this setting, all loginnames will be suffixed with the organization domain. If this setting is disabled, you have to ensure that usernames are unique over all organizations.
|
||||||
|
|
||||||
### Validate Org domains
|
### Validate Org domains
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ Depending on your use case, multiple organizations can be created (B2B) or you c
|
|||||||
width="400px"
|
width="400px"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
If your new to management console, you'll probably want to set some settings initially. Continue reading Default settings on the next page.
|
If you're new to management console, you'll probably want to set some settings initially. Continue reading Default settings on the next page.
|
||||||
|
|
||||||
## Prevent management console access
|
## Prevent management console access
|
||||||
|
|
||||||
|
|||||||
@@ -16,17 +16,17 @@ Before you start, make sure you have everything set up correctly.
|
|||||||
## Copy some information for the action
|
## Copy some information for the action
|
||||||
|
|
||||||
1. Select the **Projects** navigation item.
|
1. Select the **Projects** navigation item.
|
||||||
1. Select a project that has a role configured.
|
2. Select a project that has a role configured.
|
||||||
1. Copy the projects **Resource Id** on the screens top right.
|
3. Copy the projects **Resource ID** on the screens top right.
|
||||||
1. Scroll to the **ROLES** section and note some roles key.
|
4. Scroll to the **ROLES** section and note some roles key.
|
||||||
|
|
||||||
## Create the action
|
## Create the action
|
||||||
|
|
||||||
1. Select the **Actions** navigation item.
|
1. Select the **Actions** navigation item.
|
||||||
1. In the **Actions <i className="las la-code"></i>** section, select the **+ New** button.
|
2. In the **Actions <i className="las la-code"></i>** section, select the **+ New** button.
|
||||||
1. Give the new action the name `addGrant`.
|
3. Give the new action the name `addGrant`.
|
||||||
1. Paste this snippet into the multiline textfield.
|
4. Paste this snippet into the multiline text-field.
|
||||||
1. Replace the snippets placeholders and select **Save**.
|
5. Replace the snippets placeholders and select **Save**.
|
||||||
|
|
||||||
```js reference
|
```js reference
|
||||||
https://github.com/zitadel/actions/blob/main/examples/add_user_grant.js
|
https://github.com/zitadel/actions/blob/main/examples/add_user_grant.js
|
||||||
@@ -37,10 +37,10 @@ https://github.com/zitadel/actions/blob/main/examples/add_user_grant.js
|
|||||||
Now, make the action hook into the [external authentication flow](/apis/actions/external-authentication).
|
Now, make the action hook into the [external authentication flow](/apis/actions/external-authentication).
|
||||||
|
|
||||||
1. In the **Flows <i className="las la-exchange-alt"></i>** section, select the **+ New** button.
|
1. In the **Flows <i className="las la-exchange-alt"></i>** section, select the **+ New** button.
|
||||||
1. Select the **Flow Type** _External Authentication_.
|
2. Select the **Flow Type** _External Authentication_.
|
||||||
1. Select the **Trigger Type** _Post Creation_.
|
3. Select the **Trigger Type** _Post Creation_.
|
||||||
1. In the **Actions** dropdown, check _addGrant_.
|
4. In the **Actions** dropdown, check _addGrant_.
|
||||||
1. Select the **Save** button.
|
5. Select the **Save** button.
|
||||||
|
|
||||||
New users automatically are assigned a role now if they register by authenticating with an external identity provider.
|
New users automatically are assigned a role now if they register by authenticating with an external identity provider.
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ The best way is to upload a ttf file after a successful upload you will see it i
|
|||||||
|
|
||||||
### Advanced Settings
|
### Advanced Settings
|
||||||
|
|
||||||
In the advanced behavior you can choose if the loginname suffix (domain e.g [email protected]) should be shown in the loginname screen or not and if the “ZITADEL watermark” should be hidden.
|
In the advanced behavior you can choose if the loginname suffix (domain e.g. [email protected]) should be shown in the loginname screen or not and if the “ZITADEL watermark” should be hidden.
|
||||||
|
|
||||||
## Trigger the private labeling for the login
|
## Trigger the private labeling for the login
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ If you like to trigger your settings for your applications you have different po
|
|||||||
### 1. Primary Domain Scope
|
### 1. Primary Domain Scope
|
||||||
|
|
||||||
Send a [reserved scope](/apis/openidoauth/scopes) with your [authorization request](../../integrate/login/oidc/login-users) to trigger your organization.
|
Send a [reserved scope](/apis/openidoauth/scopes) with your [authorization request](../../integrate/login/oidc/login-users) to trigger your organization.
|
||||||
The primary domain scope will restrict the login to your organization, so only users of your own organization will be able to login.
|
The primary domain scope will restrict the login to your organization, so only users of your own organization will be able to log in.
|
||||||
|
|
||||||
You can use our [OpenID Authentication Request Playground](https://zitadel.com/playgrounds/oidc) to learn more about how to trigger an [organization's policies and branding](https://zitadel.com/playgrounds/oidc#organization-policies-and-branding).
|
You can use our [OpenID Authentication Request Playground](https://zitadel.com/playgrounds/oidc) to learn more about how to trigger an [organization's policies and branding](https://zitadel.com/playgrounds/oidc#organization-policies-and-branding).
|
||||||
|
|
||||||
|
|||||||
@@ -6,13 +6,13 @@ You are able to customize the texts used from ZITADEL. This is possibly on the i
|
|||||||
|
|
||||||
## Message Texts
|
## Message Texts
|
||||||
|
|
||||||
Sometimes the users will get an email or phone message from ZITADEL (e.g Password Reset Request).
|
Sometimes the users will get an email or phone message from ZITADEL (e.g. Password Reset Request).
|
||||||
ZITADEL already has some good standard texts, but maybe you would like to customize it for your organization.
|
ZITADEL already has some good standard texts, but maybe you would like to customize it for your organization.
|
||||||
|
|
||||||
Go to the message text policy on your organization and you will find the different kinds of messages that are sent from ZITADEL.
|
Go to the message text policy on your organization, and you will find the different kinds of messages that are sent from ZITADEL.
|
||||||
Choose the template and the language you like to edit.
|
Choose the template and the language you like to edit.
|
||||||
You can now change all the texts from a message.
|
You can now change all the texts from a message.
|
||||||
As soon as you click into a input field you will see some attribute chips below the field.
|
As soon as you click into an input field you will see some attribute chips below the field.
|
||||||
These are the parameters you can include on this specific message.
|
These are the parameters you can include on this specific message.
|
||||||
|
|
||||||

|

|
||||||
@@ -21,7 +21,7 @@ These are the parameters you can include on this specific message.
|
|||||||
|
|
||||||
Like the message texts you are also able to change the texts on the login interface.
|
Like the message texts you are also able to change the texts on the login interface.
|
||||||
First choose the screen and the language you like to edit.
|
First choose the screen and the language you like to edit.
|
||||||
You will see the default texts in the input field and you can overwrite them by typing into the box.
|
You will see the default texts in the input field, and you can overwrite them by typing into the box.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
If you choose to run a local instance have a look at our [deploy](/self-hosting/deploy/overview) section, where we show you different possibilities on how to run ZITADEL.
|
If you choose to run a local instance have a look at our [deploy-section](/self-hosting/deploy/overview), where we show you different possibilities on how to run ZITADEL.
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ Recertification of a unit, to be covered under Support Services, is required for
|
|||||||
* units that run a release that is older than 180 days from the products most recent stable release
|
* units that run a release that is older than 180 days from the products most recent stable release
|
||||||
* requests for support on products and services purchased or supported from non-authorized resellers
|
* requests for support on products and services purchased or supported from non-authorized resellers
|
||||||
|
|
||||||
Recertification of a unit requires payment of a Recertification Fee which results in a checkup of the unit by ZITADEL. The unit will be inspected to asses its condition and eligibility for service coverage.
|
Recertification of a unit requires payment of a Recertification Fee which results in a checkup of the unit by ZITADEL. The unit will be inspected to assess its condition and eligibility for service coverage.
|
||||||
|
|
||||||
Please contact us for current fees.
|
Please contact us for current fees.
|
||||||
|
|
||||||
|
|||||||
@@ -235,26 +235,26 @@ Any notices shall be delivered to a Party in accordance with the notice provisio
|
|||||||
|
|
||||||
### List of Parties
|
### List of Parties
|
||||||
|
|
||||||
| Data Exporter | Data Importer |
|
| Data Exporter | Data Importer |
|
||||||
| :---- | :---- |
|
|:-------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------|
|
||||||
| Name: The Party identified as the Customer in the Agreement. | Name: The Party identified as Zitadel in the Agreement. |
|
| Name: The Party identified as the Customer in the Agreement. | Name: The Party identified as Zitadel in the Agreement. |
|
||||||
| Address: As identified in the Agreement. | Address: As identified in the Agreement. |
|
| Address: As identified in the Agreement. | Address: As identified in the Agreement. |
|
||||||
| Contact Person's Name, position and contact details: As identified in the Agreement. | Contact Person's Name, position and contact details: As identified in the Agreement. |
|
| Contact Person's Name, position and contact details: As identified in the Agreement. | Contact Person's Name, position and contact details: As identified in the Agreement. |
|
||||||
| Activities relevant to the transfer: See below | Activities relevant to the transfer: See below |
|
| Activities relevant to the transfer: See below | Activities relevant to the transfer: See below |
|
||||||
| Role: Controller | Role: Processor |
|
| Role: Controller | Role: Processor |
|
||||||
|
|
||||||
### Description of processing / transfer
|
### Description of processing / transfer
|
||||||
|
|
||||||
| | Description |
|
| | Description |
|
||||||
| :---- | :---- |
|
|:-----------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------|
|
||||||
| **Categories of data subjects:** | As described in the section "Processing of Personal Data" of the DPA |
|
| **Categories of data subjects:** | As described in the section "Processing of Personal Data" of the DPA |
|
||||||
| **Categories of personal data:** | As described in the section "Processing of Personal Data" of the DPA |
|
| **Categories of personal data:** | As described in the section "Processing of Personal Data" of the DPA |
|
||||||
| **Sensitive data:** | None. |
|
| **Sensitive data:** | None. |
|
||||||
| **If sensitive data, the applied restrictions or safeguards** | N/A |
|
| **If sensitive data, the applied restrictions or safeguards** | N/A |
|
||||||
| **Frequency of the transfer:** | Continuous |
|
| **Frequency of the transfer:** | Continuous |
|
||||||
| **Nature and subject matter of processing:** | The Services described in the Agreement. |
|
| **Nature and subject matter of processing:** | The Services described in the Agreement. |
|
||||||
| **Purpose(s) of the data transfer and further processing:** | As set forth in the Agreement. |
|
| **Purpose(s) of the data transfer and further processing:** | As set forth in the Agreement. |
|
||||||
| **Retention period (or, if not possible to determine, the criteria used to determine that period):** | The personal data may be retained until termination or expiry of the DPA. |
|
| **Retention period (or, if not possible to determine, the criteria used to determine that period):** | The personal data may be retained until termination or expiry of the DPA. |
|
||||||
|
|
||||||
### Competent supervisory authority
|
### Competent supervisory authority
|
||||||
|
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ If you are unsure about the use of our logos, please contact [[email protected]]
|
|||||||
|
|
||||||
ZITADEL's brand assets and trademarks are proprietary assets owned exclusively by us.
|
ZITADEL's brand assets and trademarks are proprietary assets owned exclusively by us.
|
||||||
|
|
||||||
No third party may claim ownership over brand assets and trademarks or brands and trademarks that are confusingly similar. This extends to all trademarks in image, textform, combined image and text, visual, and audio.
|
No third party may claim ownership over brand assets and trademarks or brands and trademarks that are confusingly similar. This extends to all trademarks in image, text-form, combined image and text, visual, and audio.
|
||||||
|
|
||||||
You must not include our brands and trademarks in the name of your product or service wether commercial or non-commercial, this includes, but is not limited to, websites, blogs, informational, advertising, and personal home pages, applications.
|
You must not include our brands and trademarks in the name of your product or service whether commercial or non-commercial, this includes, but is not limited to, websites, blogs, informational, advertising, and personal home pages, applications.
|
||||||
|
|
||||||
## Spelling
|
## Spelling
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ This policy clarifies how we handle requests for feature prioritization and deve
|
|||||||
## Why to do we have this policy?
|
## Why to do we have this policy?
|
||||||
|
|
||||||
Shaping of the roadmap and prioritization of features is done by ZITADEL.
|
Shaping of the roadmap and prioritization of features is done by ZITADEL.
|
||||||
You are welcome to give feedback on the [roadmap](https://zitadel.com/roadmap) and we are happy to [accept upstream pull requests](https://github.com/zitadel/zitadel/CONTRIBUTE.md) for ZITADEL.
|
You are welcome to give feedback on the [roadmap](https://zitadel.com/roadmap), and we are happy to [accept upstream pull requests](https://github.com/zitadel/zitadel/CONTRIBUTE.md) for ZITADEL.
|
||||||
|
|
||||||
In case you can't contribute directly to the open source version of ZITADEL, but want to accelerate development, we may develop the feature on request, under the conditions laid out in this policy.
|
In case you can't contribute directly to the open source version of ZITADEL, but want to accelerate development, we may develop the feature on request, under the conditions laid out in this policy.
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ You can freely choose the infrastructure and location to host ZITADEL.
|
|||||||
### Responsibilities
|
### Responsibilities
|
||||||
|
|
||||||
Your obligations while operating and using ZITADEL are detailed in our [terms of service](/legal/terms-of-service#your-obligations) given the provisions in our [acceptable use policy](/legal/policies/acceptable-use-policy).
|
Your obligations while operating and using ZITADEL are detailed in our [terms of service](/legal/terms-of-service#your-obligations) given the provisions in our [acceptable use policy](/legal/policies/acceptable-use-policy).
|
||||||
When using ZITADEL Cloud, we may processing data on behalf according to the [data processing agreement](/legal/data-processing-agreement).
|
When using ZITADEL Cloud, we may process data on behalf according to the [data processing agreement](/legal/data-processing-agreement).
|
||||||
|
|
||||||
In a self-hosted setup, you will be responsible for the cost, operations, and availability of your infrastructure.
|
In a self-hosted setup, you will be responsible for the cost, operations, and availability of your infrastructure.
|
||||||
For DDoS, bot, and threat detection and protection we rely on external services in ZITADEL Cloud.
|
For DDoS, bot, and threat detection and protection we rely on external services in ZITADEL Cloud.
|
||||||
@@ -54,20 +54,20 @@ The SMTP service and SMS service are limited in use.
|
|||||||
You should configure your own service providers for production use cases.
|
You should configure your own service providers for production use cases.
|
||||||
In a self-hosted setup, you will be responsible for SMTP / SMS services, domains and certificates.
|
In a self-hosted setup, you will be responsible for SMTP / SMS services, domains and certificates.
|
||||||
|
|
||||||
| Responsibility | ZITADEL Cloud | Self-Hosted |
|
| Responsibility | ZITADEL Cloud | Self-Hosted |
|
||||||
| --- | --- | --- |
|
|------------------------|---------------------------|-------------|
|
||||||
| Data / Information | Customer | Customer |
|
| Data / Information | Customer | Customer |
|
||||||
| User Access | Customer | Customer |
|
| User Access | Customer | Customer |
|
||||||
| SMTP Service | Customer (trial: ZITADEL) | Customer |
|
| SMTP Service | Customer (trial: ZITADEL) | Customer |
|
||||||
| SMS Service | Customer (trial: ZITADEL) | Customer |
|
| SMS Service | Customer (trial: ZITADEL) | Customer |
|
||||||
| Custom Domain / TLS | Customer (trial: ZITADEL) | Customer |
|
| Custom Domain / TLS | Customer (trial: ZITADEL) | Customer |
|
||||||
| DDoS & Bot protection | ZITADEL | Customer |
|
| DDoS & Bot protection | ZITADEL | Customer |
|
||||||
| WAF / Threat detection | ZITADEL | Customer |
|
| WAF / Threat detection | ZITADEL | Customer |
|
||||||
| [Backup](#backup) | ZITADEL | Customer |
|
| [Backup](#backup) | ZITADEL | Customer |
|
||||||
| Networking | ZITADEL | Customer |
|
| Networking | ZITADEL | Customer |
|
||||||
| Compute / Scaling | ZITADEL | Customer |
|
| Compute / Scaling | ZITADEL | Customer |
|
||||||
| Database | ZITADEL | Customer |
|
| Database | ZITADEL | Customer |
|
||||||
| Application | ZITADEL | ZITADEL |
|
| Application | ZITADEL | ZITADEL |
|
||||||
|
|
||||||
## Data location
|
## Data location
|
||||||
|
|
||||||
@@ -81,5 +81,5 @@ Our backup strategy executes daily full backups and differential backups on much
|
|||||||
In a disaster recovery scenario, our goal is to guarantee a recovery point objective (RPO) of 1h, and a higher but similar recovery time objective (RTO).
|
In a disaster recovery scenario, our goal is to guarantee a recovery point objective (RPO) of 1h, and a higher but similar recovery time objective (RTO).
|
||||||
Under normal operations, RPO and RTO goals are below 1 minute.
|
Under normal operations, RPO and RTO goals are below 1 minute.
|
||||||
|
|
||||||
If you you have different requirements we provide you with a flexible approach to backup, restore, and transfer data (f.e. to a self-hosted setup) through our APIs.
|
If you have different requirements we provide you with a flexible approach to back up, restore, and transfer data (f.e. to a self-hosted setup) through our APIs.
|
||||||
Please consult the [migration guides](/guides/migrate/introduction) for more information.
|
Please consult the [migration guides](/guides/migrate/introduction) for more information.
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ Available means that Core Services of ZITADEL Cloud respond to Customer Requests
|
|||||||
|
|
||||||
### Customer Requests
|
### Customer Requests
|
||||||
|
|
||||||
Customer Requests means a HTTP request made by a Customer or a Customers’ users to Core Services within the Customer’s organization’s region.
|
Customer Requests means an HTTP request made by a Customer or a Customers’ users to Core Services within the Customer’s organization’s region.
|
||||||
|
|
||||||
### Successful Minute
|
### Successful Minute
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ Failed Customer Request means Customer Requests that
|
|||||||
|
|
||||||
This excludes specifically:
|
This excludes specifically:
|
||||||
|
|
||||||
- Failed Customer Requests due to malformed requests, client-side application errors outside of ZITADEL Cloud’s control
|
- Failed Customer Requests due to malformed requests, client-side application errors outside ZITADEL Cloud’s control
|
||||||
- Customer Requests that do not reach ZITADEL Cloud Core Services
|
- Customer Requests that do not reach ZITADEL Cloud Core Services
|
||||||
|
|
||||||
### Core Services
|
### Core Services
|
||||||
@@ -56,18 +56,18 @@ Core Services means the following ZITADEL Cloud Services and API’s:
|
|||||||
- **OpenID Connect 1.0 / OAuth 2.0 API** Endpoints
|
- **OpenID Connect 1.0 / OAuth 2.0 API** Endpoints
|
||||||
- **SAML 2.0** Endpoints
|
- **SAML 2.0** Endpoints
|
||||||
- **Login Service** means the graphical user interface of ZITADEL Cloud for users to Login, Self-Register, and conduct a Password Reset.
|
- **Login Service** means the graphical user interface of ZITADEL Cloud for users to Login, Self-Register, and conduct a Password Reset.
|
||||||
- **Identity Brokering Service** means the component of ZITADEL Cloud that handles federated authentication of users with third-party identity provider, excluding any failure or misconfiguration by the third-party
|
- **Identity Brokering Service** means the component of ZITADEL Cloud that handles federated authentication of users with third-party identity provider, excluding any failure or misconfiguration by the third party
|
||||||
|
|
||||||
### Financial Credit
|
### Financial Credit
|
||||||
|
|
||||||
**Financial Credit** means the percent of the monthly subscription fee applicable to the month in which the guaranteed service level was not met, according to the actual achieved monthly uptime percentage, as shown in the following table
|
**Financial Credit** means the percent of the monthly subscription fee applicable to the month in which the guaranteed service level was not met, according to the actual achieved monthly uptime percentage, as shown in the following table
|
||||||
|
|
||||||
Achieved vs. Guaranteed| 99.50% | 99.90% | 99.95%
|
| Achieved vs. Guaranteed | 99.50% | 99.90% | 99.95% |
|
||||||
--- | --- | --- | ---
|
|--------------------------|--------|--------|--------|
|
||||||
99.5% - < 99.9% | n/a | n/a | 10%
|
| 99.5% - < 99.9% | n/a | n/a | 10% |
|
||||||
99.0% - < 99.5% | n/a | 10% | 25%
|
| 99.0% - < 99.5% | n/a | 10% | 25% |
|
||||||
95.0% - < 99.0% | 10% | 25% | 50%
|
| 95.0% - < 99.0% | 10% | 25% | 50% |
|
||||||
< 95.0% | 50% | 50% | 50%
|
| < 95.0% | 50% | 50% | 50% |
|
||||||
|
|
||||||
## Service Levels
|
## Service Levels
|
||||||
|
|
||||||
@@ -75,10 +75,10 @@ Achieved vs. Guaranteed| 99.50% | 99.90% | 99.95%
|
|||||||
|
|
||||||
1. During the term of the subscription agreement under which CAOS has agreed to provide ZITADEL Cloud to Customer, the Core Services will provide a Monthly Uptime Percentage to Customer conditional on the subscription plan as follows (the “SLO”):
|
1. During the term of the subscription agreement under which CAOS has agreed to provide ZITADEL Cloud to Customer, the Core Services will provide a Monthly Uptime Percentage to Customer conditional on the subscription plan as follows (the “SLO”):
|
||||||
|
|
||||||
Option | Monthly Uptime Percentage
|
| Option | Monthly Uptime Percentage |
|
||||||
--- | ---
|
|--------------|---------------------------|
|
||||||
Default | 99.50%
|
| Default | 99.50% |
|
||||||
Extended SLA | 99.95%
|
| Extended SLA | 99.95% |
|
||||||
|
|
||||||
1. If CAOS Ltd. does not meet the guaranteed service level, Customer might be eligible to receive Financial Credit as described in this document. Financial Credit shall be the sole and exclusive remedy for breach of this SLA.
|
1. If CAOS Ltd. does not meet the guaranteed service level, Customer might be eligible to receive Financial Credit as described in this document. Financial Credit shall be the sole and exclusive remedy for breach of this SLA.
|
||||||
2. The Customer must request Financial Credit and must notify CAOS Support in writing within 30 days of becoming eligible for Financial Credit and must prove Failed Customer Requests during Downtime Periods. Financial Credit will be made in the form of a monetary credit applied to the next possible subscription invoice of ZITADEL Cloud, may only be used to book services in the future, and will in no case be paid as a cash equivalent. No further guarantees are provided.
|
2. The Customer must request Financial Credit and must notify CAOS Support in writing within 30 days of becoming eligible for Financial Credit and must prove Failed Customer Requests during Downtime Periods. Financial Credit will be made in the form of a monetary credit applied to the next possible subscription invoice of ZITADEL Cloud, may only be used to book services in the future, and will in no case be paid as a cash equivalent. No further guarantees are provided.
|
||||||
|
|||||||
@@ -14,4 +14,4 @@ This explains the limited processing of customer data the entity is authorized t
|
|||||||
We regularly audit all data processing agreements that we have with our sub-processors to guarantee that they adhere to the same level of privacy as ours to protect your personal data.
|
We regularly audit all data processing agreements that we have with our sub-processors to guarantee that they adhere to the same level of privacy as ours to protect your personal data.
|
||||||
|
|
||||||
You can find [the full list of sub-processors in our trust center](https://trust.zitadel.com/subprocessors). We try to minimize the number of sub-processors that handle end-user data on our behalf to reduce any vendor related risks.
|
You can find [the full list of sub-processors in our trust center](https://trust.zitadel.com/subprocessors). We try to minimize the number of sub-processors that handle end-user data on our behalf to reduce any vendor related risks.
|
||||||
Some providers are used by default, but you can opt-out of the default provide and replace the sub-processor by a provider of your choice.
|
Some providers are used by default, but you can opt out of the default provider and replace the sub-processor by a provider of your choice.
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ This library is built by our community.
|
|||||||
|
|
||||||
### Example Application
|
### Example Application
|
||||||
|
|
||||||
The [zitadel-flutter](https://github.com/zitadel/zitadel_flutter) repository includes an Example Application ready to start and show how an Flutter application looks like with integrated ZITADEL Login.
|
The [zitadel-flutter](https://github.com/zitadel/zitadel_flutter) repository includes an Example Application ready to start and show how a Flutter application looks like with integrated ZITADEL Login.
|
||||||
|
|
||||||
What does the Example include:
|
What does the Example include:
|
||||||
- Home Page with Login Button
|
- Home Page with Login Button
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ What does the API Application Example include:
|
|||||||
|
|
||||||
### Step-By-Step Guide
|
### Step-By-Step Guide
|
||||||
|
|
||||||
For Go we do have two different Step-By-Step Guides.
|
For Go, we do have two different Step-By-Step Guides.
|
||||||
One to create your web application with integrated login and one to create your API with permission checks for calling users.
|
One to create your web application with integrated login and one to create your API with permission checks for calling users.
|
||||||
The guides lead you through the whole process from configuring the right application in ZITADEL to a ready application with integrated login or authentication checks.
|
The guides lead you through the whole process from configuring the right application in ZITADEL to a ready application with integrated login or authentication checks.
|
||||||
|
|
||||||
@@ -84,8 +84,8 @@ The guides lead you through the whole process from configuring the right applica
|
|||||||
After completing the Step-By-Step Guide you will have:
|
After completing the Step-By-Step Guide you will have:
|
||||||
1. Example Web Application with integrated ZITADEL Login
|
1. Example Web Application with integrated ZITADEL Login
|
||||||
2. Example page accessible by authenticated user showing retrieved user information
|
2. Example page accessible by authenticated user showing retrieved user information
|
||||||
4. Logout
|
3. Logout
|
||||||
5. Correct setup for your application in ZITADEL
|
4. Correct setup for your application in ZITADEL
|
||||||
|
|
||||||
[Web APP Step-By-Step Guide](/examples/login/go)
|
[Web APP Step-By-Step Guide](/examples/login/go)
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ To begin configuring login for any of these samples, start [here](https://zitade
|
|||||||
## OIDC Libraries
|
## OIDC Libraries
|
||||||
|
|
||||||
OIDC is a standard for authentication and most languages and frameworks do provide a OIDC library which can be easily integrated to your application.
|
OIDC is a standard for authentication and most languages and frameworks do provide a OIDC library which can be easily integrated to your application.
|
||||||
If we do not provide an specific example, SDK or guide, we strongly recommend using existing authentication libraries for your
|
If we do not provide a specific example, SDK or guide, we strongly recommend using existing authentication libraries for your
|
||||||
language or framework instead of building your own.
|
language or framework instead of building your own.
|
||||||
Certified libraries have undergone rigorous testing and validation to ensure high security and reliability.
|
Certified libraries have undergone rigorous testing and validation to ensure high security and reliability.
|
||||||
There are many recommended libraries available, this saves time and ensures that users' data is well-protected.
|
There are many recommended libraries available, this saves time and ensures that users' data is well-protected.
|
||||||
@@ -52,7 +52,7 @@ You might want to check out the following links to find a good library:
|
|||||||
|
|
||||||
## Other example applications
|
## Other example applications
|
||||||
|
|
||||||
- [B2B customer portal](https://github.com/zitadel/zitadel-nextjs-b2b): Showcase the use of personal access tokens in a B2B environment. Uses NextJS Framework.
|
- [B2B customer portal](https://github.com/zitadel/zitadel-nextjs-b2b): Showcase the use of personal access tokens in a B2B environment. Uses Next.js Framework.
|
||||||
- [Frontend with backend API](https://github.com/zitadel/example-quote-generator-app): A simple web application using a React front-end and a Python back-end API, both secured using Zitadel
|
- [Frontend with backend API](https://github.com/zitadel/example-quote-generator-app): A simple web application using a React front-end and a Python back-end API, both secured using Zitadel
|
||||||
- [Introspection](https://github.com/zitadel/examples-api-access-and-token-introspection): Python examples for securing an API and invoking it as a service user
|
- [Introspection](https://github.com/zitadel/examples-api-access-and-token-introspection): Python examples for securing an API and invoking it as a service user
|
||||||
- [Fine-grained authorization](https://github.com/zitadel/example-fine-grained-authorization): Leverage actions, custom metadata, and claims for attribute-based access control
|
- [Fine-grained authorization](https://github.com/zitadel/example-fine-grained-authorization): Leverage actions, custom metadata, and claims for attribute-based access control
|
||||||
@@ -72,7 +72,7 @@ the [buf plugin registry](https://buf.build/plugins) for more ideas.
|
|||||||
|
|
||||||
### Example with Ruby
|
### Example with Ruby
|
||||||
|
|
||||||
With gRPC we usually need to generate the client stub and the messages/types. This is why we need two plugins.
|
With gRPC, we usually need to generate the client stub and the messages/types. This is why we need two plugins.
|
||||||
The plugin `grpc/ruby` generates the client stub and the plugin `protocolbuffers/ruby` takes care of the messages/types.
|
The plugin `grpc/ruby` generates the client stub and the plugin `protocolbuffers/ruby` takes care of the messages/types.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ This example uses **[@auth/core](https://www.npmjs.com/package/@auth/core)**, th
|
|||||||
|
|
||||||
## What this example demonstrates
|
## What this example demonstrates
|
||||||
|
|
||||||
This example implements a complete authentication flow using [PKCE](https://oauth.net/2/pkce/) with [Zitadel](https://oauth.net/2/pkce/) with [Zitadel](https://zitadel.com/docs) as the identity provider. Users begin on a public landing page and click a login button to authenticate through Zitadel's authorization server. After successful authentication, they're redirected to a protected profile page displaying their user information retrieved from the [ID token](https://oauth.net/2/pkce/) with [Zitadel](https://zitadel.com/docs) as the identity provider. Users begin on a public landing page and click a login button to authenticate through Zitadel's authorization server. After successful authentication, they're redirected to a protected profile page displaying their user information retrieved from the [ID token](https://zitadel.com/docs/apis/openidoauth/claims) and [access token](https://zitadel.com/docs/apis/openidoauth/endpoints#token_endpoint).
|
This example implements a complete authentication flow using [PKCE](https://oauth.net/2/pkce/) with [Zitadel](https://zitadel.com/docs) as the identity provider. Users begin on a public landing page and click a login button to authenticate through Zitadel's authorization server. After successful authentication, they're redirected to a protected profile page displaying their user information retrieved from the [ID token](https://oauth.net/2/pkce/) with [Zitadel](https://zitadel.com/docs) as the identity provider. Users begin on a public landing page and click a login button to authenticate through Zitadel's authorization server. After successful authentication, they're redirected to a protected profile page displaying their user information retrieved from the [ID token](https://zitadel.com/docs/apis/openidoauth/claims) and [access token](https://zitadel.com/docs/apis/openidoauth/endpoints#token_endpoint).
|
||||||
|
|
||||||
The application leverages [NestJS controllers](https://docs.nestjs.com/controllers) to handle authentication routes and [@mridang/nestjs-auth guards](https://docs.nestjs.com/controllers) to handle authentication routes and [@mridang/nestjs-auth guards](https://www.npmjs.com/package/@mridang/nestjs-auth) to protect routes requiring authentication. [Session management](https://docs.nestjs.com/controllers) to handle authentication routes and [@mridang/nestjs-auth guards](https://www.npmjs.com/package/@mridang/nestjs-auth) to protect routes requiring authentication. [Session management](https://zitadel.com/docs/guides/integrate/login/oidc/login-users) is handled through encrypted [JWT-based sessions](https://docs.nestjs.com/controllers) to handle authentication routes and [@mridang/nestjs-auth guards](https://www.npmjs.com/package/@mridang/nestjs-auth) to protect routes requiring authentication. [Session management](https://zitadel.com/docs/guides/integrate/login/oidc/login-users) is handled through encrypted [JWT-based sessions](https://authjs.dev/concepts/session-strategies#jwt-session) stored in secure, HTTP-only cookies. The example includes automatic [token refresh](https://docs.nestjs.com/controllers) to handle authentication routes and [@mridang/nestjs-auth guards](https://www.npmjs.com/package/@mridang/nestjs-auth) to protect routes requiring authentication. [Session management](https://zitadel.com/docs/guides/integrate/login/oidc/login-users) is handled through encrypted [JWT-based sessions](https://authjs.dev/concepts/session-strategies#jwt-session) stored in secure, HTTP-only cookies. The example includes automatic [token refresh](https://zitadel.com/docs/apis/openidoauth/grant-types#refresh-token) functionality using [refresh tokens](https://oauth.net/2/pkce/), ensuring users maintain their sessions without interruption when access tokens expire.
|
The application leverages [NestJS controllers](https://docs.nestjs.com/controllers) to handle authentication routes and [@mridang/nestjs-auth guards](https://docs.nestjs.com/controllers) to handle authentication routes and [@mridang/nestjs-auth guards](https://www.npmjs.com/package/@mridang/nestjs-auth) to protect routes requiring authentication. [Session management](https://docs.nestjs.com/controllers) to handle authentication routes and [@mridang/nestjs-auth guards](https://www.npmjs.com/package/@mridang/nestjs-auth) to protect routes requiring authentication. [Session management](https://zitadel.com/docs/guides/integrate/login/oidc/login-users) is handled through encrypted [JWT-based sessions](https://docs.nestjs.com/controllers) to handle authentication routes and [@mridang/nestjs-auth guards](https://www.npmjs.com/package/@mridang/nestjs-auth) to protect routes requiring authentication. [Session management](https://zitadel.com/docs/guides/integrate/login/oidc/login-users) is handled through encrypted [JWT-based sessions](https://authjs.dev/concepts/session-strategies#jwt-session) stored in secure, HTTP-only cookies. The example includes automatic [token refresh](https://docs.nestjs.com/controllers) to handle authentication routes and [@mridang/nestjs-auth guards](https://www.npmjs.com/package/@mridang/nestjs-auth) to protect routes requiring authentication. [Session management](https://zitadel.com/docs/guides/integrate/login/oidc/login-users) is handled through encrypted [JWT-based sessions](https://authjs.dev/concepts/session-strategies#jwt-session) stored in secure, HTTP-only cookies. The example includes automatic [token refresh](https://zitadel.com/docs/apis/openidoauth/grant-types#refresh-token) functionality using [refresh tokens](https://oauth.net/2/pkce/), ensuring users maintain their sessions without interruption when access tokens expire.
|
||||||
|
|
||||||
|
|||||||
@@ -80,11 +80,11 @@ zitadel:
|
|||||||
ExternalSecure: true
|
ExternalSecure: true
|
||||||
```
|
```
|
||||||
|
|
||||||
| Setting | Description |
|
| Setting | Description |
|
||||||
|---------|-------------|
|
|------------------|----------------------------------------------|
|
||||||
| `ExternalDomain` | The public domain name (no protocol or port) |
|
| `ExternalDomain` | The public domain name (no protocol or port) |
|
||||||
| `ExternalPort` | The public port (443 for HTTPS, 80 for HTTP) |
|
| `ExternalPort` | The public port (443 for HTTPS, 80 for HTTP) |
|
||||||
| `ExternalSecure` | Whether the external connection uses HTTPS |
|
| `ExternalSecure` | Whether the external connection uses HTTPS |
|
||||||
|
|
||||||
### TLS
|
### TLS
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ Choose your platform and run ZITADEL with the most minimal configuration possibl
|
|||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- For test environments, ZITADEL does not need many resources, 1 CPU and 512MB memory are more than enough. (With more CPU, the password hashing might be faster)
|
- For test environments, ZITADEL does not need many resources, 1 CPU and 512MB memory are more than enough. (With more CPU, the password hashing might be faster)
|
||||||
- A PostgreSQL as only needed storage. Make sure to read our [Production Guide](/self-hosting/manage/production#prefer-postgre-sql) before you decide to use Postgresql.
|
- A PostgreSQL as only needed storage. Make sure to read our [Production Guide](/self-hosting/manage/production#prefer-postgre-sql) before you decide to use PostgreSQL.
|
||||||
|
|
||||||
## Releases
|
## Releases
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
`ID=QUERY-n0wng Message=Instance not found`
|
`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`.
|
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](/self-hosting/manage/custom-domain).
|
You can find further instructions in our guide about [Custom Domains](/self-hosting/manage/custom-domain).
|
||||||
We also provide a guide on how to [configure](/self-hosting/manage/configure) ZITADEL with variables from files or environment variables.
|
We also provide a guide on how to [configure](/self-hosting/manage/configure) ZITADEL with variables from files or environment variables.
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ Check out the [reverse proxy configuration examples](/self-hosting/manage/revers
|
|||||||
|
|
||||||
## Organization Domains
|
## Organization Domains
|
||||||
|
|
||||||
Note that by default, you cannot access ZITADEL at an organizations domain.
|
Note that by default, you cannot access ZITADEL at an organization's domain.
|
||||||
Organization level domains [are intended for routing users by their login methods to their correct organization](/guides/solution-scenarios/domain-discovery).
|
Organization level domains [are intended for routing users by their login methods to their correct organization](/guides/solution-scenarios/domain-discovery).
|
||||||
|
|
||||||
However, if you want to access ZITADEL at an organization domain, [you can add additional domains using the System API](/reference/api/system/zitadel.system.v1.SystemService.AddDomain).
|
However, if you want to access ZITADEL at an organization domain, [you can add additional domains using the System API](/reference/api/system/zitadel.system.v1.SystemService.AddDomain).
|
||||||
@@ -60,5 +60,5 @@ You can immediately access the ZITADEL Management Console and APIs using these s
|
|||||||
|
|
||||||
## More Information
|
## More Information
|
||||||
|
|
||||||
- [Check out the production-near loadbalancing example with Traefik](/self-hosting/manage/reverseproxy/traefik)
|
- [Check out the production-near load-balancing example with Traefik](/self-hosting/manage/reverseproxy/traefik)
|
||||||
- [Explore some concrete proxy configuration examples for ZITADEL using the domain 127.0.0.1.sslip.io](/self-hosting/manage/reverseproxy/reverse_proxy)
|
- [Explore some concrete proxy configuration examples for ZITADEL using the domain 127.0.0.1.sslip.io](/self-hosting/manage/reverseproxy/reverse_proxy)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ To apply best practices to your production setup we created a step by step check
|
|||||||
- [ ] Test the restore scenarios before going live
|
- [ ] Test the restore scenarios before going live
|
||||||
- [ ] Secure database connections from outside your network and/or use an internal subnet for database connectivity
|
- [ ] Secure database connections from outside your network and/or use an internal subnet for database connectivity
|
||||||
- [ ] High Availability for critical infrastructure components (depending on your setup)
|
- [ ] High Availability for critical infrastructure components (depending on your setup)
|
||||||
- [ ] Loadbalancer
|
- [ ] Load-balancer
|
||||||
- [ ] [Reverse Proxies](/self-hosting/manage/reverseproxy/reverse_proxy)
|
- [ ] [Reverse Proxies](/self-hosting/manage/reverseproxy/reverse_proxy)
|
||||||
- [ ] Web Application Firewall
|
- [ ] Web Application Firewall
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ To apply best practices to your production setup we created a step by step check
|
|||||||
|
|
||||||
### Monitoring
|
### Monitoring
|
||||||
|
|
||||||
Use an appropriate monitoring solution to have an overview about your ZITADEL instance. In particular you may want to watch out for things like:
|
Use an appropriate monitoring solution to have an overview about your ZITADEL instance. In particular, you may want to watch out for things like:
|
||||||
|
|
||||||
- [ ] CPU and memory of ZITADEL and the database
|
- [ ] CPU and memory of ZITADEL and the database
|
||||||
- [ ] Open database connections
|
- [ ] Open database connections
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ sidebar_label: Cloudflare
|
|||||||
|
|
||||||
- [Make sure HTTP/2 is enabled](https://support.cloudflare.com/hc/en-us/articles/200168076-Understanding-Cloudflare-HTTP-2-and-HTTP-3-Support)
|
- [Make sure HTTP/2 is enabled](https://support.cloudflare.com/hc/en-us/articles/200168076-Understanding-Cloudflare-HTTP-2-and-HTTP-3-Support)
|
||||||
- [Verify that gRPC is enabled](https://support.cloudflare.com/hc/en-us/articles/360050483011-Understanding-Cloudflare-gRPC-support)
|
- [Verify that gRPC is enabled](https://support.cloudflare.com/hc/en-us/articles/360050483011-Understanding-Cloudflare-gRPC-support)
|
||||||
- [Verify that traffic is proxied through cloudflare](https://developers.cloudflare.com/dns/manage-dns-records/reference/proxied-dns-records/)
|
- [Verify that traffic is proxied through Cloudflare](https://developers.cloudflare.com/dns/manage-dns-records/reference/proxied-dns-records/)
|
||||||
- [Configure Zitadel to use the TLS Mode enabled](/self-hosting/manage/tls_modes#enabled)
|
- [Configure Zitadel to use the TLS Mode enabled](/self-hosting/manage/tls_modes#enabled)
|
||||||
|
|
||||||
<Callout>
|
<Callout>
|
||||||
@@ -16,7 +16,7 @@ sidebar_label: Cloudflare
|
|||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
If something is not working please check the cloudflare WAF rules for potential violations.
|
If something is not working please check the Cloudflare WAF rules for potential violations.
|
||||||
These two rules are known to be triggered:
|
These two rules are known to be triggered:
|
||||||
|
|
||||||
- 100001 Anomaly:Header:User-Agent - Missing Cloudflare Specials
|
- 100001 Anomaly:Header:User-Agent - Missing Cloudflare Specials
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ sidebar_label: Fronting Zitadel Cloud
|
|||||||
|
|
||||||
## Fronting Zitadel Cloud
|
## Fronting Zitadel Cloud
|
||||||
|
|
||||||
You can use your reverseproxy, content delivery network (CDN) or web application firewall (WAF) to front Zitadel Cloud.
|
You can use your reverse-proxy, content delivery network (CDN) or web application firewall (WAF) to front Zitadel Cloud.
|
||||||
However we currently do not recommend this for production settings.
|
However, we currently do not recommend this for production settings.
|
||||||
|
|
||||||
To configure your service that fronts Zitadel please have a look at the vendors in this page.
|
To configure your service that fronts Zitadel please have a look at the vendors in this page.
|
||||||
|
|
||||||
## Things to look out for when fronting Zitadel Cloud
|
## Things to look out for when fronting Zitadel Cloud
|
||||||
|
|
||||||
- Cache-control - Zitadel Cloud uses a CDN to globally distribute data. Please try to avoid overriding this header as it may lead to sideeffects
|
- Cache-control - Zitadel Cloud uses a CDN to globally distribute data. Please try to avoid overriding this header as it may lead to side-effects
|
||||||
- Rate Limits - Zitadel Cloud uses a combination of static and dynamic rate limits. If you receive occasional 429 headers you are rate limited.
|
- Rate Limits - Zitadel Cloud uses a combination of static and dynamic rate limits. If you receive occasional 429 headers you are rate limited.
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ If you on the other hand want users to be able to federate their accounts from a
|
|||||||
|
|
||||||
Further ZITADEL provided the possibility to disable registration on each IDP with the introduction of IDP Templates.
|
Further ZITADEL provided the possibility to disable registration on each IDP with the introduction of IDP Templates.
|
||||||
|
|
||||||
To address this, we are going to change the behavior of the setting mentioned above, so that if disable, it will only prevent local registration. Registration of a federated user will still be possible - if not disabled by the corresponding IDP Template.
|
To address this, we are going to change the behavior of the setting mentioned above, so that if disabled, it will only prevent local registration. Registration of a federated user will still be possible - if not disabled by the corresponding IDP Template.
|
||||||
|
|
||||||
## Statement
|
## Statement
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ Due to storage optimizations ZITADEL changes the behavior of sequences.
|
|||||||
This change improves command (create, update, delete) performance of ZITADEL.
|
This change improves command (create, update, delete) performance of ZITADEL.
|
||||||
|
|
||||||
Sequences are no longer unique inside an instance.
|
Sequences are no longer unique inside an instance.
|
||||||
From now on sequences are upcounting per aggregate id.
|
From now on sequences are counting up per aggregate id.
|
||||||
For example sequences of newly created users begin at 1.
|
For example sequences of newly created users begin at 1.
|
||||||
Existing sequences remain untouched.
|
Existing sequences remain untouched.
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ As soon as the release version is published, we will include the version here.
|
|||||||
|
|
||||||
If you use the ListEvents API to scrape events use the creation date instead of the sequence.
|
If you use the ListEvents API to scrape events use the creation date instead of the sequence.
|
||||||
If you use sequences on a list of objects it's no longer guaranteed to have unique sequences across the list.
|
If you use sequences on a list of objects it's no longer guaranteed to have unique sequences across the list.
|
||||||
Therefore it's recommended to use the change data of the objects instead.
|
Therefore, it's recommended to use the change data of the objects instead.
|
||||||
|
|
||||||
## Impact
|
## Impact
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ Date: Calendar week 41/42 2023
|
|||||||
|
|
||||||
Versions >= 2.39.0 require the cockroach database user of ZITADEL to be granted to the `VIEWACTIVITY` grant. This can either be reached by grant the role manually or execute the `zitadel init` command.
|
Versions >= 2.39.0 require the cockroach database user of ZITADEL to be granted to the `VIEWACTIVITY` grant. This can either be reached by grant the role manually or execute the `zitadel init` command.
|
||||||
|
|
||||||
Cockroach versions 22.2 < 22.2.11 and 23.1 < 23.1.4 will fail the migration. Please make sure to upgrade to more recent versions first. ZITADEL recommends to use the latest stable version of Cockroachdb.
|
Cockroach versions 22.2 < 22.2.11 and 23.1 < 23.1.4 will fail the migration. Please make sure to upgrade to more recent versions first. ZITADEL recommends to use the latest stable version of CockroachDB.
|
||||||
|
|
||||||
## Statement
|
## Statement
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ To query correct order of events the cockroach database user of ZITADEL needs ad
|
|||||||
|
|
||||||
Before migrating to versions >= 2.39.0 make sure the cockroach database user has sufficient grants.
|
Before migrating to versions >= 2.39.0 make sure the cockroach database user has sufficient grants.
|
||||||
|
|
||||||
Cockroachdb version is up to date.
|
CockroachDB version is up to date.
|
||||||
|
|
||||||
## Impact
|
## Impact
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ This advisory applies to self-hosted ZITADEL installations with custom roles to
|
|||||||
## Description
|
## Description
|
||||||
|
|
||||||
In upcoming ZITADEL versions, RBAC also applies to [system users defined in the ZITADEL runtime configuration](/guides/integrate/zitadel-apis/access-zitadel-system-api#runtime-configuration).
|
In upcoming ZITADEL versions, RBAC also applies to [system users defined in the ZITADEL runtime configuration](/guides/integrate/zitadel-apis/access-zitadel-system-api#runtime-configuration).
|
||||||
This enables fine grained access control to the system API as well as other APIs for system users.
|
This enables fine-grained access control to the system API as well as other APIs for system users.
|
||||||
ZITADEL defines the new default roles *SYSTEM_OWNER* and *SYSTEM_OWNER_VIEWER*.
|
ZITADEL defines the new default roles *SYSTEM_OWNER* and *SYSTEM_OWNER_VIEWER*.
|
||||||
System users without any memberships defined in the configuration will be assigned the *SYSTEM_OWNER* role.
|
System users without any memberships defined in the configuration will be assigned the *SYSTEM_OWNER* role.
|
||||||
**Self-hosting users who define their own custom mapping at the *InternalAuthZ.RolePermissionMappings* configuration section**, have to define the *SYSTEM_OWNER* role in their configuration too to be able to access the system API with the default system user membership.
|
**Self-hosting users who define their own custom mapping at the *InternalAuthZ.RolePermissionMappings* configuration section**, have to define the *SYSTEM_OWNER* role in their configuration too to be able to access the system API with the default system user membership.
|
||||||
|
|||||||
@@ -10,17 +10,17 @@ Date: 2024-05-28
|
|||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|
||||||
There were rare cases where Cockroachdb got blocked during runtime of ZITADEL and returned `WRITE_TOO_OLD`-errors to ZITADEL. The root cause of the problem is described in [this github issue of the database](https://github.com/cockroachdb/cockroach/issues/77119). The workaround provided by the database is enabling the `enable_durable_locking_for_serializable`-flag as described [here](https://github.com/cockroachdb/cockroach/issues/75456#issuecomment-1936277716).
|
There were rare cases where CockroachDB got blocked during runtime of ZITADEL and returned `WRITE_TOO_OLD`-errors to ZITADEL. The root cause of the problem is described in [this GitHub issue of the database](https://github.com/cockroachdb/cockroach/issues/77119). The workaround provided by the database is enabling the `enable_durable_locking_for_serializable`-flag as described [here](https://github.com/cockroachdb/cockroach/issues/75456#issuecomment-1936277716).
|
||||||
|
|
||||||
Because enabling flags requires admin privileges the statement must be executed manually or by executing `zitadel init` command.
|
Because enabling flags requires admin privileges the statement must be executed manually or by executing `zitadel init` command.
|
||||||
|
|
||||||
## Statement
|
## Statement
|
||||||
|
|
||||||
Ensure lock distribution for `FOR UPDATE`-statements on Cockroachdb.
|
Ensure lock distribution for `FOR UPDATE`-statements on CockroachDB.
|
||||||
|
|
||||||
## Mitigation
|
## Mitigation
|
||||||
|
|
||||||
Cockroachdb version >= 23.2.
|
CockroachDB version >= 23.2.
|
||||||
|
|
||||||
## Impact
|
## Impact
|
||||||
|
|
||||||
|
|||||||
@@ -17,13 +17,13 @@ they are reduced into projections in bulk batches. Projections allow for efficie
|
|||||||
|
|
||||||
We've investigated multiple reports of outdated projections.
|
We've investigated multiple reports of outdated projections.
|
||||||
For example created users missing in get requests, or missing data after a ZITADEL upgrade[^1].
|
For example created users missing in get requests, or missing data after a ZITADEL upgrade[^1].
|
||||||
The conclusion is that the transaction in which we perform a bulk of queries can timeout.
|
The conclusion is that the transaction in which we perform a bulk of queries can time out.
|
||||||
The old setting defined a transaction duration of 500ms for a bulk of 200 events.
|
The old setting defined a transaction duration of 500ms for a bulk of 200 events.
|
||||||
A single event may create multiple statements in a single projection.
|
A single event may create multiple statements in a single projection.
|
||||||
A timeout may occur even if the actual bulk size is less than 200,
|
A timeout may occur even if the actual bulk size is less than 200,
|
||||||
which then results in more back-pressure on a busy system, leading to more timeouts and effectively dead-locking a projection.
|
which then results in more back-pressure on a busy system, leading to more timeouts and effectively deadlocking a projection.
|
||||||
|
|
||||||
Increasing or disabling the projection transaction duration solved dead-locks in all reported cases.
|
Increasing or disabling the projection transaction duration solved deadlocks in all reported cases.
|
||||||
We've decided to increase the transaction duration to 1 minute.
|
We've decided to increase the transaction duration to 1 minute.
|
||||||
Due to the high value it is functionally similar to disabling,
|
Due to the high value it is functionally similar to disabling,
|
||||||
however it still provides a safety net for transaction that do freeze,
|
however it still provides a safety net for transaction that do freeze,
|
||||||
@@ -39,7 +39,7 @@ This change was submitted in the following PR:
|
|||||||
|
|
||||||
## Mitigation
|
## Mitigation
|
||||||
|
|
||||||
If you have a custom configuration for projections, this update will not apply to your system or some projections. When encountering projection dead-lock consider increasing the timeout to the new default value.
|
If you have a custom configuration for projections, this update will not apply to your system or some projections. When encountering projection deadlock consider increasing the timeout to the new default value.
|
||||||
|
|
||||||
Note that entries under `Customizations` overwrite the global settings for a single projection.
|
Note that entries under `Customizations` overwrite the global settings for a single projection.
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ Last updated: 2025-05-19
|
|||||||
|
|
||||||
### Background
|
### Background
|
||||||
|
|
||||||
Zitadel uses a eventstore table as main source of truth for state changes.
|
Zitadel uses an eventstore table as main source of truth for state changes.
|
||||||
Projections are tables which provide alternative views of state, which are built using events.
|
Projections are tables which provide alternative views of state, which are built using events.
|
||||||
In order to know which events are reduced into projections, we use a `position` column in the eventstore and a dedicated table which records the current state.
|
In order to know which events are reduced into projections, we use a `position` column in the eventstore and a dedicated table which records the current state.
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ Zitadel prior to the listed version had a precision bug. The `position` column u
|
|||||||
|
|
||||||
## Impact
|
## Impact
|
||||||
|
|
||||||
During a past attempt to fix this, we got reports of failing projections inside Zitadel. Because the precision became exact certain compare operations like *equal*, *less then*, etc would now return different results. This was because the values in `current_states` would already have lost precision from a broken version. This might happen to **some** deployments or projections: there is only a small probability.
|
During a past attempt to fix this, we got reports of failing projections inside Zitadel. Because the precision became exact certain compare operations like *equal*, *less than*, etc. would now return different results. This was because the values in `current_states` would already have lost precision from a broken version. This might happen to **some** deployments or projections: there is only a small probability.
|
||||||
|
|
||||||
We are releasing the fix again and your system might get affected.
|
We are releasing the fix again and your system might get affected.
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ sidebar_label: Technical Advisories
|
|||||||
Technical advisories are notices that report major issues with ZITADEL Self-Hosted or the ZITADEL Cloud platform that could potentially impact security or stability in production environments.
|
Technical advisories are notices that report major issues with ZITADEL Self-Hosted or the ZITADEL Cloud platform that could potentially impact security or stability in production environments.
|
||||||
These advisories may include details about the nature of the issue, its potential impact, and recommended mitigation actions.
|
These advisories may include details about the nature of the issue, its potential impact, and recommended mitigation actions.
|
||||||
|
|
||||||
Users are strongly encouraged to evaluate these advisories and consider the recommended mitigation actions independently from their version upgrade schedule.
|
Users are strongly encouraged to evaluate these advisories and consider the recommended mitigation actions independently of their version upgrade schedule.
|
||||||
We understand that these advisories may include breaking changes, and we aim to provide clear guidance on how to address these changes.
|
We understand that these advisories may include breaking changes, and we aim to provide clear guidance on how to address these changes.
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
@@ -64,7 +64,7 @@ We understand that these advisories may include breaking changes, and we aim to
|
|||||||
keep the library up-to-date, the management console UI will loose its dynamic theming
|
keep the library up-to-date, the management console UI will loose its dynamic theming
|
||||||
capability. If you need users to have your branding settings (background-,
|
capability. If you need users to have your branding settings (background-,
|
||||||
button-, link and text coloring) you should implement your own user
|
button-, link and text coloring) you should implement your own user
|
||||||
facing UI yourself and not use ZITADELs management console UI.
|
facing UI yourself and not use ZITADEL's management console UI.
|
||||||
ZITADEL hosted Login-UI is not affected by this change.
|
ZITADEL hosted Login-UI is not affected by this change.
|
||||||
</td>
|
</td>
|
||||||
<td>2.40.0</td>
|
<td>2.40.0</td>
|
||||||
@@ -96,7 +96,7 @@ We understand that these advisories may include breaking changes, and we aim to
|
|||||||
Due to storage optimizations ZITADEL changes the behavior of sequences.
|
Due to storage optimizations ZITADEL changes the behavior of sequences.
|
||||||
This change improves command (create, update, delete) performance of ZITADEL.
|
This change improves command (create, update, delete) performance of ZITADEL.
|
||||||
Sequences are no longer unique inside an instance.
|
Sequences are no longer unique inside an instance.
|
||||||
From now on sequences are upcounting per aggregate id.
|
From now on sequences are incrementing per aggregate id.
|
||||||
For example sequences of newly created users begin at 1.
|
For example sequences of newly created users begin at 1.
|
||||||
Existing sequences remain untouched.
|
Existing sequences remain untouched.
|
||||||
</td>
|
</td>
|
||||||
@@ -113,7 +113,7 @@ We understand that these advisories may include breaking changes, and we aim to
|
|||||||
Migrating to versions >= 2.39 from < 2.39 will cause down time during setup starts and the new version is started.
|
Migrating to versions >= 2.39 from < 2.39 will cause down time during setup starts and the new version is started.
|
||||||
This is caused by storage optimizations which replace the `eventstore.events` database table with the new `eventstore.events2` table.
|
This is caused by storage optimizations which replace the `eventstore.events` database table with the new `eventstore.events2` table.
|
||||||
All existing events are migrated during the execution of the `zitadel setup` command.
|
All existing events are migrated during the execution of the `zitadel setup` command.
|
||||||
New events will be inserted into the new `eventstore.events2` table. The old table `evetstore.events` is renamed to `eventstore.events_old` and will be dropped in a future release of ZITADEL.
|
New events will be inserted into the new `eventstore.events2` table. The old table `eventstore.events` is renamed to `eventstore.events_old` and will be dropped in a future release of ZITADEL.
|
||||||
</td>
|
</td>
|
||||||
<td>2.39.0</td>
|
<td>2.39.0</td>
|
||||||
<td>Calendar week 41/42 2023</td>
|
<td>Calendar week 41/42 2023</td>
|
||||||
@@ -256,7 +256,7 @@ We understand that these advisories may include breaking changes, and we aim to
|
|||||||
|
|
||||||
If you want to stay up to date on our technical advisories, we recommend subscribing to our [Technical Advisory mailing list](https://share-eu1.hsforms.com/1NAOUyAMmRzSnB7uP665xHA2dljbt) or visiting our [website](https://zitadel.com/technical-advisory).
|
If you want to stay up to date on our technical advisories, we recommend subscribing to our [Technical Advisory mailing list](https://share-eu1.hsforms.com/1NAOUyAMmRzSnB7uP665xHA2dljbt) or visiting our [website](https://zitadel.com/technical-advisory).
|
||||||
|
|
||||||
As ZITADEL Cloud customer, you can also login to the <a href="https://zitadel.com/admin">ZITADEL Customer Portal</a> and enable the Technical Advisory <a href="https://zitadel.com/admin/settings">Notifications</a> in your settings.
|
As ZITADEL Cloud customer, you can also log in to the <a href="https://zitadel.com/admin">ZITADEL Customer Portal</a> and enable the Technical Advisory <a href="https://zitadel.com/admin/settings">Notifications</a> in your settings.
|
||||||
|
|
||||||
## Categories
|
## Categories
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ Also check if "block all cookies" is active. If so please disable this setting.
|
|||||||
|
|
||||||
To make sure, that your new settings will trigger, please restart your mobile phone and try it again.
|
To make sure, that your new settings will trigger, please restart your mobile phone and try it again.
|
||||||
|
|
||||||
**Settings > Safari > Advanced > Experimental Features > disable: „SameSite strict enforcement (ITP)“**
|
**Settings > Safari > Advanced > Experimental Features > disable: "SameSite strict enforcement (ITP)"**
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ End-users authenticate to an application in your frontend project.
|
|||||||
The frontend then sends requests to the backend, validates the token with ZITADEL's introspection endpoint, and returns a payload to the frontend.
|
The frontend then sends requests to the backend, validates the token with ZITADEL's introspection endpoint, and returns a payload to the frontend.
|
||||||
The backend returns the error `invalid audience (APP-Zxfako)`.
|
The backend returns the error `invalid audience (APP-Zxfako)`.
|
||||||
|
|
||||||
You must add the scope `urn:zitadel:iam:org:project:id:{projectId}:aud` to the auth request that is send from the front end.
|
You must add the scope `urn:zitadel:iam:org:project:id:{projectId}:aud` to the auth request that is sent from the front end.
|
||||||
Replace `projectId` with the projectId of your backend.
|
Replace `projectId` with the projectId of your backend.
|
||||||
|
|
||||||
### Accessing ZITADEL's APIs
|
### Accessing ZITADEL's APIs
|
||||||
@@ -59,7 +59,7 @@ You have a project for a frontend application.
|
|||||||
The application should also access the API of your ZITADEL, for example to pull a list of all users and display them on a user page.
|
The application should also access the API of your ZITADEL, for example to pull a list of all users and display them on a user page.
|
||||||
End-users authenticate to the application in the frontend project, but when calling the management API you get the error `invalid audience (APP-Zxfako)`.
|
End-users authenticate to the application in the frontend project, but when calling the management API you get the error `invalid audience (APP-Zxfako)`.
|
||||||
|
|
||||||
You must add the scope `urn:zitadel:iam:org:project:id:zitadel:aud` to the auth request that is send from the front end.
|
You must add the scope `urn:zitadel:iam:org:project:id:zitadel:aud` to the auth request that is sent from the front end.
|
||||||
|
|
||||||
When accessing your ZITADEL instance's APIs they act as a resource server.
|
When accessing your ZITADEL instance's APIs they act as a resource server.
|
||||||
You can check the Management Console or via API and see that when you open your default organization there exists a project "ZITADEL" that contains different applications for each API and the Console.
|
You can check the Management Console or via API and see that when you open your default organization there exists a project "ZITADEL" that contains different applications for each API and the Console.
|
||||||
@@ -68,11 +68,11 @@ Instead of `urn:zitadel:iam:org:project:id:zitadel:aud` you could also use `urn:
|
|||||||
|
|
||||||
## WebFinger requirement for Tailscale
|
## WebFinger requirement for Tailscale
|
||||||
|
|
||||||
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.
|
The WebFinger requirement and setup is a step a user has to take outside 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/).
|
The requirements and a set-up guide is detailed in the [Tailscale documentation](https://tailscale.com/kb/1240/sso-custom-oidc/).
|
||||||
|
|
||||||
## Login not possible. The organization of the user must be granted to the project
|
## Login not possible. The organization of the user must be granted to the project
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@ You do have two possibilities.
|
|||||||
1. Go to the organization, who owns the project, where the user tries to authenticate.
|
1. Go to the organization, who owns the project, where the user tries to authenticate.
|
||||||
2. Navigate to the Project Grants page of the needed project
|
2. Navigate to the Project Grants page of the needed project
|
||||||
3. Click on the "New" button
|
3. Click on the "New" button
|
||||||
4. Search for the organization to which you want to grant the project (e.g Organization B)
|
4. Search for the organization to which you want to grant the project (e.g. Organization B)
|
||||||
5. Select the roles you want to grant
|
5. Select the roles you want to grant
|
||||||
6. Click save
|
6. Click save
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user