mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 15:17:33 +00:00
Merge branch 'main' into docs_inconsistent_naming_organization_domain
This commit is contained in:
@@ -145,7 +145,7 @@ This object contains context information about the request to the [authorization
|
||||
- `requestedOrgDomain` *bool*
|
||||
- `applicationResourceOwner` *string*
|
||||
- `privateLabelingSetting` *Number*
|
||||
<ul><li>0: Unspecified</li><li>1: Enforce project resource owner policy</li><li>2: Allow login user resource owner policy</li></ul>
|
||||
<ul><li>0: Unspecified</li><li>1: Enforce project's policy</li><li>2: Allow user's organization login policy</li></ul>
|
||||
- `selectedIdpConfigId` *string*
|
||||
- `linkingUsers` Array of [*ExternalUser*](#external-user)
|
||||
- `passwordVerified` *bool*
|
||||
|
@@ -111,6 +111,6 @@ ZITADEL reserves some claims to assert certain data. Please check out the [reser
|
||||
| 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 client 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: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 id of the resource owner organisation of the user. |
|
||||
| urn:zitadel:iam:user:resourceowner:name | `{"urn:zitadel:iam:user:resourceowner:name": "ACME"}` | This claim represents the name of the resource owner organisation of the user. |
|
||||
| urn:zitadel:iam:user:resourceowner:primary_domain | `{"urn:zitadel:iam:user:resourceowner:primary_domain": "acme.ch"}` | This claim represents the primary domain of the resource owner organisation of the user. |
|
||||
| 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:primary_domain | `{"urn:zitadel:iam:user:resourceowner:primary_domain": "acme.ch"}` | This claim represents the user's organization's primary domain. |
|
||||
|
@@ -31,8 +31,8 @@ In addition to the standard compliant scopes we utilize the following scopes.
|
||||
| `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: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 projectid 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:{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: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 resource owner (the users 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. |
|
||||
|
@@ -77,8 +77,8 @@ You can choose from
|
||||
| Setting | Description |
|
||||
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| Unspecified | If nothing is specified the default will trigger. (System settings) |
|
||||
| Enforce project resource owner policy | This setting will enforce the private labeling of the organization (resource owner) of the project through the whole login process. |
|
||||
| Allow Login User resource owner policy | With this setting first the private labeling of the organization (resource owner) of the project will trigger. As soon as the user and its organization (resource owner) is identified by ZITADEL, the settings will change to the organization of the user. |
|
||||
| Enforce project's policy | This setting will enforce the private labeling of the organization of the project through the whole login process. |
|
||||
| Allow login user policy | With this setting first the private labeling of the organization of the project will trigger. As soon as the user and its organization is identified by ZITADEL, the settings will change to the organization of the user. |
|
||||
|
||||
In a B2B use case, you would typically use the organization setting. If you want to omit organization detection, you can preselect an organization with the [primary domain scope](/apis/openidoauth/scopes#reserved-scopes) (ex. `urn:zitadel:iam:org:domain:primary:{domainname}`).
|
||||
|
||||
|
@@ -80,7 +80,7 @@ curl --request POST \
|
||||
|
||||
| Field | Type | Description |
|
||||
| ---------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| org_ids | list of strings | provide a list of organizationIDs to select which organizations should be exported (eg, `[ "70669144072186707", "70671105999825752" ]`); leave empty to export all |
|
||||
| org_ids | list of strings | provide a list of Organization IDs to select which organizations should be exported (eg, `[ "70669144072186707", "70671105999825752" ]`); leave empty to export all |
|
||||
| excluded_org_ids | list of strings | to exclude several organization, if for example no organizations are selected |
|
||||
| with_passwords | bool | to include the hashed_passwords of the users in the export |
|
||||
| with_otp | bool | to include the OTP-code of the users in the export |
|
||||
@@ -143,7 +143,7 @@ curl --request POST \
|
||||
|
||||
| Field | Type | Description |
|
||||
| ---------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| org_ids | list of strings | provide a list of organizationIDs to select which organizations should be exported (eg, `[ "70669144072186707", "70671105999825752" ]`); leave empty to export all |
|
||||
| org_ids | list of strings | provide a list of Organization IDs to select which organizations should be exported (eg, `[ "70669144072186707", "70671105999825752" ]`); leave empty to export all |
|
||||
| excluded_org_ids | list of strings | to exclude several organization, if for example no organizations are selected |
|
||||
| with_passwords | bool | to include the hashed_passwords of the users in the export |
|
||||
| with_otp | bool | to include the OTP-code of the users in the export |
|
||||
|
@@ -43,7 +43,7 @@ In order to define the need of the **Portal Application** some planning consider
|
||||
|
||||
You can decide whether a organization is preselected for the login or if the user is redirected to the default login screen. Using OpenID Connect, you can send the user to a specific organization by defining the organization in a [reserved scope](/docs/apis/openidoauth/scopes#reserved-scopes) (primary domain).
|
||||
Settings to the branding or the login options of the organization can be made from the organization section in [Console](/docs/concepts/features/console).
|
||||
The behavior of the login branding can be set in your projects detail page. You can choose the branding of the selected organization, the user resource owner, or the projects resource owner.
|
||||
The behavior of the login branding can be set in your projects detail page. You can choose the branding of the selected organization, the user's organization, or the project's organization.
|
||||
|
||||
### Organizations
|
||||
|
||||
|
@@ -293,7 +293,7 @@ Excitingly, v3 introduces the foundational elements for Actions V2, opening up a
|
||||
|
||||
### v4.x
|
||||
|
||||
**Current State**: Implementation
|
||||
**Current State**: General Availability / Stable
|
||||
|
||||
|
||||
<details>
|
||||
@@ -311,9 +311,13 @@ Excitingly, v3 introduces the foundational elements for Actions V2, opening up a
|
||||
This change, along with standardized naming and improved documentation, will simplify integration, accelerate development, and create a more intuitive experience for our customers and community.
|
||||
|
||||
Resources integrated in this release:
|
||||
- Instances
|
||||
- Applications (in beta)
|
||||
- Authorizations (in beta)
|
||||
- Instances (in beta)
|
||||
- Organizations
|
||||
- Projects
|
||||
- Permissions (in beta)
|
||||
- Projects (in beta)
|
||||
- Settings (beta) now includes 3 new endpoints: `ListOrganizationSettings()`, `SetOrganizationSettings()` and `DeleteOrganizationSettings()`
|
||||
- Users
|
||||
|
||||
For more details read the [Github Issue](https://github.com/zitadel/zitadel/issues/6305)
|
||||
@@ -369,40 +373,123 @@ Excitingly, v3 introduces the foundational elements for Actions V2, opening up a
|
||||
|
||||
We're officially moving our new Login UI v2 from beta to General Availability.
|
||||
Starting now, it will be the default login experience for all new customers.
|
||||
With this release, 8.0we are also focused on implementing previously missing features, such as device authorization and LDAP IDP support, to make the new UI fully feature-complete.
|
||||
With this release, 8.0 we are also focused on implementing previously missing features, such as device authorization and LDAP IDP support, to make the new UI fully feature-complete.
|
||||
|
||||
- [Hosted Login V2](http://localhost:3000/docs/guides/integrate/login/hosted-login#hosted-login-version-2-beta)
|
||||
- [Hosted Login V2](../guides/integrate/login/hosted-login#hosted-login-version-2-beta)
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Web Keys</summary>
|
||||
<summary>Actions v2</summary>
|
||||
|
||||
Web Keys in ZITADEL are used to sign and verify JSON Web Tokens (JWT).
|
||||
ID tokens are created, signed and returned by ZITADEL when a OpenID connect (OIDC) or OAuth2 authorization flow completes and a user is authenticated.
|
||||
Based on customer and community feedback, we've updated our key management system. You now have full manual control over key generation and rotation, instead of the previous automatic process.
|
||||
This API enables you to manage custom executions and targets—formerly known as actions—across your entire ZITADEL instance.
|
||||
With Actions V2, you gain significantly more flexibility to tailor ZITADEL’s behavior compared to previous versions.
|
||||
Actions are now available instance-wide, eliminating the need to configure them for each organization individually.
|
||||
ZITADEL no longer restricts the implementation language, tooling, or runtime for action executions.
|
||||
Instead, you define external endpoints that are called by ZITADEL and maintained by you.
|
||||
|
||||
Read the full description about Web Keys in our [Documentation](https://zitadel.com/docs/guides/integrate/login/oidc/webkeys).
|
||||
- [Actions V2](../apis/resources/action_service_v2)
|
||||
</details>
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Deprecated endpoints</summary>
|
||||
|
||||
<Deprecated/>
|
||||
|
||||
<details>
|
||||
<summary>Organization Objects V1 > Users V1</summary>
|
||||
|
||||
- `AddMachineKey()`
|
||||
- `AddMachineUser()`
|
||||
- `AddPersonalAccessToken()`
|
||||
- `BulkRemoveUserMetadata()`
|
||||
- `BulkSetUserMetadata()`
|
||||
- `GenerateMachineSecret()`
|
||||
- `GetMachineKeyByIDs()`
|
||||
- `GetOrgByDomainGlobal()`
|
||||
- `GetPersonalAccessTokenByIDs()`
|
||||
- `GetUserMetadata()`
|
||||
- `ListAppKeys()`
|
||||
- `ListMachineKeys()`
|
||||
- `ListPersonalAccessTokens()`
|
||||
- `ListUserMetadata()`
|
||||
- `RemoveMachineKey()`
|
||||
- `RemoveMachineSecret()`
|
||||
- `RemovePersonalAccessToken()`
|
||||
- `RemoveUserMetadata()`
|
||||
- `SetUserMetadata()`
|
||||
- `UpdateHumanPhone()`
|
||||
- `UpdateMachine()`
|
||||
- `UpdateUserName()`
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>SCIM 2.0 Server - User Resource</summary>
|
||||
<summary>Projects V1</summary>
|
||||
|
||||
The Zitadel SCIM v2 service provider interface enables seamless integration of identity and access management (IAM) systems with Zitadel, following the System for Cross-domain Identity Management (SCIM) v2.0 specification.
|
||||
This interface allows standardized management of IAM resources, making it easier to automate user provisioning and deprovisioning.
|
||||
|
||||
- [SCIM 2.0 API](https://zitadel.com/docs/apis/scim2)
|
||||
- [Manage Users Guide](https://zitadel.com/docs/guides/manage/user/scim2)
|
||||
- `AddProject()`
|
||||
- `AddProjectGrant()`
|
||||
- `AddProjectRole()`
|
||||
- `BulkAddProjectRoles()`
|
||||
- `DeactivateProject()`
|
||||
- `DeactivateProjectGrant()`
|
||||
- `GetGrantedProjectByID()`
|
||||
- `GetProjectByID()`
|
||||
- `GetProjectGrantByID()`
|
||||
- `ListAllProjectGrants()`
|
||||
- `ListGrantedProjectRoles()`
|
||||
- `ListGrantedProjects()`
|
||||
- `ListProjectGrants()`
|
||||
- `ListProjectRoles()`
|
||||
- `ListProjects()`
|
||||
- `ReactivateProject()`
|
||||
- `ReactivateProjectGrant()`
|
||||
- `RemoveProject()`
|
||||
- `RemoveProjectGrant()`
|
||||
- `RemoveProjectRole()`
|
||||
- `UpdateProject()`
|
||||
- `UpdateProjectGrant()`
|
||||
- `UpdateProjectRole()`
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Caches</summary>
|
||||
<summary>Members V1</summary>
|
||||
|
||||
ZITADEL supports the use of a caches to speed up the lookup of frequently needed objects.
|
||||
As opposed to HTTP caches which might reside between ZITADEL and end-user applications, the cache build into ZITADEL uses active invalidation when an object gets updated.
|
||||
Another difference is that HTTP caches only cache the result of a complete request and the built-in cache stores objects needed for the internal business logic.
|
||||
For example, each request made to ZITADEL needs to retrieve and set instance information in middleware.
|
||||
- `AddIAMMember()`
|
||||
- `AddOrgMember()`
|
||||
- `AddProjectGrantMember()`
|
||||
- `AddProjectMember()`
|
||||
- `ListIAMMembers()`
|
||||
- `ListOrgMembers()`
|
||||
- `ListProjectGrantMembers()`
|
||||
- `ListProjectMembers()`
|
||||
- `ListUserMemberships()`
|
||||
- `RemoveIAMMember()`
|
||||
- `RemoveOrgMember()`
|
||||
- `RemoveProjectGrantMember()`
|
||||
- `RemoveProjectMember()`
|
||||
- `UpdateIAMMember()`
|
||||
- `UpdateOrgMember()`
|
||||
- `UpdateProjectGrantMember()`
|
||||
- `UpdateProjectMember()`
|
||||
</details>
|
||||
|
||||
Read more about Zitadel Caches [here](https://zitadel.com/docs/self-hosting/manage/cache)
|
||||
<details>
|
||||
<summary>Instance Lifecycle V1 > System Service V1</summary>
|
||||
|
||||
- `AddInstanceTrustedDomain()`
|
||||
- `GetMyInstance()`
|
||||
- `ListInstanceDomains()`
|
||||
- `ListInstanceTrustedDomains()`
|
||||
- `RemoveInstanceTrustedDomain()`
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Instance Objects V1 > Organizations V1 </summary>
|
||||
|
||||
- `GetDefaultOrg()`
|
||||
- `GetOrgByID()`
|
||||
- `IsOrgUnique()`
|
||||
</details>
|
||||
</details>
|
||||
|
||||
|
@@ -111,7 +111,7 @@ export function SetAuthRequest() {
|
||||
"urn:zitadel:iam:org:project:id:zitadel:aud",
|
||||
"urn:zitadel:iam:user:metadata",
|
||||
`urn:zitadel:iam:org:id:${
|
||||
organizationId ? organizationId : "[organizationId]"
|
||||
organizationId ? organizationId : "[Organization ID]"
|
||||
}`,
|
||||
];
|
||||
|
||||
@@ -525,7 +525,7 @@ export function SetAuthRequest() {
|
||||
const value = event.target.value;
|
||||
setOrganizationId(value);
|
||||
allScopes[7] = `urn:zitadel:iam:org:id:${
|
||||
value ? value : "[organizationId]"
|
||||
value ? value : "[Organization ID]"
|
||||
}`;
|
||||
toggleScope(8, true);
|
||||
setScope(
|
||||
|
@@ -6,6 +6,7 @@ import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/beevik/etree"
|
||||
@@ -75,21 +76,31 @@ func (s *Session) FetchUser(ctx context.Context) (user idp.User, err error) {
|
||||
return nil, zerrors.ThrowInvalidArgument(err, "SAML-nuo0vphhh9", "Errors.Intent.ResponseInvalid")
|
||||
}
|
||||
|
||||
userMapper := NewUser()
|
||||
// nameID is required, but at least in ADFS it will not be sent unless explicitly configured
|
||||
if s.Assertion.Subject == nil || s.Assertion.Subject.NameID == nil {
|
||||
return nil, zerrors.ThrowInvalidArgument(err, "SAML-EFG32", "Errors.Intent.ResponseInvalid")
|
||||
}
|
||||
nameID := s.Assertion.Subject.NameID
|
||||
userMapper := NewUser()
|
||||
// use the nameID as default mapping id
|
||||
userMapper.SetID(nameID.Value)
|
||||
if nameID.Format == string(saml.TransientNameIDFormat) {
|
||||
if strings.TrimSpace(s.TransientMappingAttributeName) == "" {
|
||||
return nil, zerrors.ThrowInvalidArgument(err, "SAML-EFG32", "Errors.Intent.MissingTransientMappingAttributeName")
|
||||
}
|
||||
// workaround to use the transient mapping attribute when the subject / nameID are missing (e.g. in ADFS, Shibboleth)
|
||||
mappingID, err := s.transientMappingID()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
userMapper.SetID(mappingID)
|
||||
} else {
|
||||
nameID := s.Assertion.Subject.NameID
|
||||
// use the nameID as default mapping id
|
||||
userMapper.SetID(nameID.Value)
|
||||
if nameID.Format == string(saml.TransientNameIDFormat) {
|
||||
mappingID, err := s.transientMappingID()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
userMapper.SetID(mappingID)
|
||||
}
|
||||
}
|
||||
|
||||
for _, statement := range s.Assertion.AttributeStatements {
|
||||
for _, attribute := range statement.Attributes {
|
||||
values := make([]string, len(attribute.Values))
|
||||
|
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user