Merge branch 'main' into notification-links

This commit is contained in:
Elio Bischof
2023-09-25 11:29:18 +02:00
244 changed files with 3748 additions and 1628 deletions

View File

@@ -595,7 +595,7 @@ DefaultInstance:
MaxAgeDays: 0 # ZITADEL_DEFAULTINSTANCE_PASSWORDAGEPOLICY_MAXAGEDAYS MaxAgeDays: 0 # ZITADEL_DEFAULTINSTANCE_PASSWORDAGEPOLICY_MAXAGEDAYS
DomainPolicy: DomainPolicy:
UserLoginMustBeDomain: false # ZITADEL_DEFAULTINSTANCE_DOMAINPOLICY_USERLOGINMUSTBEDOMAIN UserLoginMustBeDomain: false # ZITADEL_DEFAULTINSTANCE_DOMAINPOLICY_USERLOGINMUSTBEDOMAIN
ValidateOrgDomains: true # ZITADEL_DEFAULTINSTANCE_DOMAINPOLICY_VALIDATEORGDOMAINS ValidateOrgDomains: false # ZITADEL_DEFAULTINSTANCE_DOMAINPOLICY_VALIDATEORGDOMAINS
SMTPSenderAddressMatchesInstanceDomain: false # ZITADEL_DEFAULTINSTANCE_DOMAINPOLICY_SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN SMTPSenderAddressMatchesInstanceDomain: false # ZITADEL_DEFAULTINSTANCE_DOMAINPOLICY_SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN
LoginPolicy: LoginPolicy:
AllowUsernamePassword: true # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_ALLOWUSERNAMEPASSWORD AllowUsernamePassword: true # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_ALLOWUSERNAMEPASSWORD
@@ -604,7 +604,7 @@ DefaultInstance:
ForceMFA: false # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_FORCEMFA ForceMFA: false # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_FORCEMFA
HidePasswordReset: false # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_HIDEPASSWORDRESET HidePasswordReset: false # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_HIDEPASSWORDRESET
IgnoreUnknownUsernames: false # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_IGNOREUNKNOWNUSERNAMES IgnoreUnknownUsernames: false # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_IGNOREUNKNOWNUSERNAMES
AllowDomainDiscovery: false # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_ALLOWDOMAINDISCOVERY AllowDomainDiscovery: true # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_ALLOWDOMAINDISCOVERY
# 1 is allowed, 0 is not allowed # 1 is allowed, 0 is not allowed
PasswordlessType: 1 # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_PASSWORDLESSTYPE PasswordlessType: 1 # ZITADEL_DEFAULTINSTANCE_LOGINPOLICY_PASSWORDLESSTYPE
# DefaultRedirectURL is empty by default because we use the Console UI # DefaultRedirectURL is empty by default because we use the Console UI

26
cmd/setup/13.go Normal file
View File

@@ -0,0 +1,26 @@
package setup
import (
"context"
_ "embed"
"github.com/zitadel/zitadel/internal/database"
)
var (
//go:embed 13/13_fix_quota_constraints.sql
fixQuotaConstraints string
)
type FixQuotaConstraints struct {
dbClient *database.DB
}
func (mig *FixQuotaConstraints) Execute(ctx context.Context) error {
_, err := mig.dbClient.ExecContext(ctx, fixQuotaConstraints)
return err
}
func (mig *FixQuotaConstraints) String() string {
return "13_fix_quota_constraints"
}

View File

@@ -0,0 +1,4 @@
ALTER TABLE IF EXISTS projections.quotas ALTER COLUMN from_anchor DROP NOT NULL;
ALTER TABLE IF EXISTS projections.quotas ALTER COLUMN amount DROP NOT NULL;
ALTER TABLE IF EXISTS projections.quotas ALTER COLUMN interval DROP NOT NULL;
ALTER TABLE IF EXISTS projections.quotas ALTER COLUMN limit_usage DROP NOT NULL;

View File

@@ -56,18 +56,19 @@ func MustNewConfig(v *viper.Viper) *Config {
} }
type Steps struct { type Steps struct {
s1ProjectionTable *ProjectionTable s1ProjectionTable *ProjectionTable
s2AssetsTable *AssetTable s2AssetsTable *AssetTable
FirstInstance *FirstInstance FirstInstance *FirstInstance
s4EventstoreIndexes *EventstoreIndexesNew s4EventstoreIndexes *EventstoreIndexesNew
s5LastFailed *LastFailed s5LastFailed *LastFailed
s6OwnerRemoveColumns *OwnerRemoveColumns s6OwnerRemoveColumns *OwnerRemoveColumns
s7LogstoreTables *LogstoreTables s7LogstoreTables *LogstoreTables
s8AuthTokens *AuthTokenIndexes s8AuthTokens *AuthTokenIndexes
s9EventstoreIndexes2 *EventstoreIndexesNew s9EventstoreIndexes2 *EventstoreIndexesNew
CorrectCreationDate *CorrectCreationDate CorrectCreationDate *CorrectCreationDate
AddEventCreatedAt *AddEventCreatedAt AddEventCreatedAt *AddEventCreatedAt
s12AddOTPColumns *AddOTPColumns s12AddOTPColumns *AddOTPColumns
s13FixQuotaProjection *FixQuotaConstraints
} }
type encryptionKeyConfig struct { type encryptionKeyConfig struct {

View File

@@ -95,6 +95,7 @@ func Setup(config *Config, steps *Steps, masterKey string) {
steps.AddEventCreatedAt.dbClient = dbClient steps.AddEventCreatedAt.dbClient = dbClient
steps.AddEventCreatedAt.step10 = steps.CorrectCreationDate steps.AddEventCreatedAt.step10 = steps.CorrectCreationDate
steps.s12AddOTPColumns = &AddOTPColumns{dbClient: dbClient} steps.s12AddOTPColumns = &AddOTPColumns{dbClient: dbClient}
steps.s13FixQuotaProjection = &FixQuotaConstraints{dbClient: dbClient}
err = projection.Create(ctx, dbClient, eventstoreClient, config.Projections, nil, nil) err = projection.Create(ctx, dbClient, eventstoreClient, config.Projections, nil, nil)
logging.OnError(err).Fatal("unable to start projections") logging.OnError(err).Fatal("unable to start projections")
@@ -137,6 +138,8 @@ func Setup(config *Config, steps *Steps, masterKey string) {
logging.OnError(err).Fatal("unable to migrate step 11") logging.OnError(err).Fatal("unable to migrate step 11")
err = migration.Migrate(ctx, eventstoreClient, steps.s12AddOTPColumns) err = migration.Migrate(ctx, eventstoreClient, steps.s12AddOTPColumns)
logging.OnError(err).Fatal("unable to migrate step 12") logging.OnError(err).Fatal("unable to migrate step 12")
err = migration.Migrate(ctx, eventstoreClient, steps.s13FixQuotaProjection)
logging.OnError(err).Fatal("unable to migrate step 13")
for _, repeatableStep := range repeatableSteps { for _, repeatableStep := range repeatableSteps {
err = migration.Migrate(ctx, eventstoreClient, repeatableStep) err = migration.Migrate(ctx, eventstoreClient, repeatableStep)

View File

@@ -195,7 +195,7 @@
</a> </a>
</div> </div>
<ng-container *ngIf="user"> <ng-container *ngIf="user && user.id">
<div class="account-card-wrapper"> <div class="account-card-wrapper">
<button <button
cdkOverlayOrigin cdkOverlayOrigin

View File

@@ -18,7 +18,7 @@
<ng-container *ngIf="currentSetting === 'login'"> <ng-container *ngIf="currentSetting === 'login'">
<cnsl-login-policy [serviceType]="serviceType"></cnsl-login-policy> <cnsl-login-policy [serviceType]="serviceType"></cnsl-login-policy>
</ng-container> </ng-container>
<ng-container *ngIf="currentSetting === 'domain'"> <ng-container *ngIf="currentSetting === 'domain' && (['iam.policy.write'] | hasRole | async) === true">
<cnsl-domain-policy [serviceType]="serviceType"></cnsl-domain-policy> <cnsl-domain-policy [serviceType]="serviceType"></cnsl-domain-policy>
</ng-container> </ng-container>
<ng-container *ngIf="currentSetting === 'idp'"> <ng-container *ngIf="currentSetting === 'idp'">

View File

@@ -48,8 +48,8 @@ export const DOMAIN: SidenavSetting = {
i18nKey: 'SETTINGS.LIST.DOMAIN', i18nKey: 'SETTINGS.LIST.DOMAIN',
groupI18nKey: 'SETTINGS.GROUPS.DOMAIN', groupI18nKey: 'SETTINGS.GROUPS.DOMAIN',
requiredRoles: { requiredRoles: {
[PolicyComponentServiceType.MGMT]: ['policy.read'], [PolicyComponentServiceType.MGMT]: ['iam.policy.write'],
[PolicyComponentServiceType.ADMIN]: ['iam.policy.read'], [PolicyComponentServiceType.ADMIN]: ['iam.policy.write'],
}, },
}; };

View File

@@ -28,11 +28,6 @@
<button <button
(click)="value = setting.id" (click)="value = setting.id"
*ngIf="
!setting.requiredRoles ||
(setting.requiredRoles.mgmt && (setting.requiredRoles.mgmt | hasRole | async)) ||
(setting.requiredRoles.admin && (setting.requiredRoles.admin | hasRole | async))
"
class="sidenav-setting-list-element hide-on-mobile" class="sidenav-setting-list-element hide-on-mobile"
[ngClass]="{ active: currentSetting === setting.id, show: currentSetting === undefined }" [ngClass]="{ active: currentSetting === setting.id, show: currentSetting === undefined }"
[attr.data-e2e]="'sidenav-element-' + setting.id" [attr.data-e2e]="'sidenav-element-' + setting.id"

View File

@@ -48,7 +48,7 @@
<button <button
mat-icon-button mat-icon-button
[disabled]="(canwrite$ | async) === false || domain.isVerified" [disabled]="(canwrite$ | async) === false || domain.isVerified"
*ngIf="canwrite$ | async" *ngIf="(canwrite$ | async) && verifyOrgDomains"
(click)="verifyDomain(domain)" (click)="verifyDomain(domain)"
> >
<i class="las la-pen"></i> <i class="las la-pen"></i>

View File

@@ -19,6 +19,7 @@ export class DomainsComponent implements OnInit {
public domains: Domain.AsObject[] = []; public domains: Domain.AsObject[] = [];
public primaryDomain: string = ''; public primaryDomain: string = '';
public InfoSectionType: any = InfoSectionType; public InfoSectionType: any = InfoSectionType;
public verifyOrgDomains: boolean | undefined;
constructor( constructor(
private mgmtService: ManagementService, private mgmtService: ManagementService,
@@ -38,6 +39,10 @@ export class DomainsComponent implements OnInit {
} }
public loadDomains(): void { public loadDomains(): void {
this.mgmtService.getDomainPolicy().then((result) => {
this.verifyOrgDomains = result.policy?.validateOrgDomains;
});
this.mgmtService.listOrgDomains().then((result) => { this.mgmtService.listOrgDomains().then((result) => {
this.domains = result.resultList; this.domains = result.resultList;
this.primaryDomain = this.domains.find((domain) => domain.isPrimary)?.domainName ?? ''; this.primaryDomain = this.domains.find((domain) => domain.isPrimary)?.domainName ?? '';
@@ -68,13 +73,14 @@ export class DomainsComponent implements OnInit {
.addOrgDomain(domainName) .addOrgDomain(domainName)
.then(() => { .then(() => {
this.toast.showInfo('ORG.TOAST.DOMAINADDED', true); this.toast.showInfo('ORG.TOAST.DOMAINADDED', true);
this.verifyDomain({ if (this.verifyOrgDomains) {
domainName: domainName, this.verifyDomain({
validationType: DomainValidationType.DOMAIN_VALIDATION_TYPE_UNSPECIFIED, domainName: domainName,
}); validationType: DomainValidationType.DOMAIN_VALIDATION_TYPE_UNSPECIFIED,
setTimeout(() => { });
} else {
this.loadDomains(); this.loadDomains();
}, 1000); }
}) })
.catch((error) => { .catch((error) => {
this.toast.showError(error); this.toast.showError(error);
@@ -120,10 +126,8 @@ export class DomainsComponent implements OnInit {
width: '500px', width: '500px',
}); });
dialogRef.afterClosed().subscribe((reload: boolean) => { dialogRef.afterClosed().subscribe(() => {
if (reload) { this.loadDomains();
this.loadDomains();
}
}); });
} }
} }

View File

@@ -1,10 +1,11 @@
import { Component, OnDestroy } from '@angular/core'; import { Component, OnDestroy, OnInit } from '@angular/core';
import { ActivatedRoute, Params } from '@angular/router'; import { ActivatedRoute, Params } from '@angular/router';
import { Subject, takeUntil } from 'rxjs'; import { Subject, takeUntil } from 'rxjs';
import { PolicyComponentServiceType } from 'src/app/modules/policies/policy-component-types.enum'; import { PolicyComponentServiceType } from 'src/app/modules/policies/policy-component-types.enum';
import { SidenavSetting } from 'src/app/modules/sidenav/sidenav.component'; import { SidenavSetting } from 'src/app/modules/sidenav/sidenav.component';
import { Breadcrumb, BreadcrumbService, BreadcrumbType } from 'src/app/services/breadcrumb.service'; import { Breadcrumb, BreadcrumbService, BreadcrumbType } from 'src/app/services/breadcrumb.service';
import { GrpcAuthService } from 'src/app/services/grpc-auth.service';
import { import {
BRANDING, BRANDING,
COMPLEXITY, COMPLEXITY,
@@ -21,16 +22,17 @@ import {
SECRETS, SECRETS,
SECURITY, SECURITY,
} from '../../modules/settings-list/settings'; } from '../../modules/settings-list/settings';
import { checkSettingsPermissions } from '../org-settings/org-settings.component';
@Component({ @Component({
selector: 'cnsl-instance-settings', selector: 'cnsl-instance-settings',
templateUrl: './instance-settings.component.html', templateUrl: './instance-settings.component.html',
styleUrls: ['./instance-settings.component.scss'], styleUrls: ['./instance-settings.component.scss'],
}) })
export class InstanceSettingsComponent implements OnDestroy { export class InstanceSettingsComponent implements OnInit, OnDestroy {
public id: string = ''; public id: string = '';
public PolicyComponentServiceType: any = PolicyComponentServiceType; public PolicyComponentServiceType: any = PolicyComponentServiceType;
public settingsList: SidenavSetting[] = [ public defaultSettingsList: SidenavSetting[] = [
GENERAL, GENERAL,
// notifications // notifications
// { showWarn: true, ...NOTIFICATIONS }, // { showWarn: true, ...NOTIFICATIONS },
@@ -53,8 +55,10 @@ export class InstanceSettingsComponent implements OnDestroy {
SECURITY, SECURITY,
]; ];
public settingsList: SidenavSetting[] = [];
private destroy$: Subject<void> = new Subject(); private destroy$: Subject<void> = new Subject();
constructor(breadcrumbService: BreadcrumbService, activatedRoute: ActivatedRoute) { constructor(breadcrumbService: BreadcrumbService, activatedRoute: ActivatedRoute, public authService: GrpcAuthService) {
const breadcrumbs = [ const breadcrumbs = [
new Breadcrumb({ new Breadcrumb({
type: BreadcrumbType.INSTANCE, type: BreadcrumbType.INSTANCE,
@@ -72,6 +76,16 @@ export class InstanceSettingsComponent implements OnDestroy {
}); });
} }
ngOnInit(): void {
checkSettingsPermissions(this.defaultSettingsList, PolicyComponentServiceType.ADMIN, this.authService).subscribe(
(allowed) => {
this.settingsList = this.defaultSettingsList.filter((setting, index) => {
return allowed[index];
});
},
);
}
ngOnDestroy(): void { ngOnDestroy(): void {
this.destroy$.next(); this.destroy$.next();
this.destroy$.complete(); this.destroy$.complete();

View File

@@ -1,10 +1,11 @@
import { Component } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Params } from '@angular/router'; import { ActivatedRoute, Params } from '@angular/router';
import { take } from 'rxjs'; import { forkJoin, of, take } from 'rxjs';
import { PolicyComponentServiceType } from 'src/app/modules/policies/policy-component-types.enum'; import { PolicyComponentServiceType } from 'src/app/modules/policies/policy-component-types.enum';
import { SidenavSetting } from 'src/app/modules/sidenav/sidenav.component'; import { SidenavSetting } from 'src/app/modules/sidenav/sidenav.component';
import { Breadcrumb, BreadcrumbService, BreadcrumbType } from 'src/app/services/breadcrumb.service'; import { Breadcrumb, BreadcrumbService, BreadcrumbType } from 'src/app/services/breadcrumb.service';
import { GrpcAuthService } from 'src/app/services/grpc-auth.service';
import { import {
BRANDING, BRANDING,
COMPLEXITY, COMPLEXITY,
@@ -23,10 +24,11 @@ import {
templateUrl: './org-settings.component.html', templateUrl: './org-settings.component.html',
styleUrls: ['./org-settings.component.scss'], styleUrls: ['./org-settings.component.scss'],
}) })
export class OrgSettingsComponent { export class OrgSettingsComponent implements OnInit {
public id: string = ''; public id: string = '';
public PolicyComponentServiceType: any = PolicyComponentServiceType; public PolicyComponentServiceType: any = PolicyComponentServiceType;
public settingsList: SidenavSetting[] = [
private defaultSettingsList: SidenavSetting[] = [
LOGIN, LOGIN,
IDP, IDP,
COMPLEXITY, COMPLEXITY,
@@ -39,7 +41,9 @@ export class OrgSettingsComponent {
PRIVACYPOLICY, PRIVACYPOLICY,
]; ];
constructor(breadcrumbService: BreadcrumbService, activatedRoute: ActivatedRoute) { public settingsList: SidenavSetting[] = [];
constructor(breadcrumbService: BreadcrumbService, activatedRoute: ActivatedRoute, public authService: GrpcAuthService) {
const breadcrumbs = [ const breadcrumbs = [
new Breadcrumb({ new Breadcrumb({
type: BreadcrumbType.ORG, type: BreadcrumbType.ORG,
@@ -55,4 +59,42 @@ export class OrgSettingsComponent {
} }
}); });
} }
ngOnInit(): void {
checkSettingsPermissions(this.defaultSettingsList, PolicyComponentServiceType.MGMT, this.authService).subscribe(
(allowed) => {
this.settingsList = this.defaultSettingsList.filter((setting, index) => {
return allowed[index];
});
},
);
}
}
// Return a Observables<boolean>[] that will wait till all service calls are finished to then check if user is allowed to see a setting
export function checkSettingsPermissions(settings: SidenavSetting[], serviceType: string, authService: GrpcAuthService) {
return forkJoin(
settings
.filter((setting) => {
if (serviceType === PolicyComponentServiceType.ADMIN) {
return setting.requiredRoles && setting.requiredRoles.admin;
} else {
return setting.requiredRoles && setting.requiredRoles.mgmt;
}
})
.map((setting) => {
if (!setting.requiredRoles) {
return of(true);
}
if (!setting.requiredRoles.mgmt) {
return of(true);
}
if (setting.requiredRoles.mgmt) {
return authService.isAllowed(setting.requiredRoles.mgmt).pipe(take(1));
}
return of(false);
}),
);
} }

View File

@@ -78,7 +78,7 @@
<ng-container *ngIf="currentSetting === 'general'"> <ng-container *ngIf="currentSetting === 'general'">
<ng-template cnslHasRole [hasRole]="['user.read$', 'user.read:' + user.id]"> <ng-template cnslHasRole [hasRole]="['user.read$', 'user.read:' + user.id]">
<cnsl-card *ngIf="user.human" title="{{ 'USER.PROFILE.TITLE' | translate }}"> <cnsl-card *ngIf="user.human" title="{{ user.preferredLoginName }} - {{ 'USER.PROFILE.TITLE' | translate }}">
<cnsl-detail-form <cnsl-detail-form
[preferredLoginName]="user.preferredLoginName" [preferredLoginName]="user.preferredLoginName"
[disabled]="(canWrite$ | async) === false" [disabled]="(canWrite$ | async) === false"

View File

@@ -124,6 +124,20 @@
</td> </td>
</ng-container> </ng-container>
<ng-container matColumnDef="preferredLoginName">
<th
mat-header-cell
*matHeaderCellDef
mat-sort-header
[ngClass]="{ 'search-active': this.userSearchKey === UserListSearchKey.DISPLAY_NAME }"
>
{{ 'USER.PROFILE.PREFERREDLOGINNAME' | translate }}
</th>
<td mat-cell *matCellDef="let user" [routerLink]="user.id ? ['/users', user.id] : null">
<span *ngIf="user.human">{{ user.preferredLoginName }}</span>
</td>
</ng-container>
<ng-container matColumnDef="username"> <ng-container matColumnDef="username">
<th <th
mat-header-cell mat-header-cell

View File

@@ -51,7 +51,7 @@ export class UserTableComponent implements OnInit {
@Input() public displayedColumnsHuman: string[] = [ @Input() public displayedColumnsHuman: string[] = [
'select', 'select',
'displayName', 'displayName',
'username', 'preferredLoginName',
'email', 'email',
'state', 'state',
'creationDate', 'creationDate',
@@ -194,6 +194,10 @@ export class UserTableComponent implements OnInit {
case 'username': case 'username':
sortingField = UserFieldName.USER_FIELD_NAME_USER_NAME; sortingField = UserFieldName.USER_FIELD_NAME_USER_NAME;
break; break;
case 'preferredLoginName':
// TODO: replace with preferred username sorting once implemented
sortingField = UserFieldName.USER_FIELD_NAME_USER_NAME;
break;
case 'email': case 'email':
sortingField = UserFieldName.USER_FIELD_NAME_EMAIL; sortingField = UserFieldName.USER_FIELD_NAME_EMAIL;
break; break;

View File

@@ -489,6 +489,7 @@
"LASTNAME": "Фамилия", "LASTNAME": "Фамилия",
"NICKNAME": "Псевдоним", "NICKNAME": "Псевдоним",
"DISPLAYNAME": "Екранно име", "DISPLAYNAME": "Екранно име",
"PREFERREDLOGINNAME": "Предпочитано име за вход",
"PREFERRED_LANGUAGE": "език", "PREFERRED_LANGUAGE": "език",
"GENDER": "Пол", "GENDER": "Пол",
"PASSWORD": "Парола", "PASSWORD": "Парола",
@@ -789,7 +790,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "Статус", "STATE": "Статус",
"DOMAINLIST": "Домейни" "DOMAINLIST": "Лични домейни"
}, },
"STATE": { "STATE": {
"0": "Неуточнено", "0": "Неуточнено",
@@ -1344,7 +1345,7 @@
"MAXAGEDAYS": "Максимална възраст в дни", "MAXAGEDAYS": "Максимална възраст в дни",
"USERLOGINMUSTBEDOMAIN": "Добавяне на домейн на организация като суфикс към имената за вход", "USERLOGINMUSTBEDOMAIN": "Добавяне на домейн на организация като суфикс към имената за вход",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Ако активирате тази настройка, всички имена за вход ще имат суфикс с домейна на организацията. ", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Ако активирате тази настройка, всички имена за вход ще имат суфикс с домейна на организацията. ",
"VALIDATEORGDOMAINS": "Валидиране на организационни домейни", "VALIDATEORGDOMAINS": "Верификация на домейна на организацията е необходима (DNS или HTTP предизвикателство)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP адресът на изпращача съвпада с домейна на екземпляра", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP адресът на изпращача съвпада с домейна на екземпляра",
"ALLOWUSERNAMEPASSWORD": "Потребителско име Паролата е разрешена", "ALLOWUSERNAMEPASSWORD": "Потребителско име Паролата е разрешена",
"ALLOWEXTERNALIDP": "Допуска се външен IDP", "ALLOWEXTERNALIDP": "Допуска се външен IDP",

View File

@@ -495,6 +495,7 @@
"LASTNAME": "Nachname", "LASTNAME": "Nachname",
"NICKNAME": "Spitzname", "NICKNAME": "Spitzname",
"DISPLAYNAME": "Anzeigename", "DISPLAYNAME": "Anzeigename",
"PREFERREDLOGINNAME": "Bevorzugter Anmeldename",
"PREFERRED_LANGUAGE": "Sprache", "PREFERRED_LANGUAGE": "Sprache",
"GENDER": "Geschlecht", "GENDER": "Geschlecht",
"PASSWORD": "Passwort", "PASSWORD": "Passwort",
@@ -795,7 +796,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "Status", "STATE": "Status",
"DOMAINLIST": "Domains" "DOMAINLIST": "Custom Domains"
}, },
"STATE": { "STATE": {
"0": "Unspezifisch", "0": "Unspezifisch",
@@ -953,15 +954,15 @@
"DOMAINS": { "DOMAINS": {
"NEW": "Domain hinzufügen", "NEW": "Domain hinzufügen",
"TITLE": "Domänen", "TITLE": "Domänen",
"DESCRIPTION": "Konfiguriere die Domains, mit denen sich Deine Benutzer anmelden können.", "DESCRIPTION": "Konfiguriere die Domains, die für Domain discovery und als Suffix für die Benutzer verwendet werden können.",
"SETPRIMARY": "Primäre Domain setzen", "SETPRIMARY": "Primäre Domain setzen",
"DELETE": { "DELETE": {
"TITLE": "Domain löschen?", "TITLE": "Domain löschen?",
"DESCRIPTION": "Du bist im Begriff, eine Domain aus Deiner Organisation zu löschen. Deine Benutzer können diese nach dem Löschen nicht mehr für den Login nutzen." "DESCRIPTION": "Du bist im Begriff, eine Domain aus deiner Organisation zu löschen."
}, },
"ADD": { "ADD": {
"TITLE": "Domain hinzufügen", "TITLE": "Domain hinzufügen",
"DESCRIPTION": "Du bist im Begriff, Deiner Organisation eine Domain hinzuzufügen. Deine Benutzer können diese nach der erfolgreichen Ausführung für den Login nutzen." "DESCRIPTION": "Du bist im Begriff, Deiner Organisation eine Domain hinzuzufügen. Die Domain kann für Domain discovery genutzt werden und als Suffix für deine Benutzernamen."
} }
}, },
"STATE": { "STATE": {
@@ -1350,7 +1351,7 @@
"MAXAGEDAYS": "Maximale Gültigkeit in Tagen", "MAXAGEDAYS": "Maximale Gültigkeit in Tagen",
"USERLOGINMUSTBEDOMAIN": "Organisationsdomain dem Loginname hinzufügen", "USERLOGINMUSTBEDOMAIN": "Organisationsdomain dem Loginname hinzufügen",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "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.", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "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.",
"VALIDATEORGDOMAINS": "Org Domains validieren", "VALIDATEORGDOMAINS": "Verifizierung des Organisations Domain erforderlich (DNS- oder HTTP-Herausforderung)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP Sender Adresse entspricht Instanzdomain", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP Sender Adresse entspricht Instanzdomain",
"ALLOWUSERNAMEPASSWORD": "Benutzername Passwort erlaubt", "ALLOWUSERNAMEPASSWORD": "Benutzername Passwort erlaubt",
"ALLOWEXTERNALIDP": "Externer IDP erlaubt", "ALLOWEXTERNALIDP": "Externer IDP erlaubt",

View File

@@ -496,6 +496,7 @@
"LASTNAME": "Family Name", "LASTNAME": "Family Name",
"NICKNAME": "Nickname", "NICKNAME": "Nickname",
"DISPLAYNAME": "Display Name", "DISPLAYNAME": "Display Name",
"PREFERREDLOGINNAME": "Preferred login name",
"PREFERRED_LANGUAGE": "Language", "PREFERRED_LANGUAGE": "Language",
"GENDER": "Gender", "GENDER": "Gender",
"PASSWORD": "Password", "PASSWORD": "Password",
@@ -796,7 +797,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "Status", "STATE": "Status",
"DOMAINLIST": "Domains" "DOMAINLIST": "Custom Domains"
}, },
"STATE": { "STATE": {
"0": "Unspecified", "0": "Unspecified",
@@ -954,15 +955,15 @@
"DOMAINS": { "DOMAINS": {
"NEW": "Add Domain", "NEW": "Add Domain",
"TITLE": "Domains", "TITLE": "Domains",
"DESCRIPTION": "Configure your domains. This domain can be used to log in with your users.", "DESCRIPTION": "Configure your organization domains. This domain can be used for domain discovery and username suffixing.",
"SETPRIMARY": "Set as Primary", "SETPRIMARY": "Set as Primary",
"DELETE": { "DELETE": {
"TITLE": "Delete Domain", "TITLE": "Delete Domain",
"DESCRIPTION": "You are about to delete one of your domains. Note that your users can no longer use this domain for their login." "DESCRIPTION": "You are about to delete one of your domains."
}, },
"ADD": { "ADD": {
"TITLE": "Add Domain", "TITLE": "Add Domain",
"DESCRIPTION": "You are about to add a domain for your organization. After successful process, you users will be able to use the domain for their login." "DESCRIPTION": "You are about to add a domain for your organization. After successful process, the domain can be used for domain discovery and as suffix for your users."
} }
}, },
"STATE": { "STATE": {
@@ -1351,7 +1352,7 @@
"MAXAGEDAYS": "Max Age in days", "MAXAGEDAYS": "Max Age in days",
"USERLOGINMUSTBEDOMAIN": "Add organization domain as suffix to loginnames", "USERLOGINMUSTBEDOMAIN": "Add organization domain as suffix to loginnames",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "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.", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "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.",
"VALIDATEORGDOMAINS": "Validate Org domains", "VALIDATEORGDOMAINS": "Organization domain verification required (DNS or HTTP challenge)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP Sender Address matches Instance Domain", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP Sender Address matches Instance Domain",
"ALLOWUSERNAMEPASSWORD": "Username Password allowed", "ALLOWUSERNAMEPASSWORD": "Username Password allowed",
"ALLOWEXTERNALIDP": "External IDP allowed", "ALLOWEXTERNALIDP": "External IDP allowed",

View File

@@ -496,6 +496,7 @@
"LASTNAME": "Apellidos", "LASTNAME": "Apellidos",
"NICKNAME": "Apodo", "NICKNAME": "Apodo",
"DISPLAYNAME": "Nombre mostrado", "DISPLAYNAME": "Nombre mostrado",
"PREFERREDLOGINNAME": "Nombre de inicio de sesión preferido",
"PREFERRED_LANGUAGE": "Idioma", "PREFERRED_LANGUAGE": "Idioma",
"GENDER": "Género", "GENDER": "Género",
"PASSWORD": "Contraseña", "PASSWORD": "Contraseña",
@@ -796,7 +797,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "Estado", "STATE": "Estado",
"DOMAINLIST": "Dominios" "DOMAINLIST": "Dominios personalizados"
}, },
"STATE": { "STATE": {
"0": "No especificado", "0": "No especificado",
@@ -1351,7 +1352,7 @@
"MAXAGEDAYS": "Antigüedad máxima en días", "MAXAGEDAYS": "Antigüedad máxima en días",
"USERLOGINMUSTBEDOMAIN": "Añadir el dominio de la organización como sufijo de los nombres de inicio de sesión", "USERLOGINMUSTBEDOMAIN": "Añadir el dominio de la organización como sufijo de los nombres de inicio de sesión",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Si activas esta opción, todos los nombres de inicio de sesión tendrán como sufijo el dominio de esta organización. Si esta opción está desactivada, tendrás que asegurarte de que los nombres de usuario son únicos para todas las organizaciones.", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Si activas esta opción, todos los nombres de inicio de sesión tendrán como sufijo el dominio de esta organización. Si esta opción está desactivada, tendrás que asegurarte de que los nombres de usuario son únicos para todas las organizaciones.",
"VALIDATEORGDOMAINS": "Validar los dominios de la organización", "VALIDATEORGDOMAINS": "Verificación de dominio de la organización requerida (desafío DNS o HTTP)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "La dirección del remitente SMTP coincide con el dominio de la instancia", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "La dirección del remitente SMTP coincide con el dominio de la instancia",
"ALLOWUSERNAMEPASSWORD": "Nombre de usuario y contraseña permitido", "ALLOWUSERNAMEPASSWORD": "Nombre de usuario y contraseña permitido",
"ALLOWEXTERNALIDP": "Permitido IDP externo", "ALLOWEXTERNALIDP": "Permitido IDP externo",

View File

@@ -495,6 +495,7 @@
"LASTNAME": "Nom de famille", "LASTNAME": "Nom de famille",
"NICKNAME": "Surnom", "NICKNAME": "Surnom",
"DISPLAYNAME": "Nom d'affichage", "DISPLAYNAME": "Nom d'affichage",
"PREFERREDLOGINNAME": "Nom de connexion préféré",
"PREFERRED_LANGUAGE": "Langue", "PREFERRED_LANGUAGE": "Langue",
"GENDER": "Sexe", "GENDER": "Sexe",
"PASSWORD": "Mot de passe", "PASSWORD": "Mot de passe",
@@ -795,7 +796,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "Statut", "STATE": "Statut",
"DOMAINLIST": "Domaines" "DOMAINLIST": "Domaines personnalisés"
}, },
"STATE": { "STATE": {
"0": "Inconnu", "0": "Inconnu",
@@ -1350,7 +1351,7 @@
"MAXAGEDAYS": "Âge maximum en jours", "MAXAGEDAYS": "Âge maximum en jours",
"USERLOGINMUSTBEDOMAIN": "Le nom de connexion de l'utilisateur doit contenir le nom de domaine de l'organisation", "USERLOGINMUSTBEDOMAIN": "Le nom de connexion de l'utilisateur doit contenir le nom de domaine de l'organisation",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Si vous activez ce paramètre, tous les noms de connexion seront suffixés avec le domaine de l'organisation. Si ce paramètre est désactivé, vous devez vous assurer que les noms d'utilisateur sont uniques pour toutes les organisations.", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Si vous activez ce paramètre, tous les noms de connexion seront suffixés avec le domaine de l'organisation. Si ce paramètre est désactivé, vous devez vous assurer que les noms d'utilisateur sont uniques pour toutes les organisations.",
"VALIDATEORGDOMAINS": "Valider les domaines d'Org", "VALIDATEORGDOMAINS": "Vérification du domaine de l'organisation requise (challenge DNS ou HTTP)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "L'adresse de l'expéditeur SMTP correspond au domaine de l'instance", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "L'adresse de l'expéditeur SMTP correspond au domaine de l'instance",
"ALLOWUSERNAMEPASSWORD": "Nom d'utilisateur Mot de passe autorisé", "ALLOWUSERNAMEPASSWORD": "Nom d'utilisateur Mot de passe autorisé",
"ALLOWEXTERNALIDP": "IDP externe autorisé", "ALLOWEXTERNALIDP": "IDP externe autorisé",

View File

@@ -494,6 +494,7 @@
"LASTNAME": "Cognome", "LASTNAME": "Cognome",
"NICKNAME": "Soprannome", "NICKNAME": "Soprannome",
"DISPLAYNAME": "DisplayName", "DISPLAYNAME": "DisplayName",
"PREFERREDLOGINNAME": "Nome di accesso preferito",
"PREFERRED_LANGUAGE": "Lingua", "PREFERRED_LANGUAGE": "Lingua",
"GENDER": "Genere", "GENDER": "Genere",
"PASSWORD": "Password", "PASSWORD": "Password",
@@ -794,7 +795,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "Stato", "STATE": "Stato",
"DOMAINLIST": "Domini" "DOMAINLIST": "Domini personalizzati"
}, },
"STATE": { "STATE": {
"0": "Non specifico", "0": "Non specifico",
@@ -1350,7 +1351,7 @@
"MAXAGEDAYS": "Lunghezza massima in giorni", "MAXAGEDAYS": "Lunghezza massima in giorni",
"USERLOGINMUSTBEDOMAIN": "Nome utente deve contenere il dominio dell' organizzazione", "USERLOGINMUSTBEDOMAIN": "Nome utente deve contenere il dominio dell' organizzazione",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Se abiliti questa impostazione, a tutti i nomi di accesso verrà aggiunto il suffisso del dominio dell'organizzazione. Se questa impostazione è disabilitata, devi assicurarti che i nomi utente siano univoci per tutte le organizzazioni.", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Se abiliti questa impostazione, a tutti i nomi di accesso verrà aggiunto il suffisso del dominio dell'organizzazione. Se questa impostazione è disabilitata, devi assicurarti che i nomi utente siano univoci per tutte le organizzazioni.",
"VALIDATEORGDOMAINS": "Verifica domini dell' organizzazione", "VALIDATEORGDOMAINS": "Verifica del dominio dell'organizzazione richiesta (challenge DNS o HTTP)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "L'indirizzo mittente SMTP corrisponde al dominio dell'istanza", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "L'indirizzo mittente SMTP corrisponde al dominio dell'istanza",
"ALLOWUSERNAMEPASSWORD": "Autenticazione classica con password consentita", "ALLOWUSERNAMEPASSWORD": "Autenticazione classica con password consentita",
"ALLOWEXTERNALIDP": "IDP esterno consentito", "ALLOWEXTERNALIDP": "IDP esterno consentito",

View File

@@ -496,6 +496,7 @@
"LASTNAME": "姓", "LASTNAME": "姓",
"NICKNAME": "ニックネーム", "NICKNAME": "ニックネーム",
"DISPLAYNAME": "表示名", "DISPLAYNAME": "表示名",
"PREFERREDLOGINNAME": "優先ログイン名",
"PREFERRED_LANGUAGE": "言語", "PREFERRED_LANGUAGE": "言語",
"GENDER": "性別", "GENDER": "性別",
"PASSWORD": "パスワード", "PASSWORD": "パスワード",
@@ -796,7 +797,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "ステータス", "STATE": "ステータス",
"DOMAINLIST": "ドメイン" "DOMAINLIST": "カスタムドメイン"
}, },
"STATE": { "STATE": {
"0": "未定義", "0": "未定義",
@@ -1346,7 +1347,7 @@
"MAXAGEDAYS": "最大有効期限", "MAXAGEDAYS": "最大有効期限",
"USERLOGINMUSTBEDOMAIN": "ログイン名の接尾辞として組織ドメインを追加する", "USERLOGINMUSTBEDOMAIN": "ログイン名の接尾辞として組織ドメインを追加する",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "この設定を有効にすると、すべてのログイン名が組織ドメインで接尾辞が付けられます。この設定が無効になっている場合、ユーザー名がすべての組織で一意であることを確認する必要があります。", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "この設定を有効にすると、すべてのログイン名が組織ドメインで接尾辞が付けられます。この設定が無効になっている場合、ユーザー名がすべての組織で一意であることを確認する必要があります。",
"VALIDATEORGDOMAINS": "組織ドメインを認証する", "VALIDATEORGDOMAINS": "組織ドメイン検証が必要です (DNSまたはHTTPチャレンジ)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP送信者アドレスはインスタンスドメインに一致しています", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP送信者アドレスはインスタンスドメインに一致しています",
"ALLOWUSERNAMEPASSWORD": "ユーザー名とパスワードを許可", "ALLOWUSERNAMEPASSWORD": "ユーザー名とパスワードを許可",
"ALLOWEXTERNALIDP": "外部IDPを許可", "ALLOWEXTERNALIDP": "外部IDPを許可",

View File

@@ -496,6 +496,7 @@
"LASTNAME": "Презиме", "LASTNAME": "Презиме",
"NICKNAME": "Прекар", "NICKNAME": "Прекар",
"DISPLAYNAME": "Име за приказ", "DISPLAYNAME": "Име за приказ",
"PREFERREDLOGINNAME": "Претпочитано име за најава",
"PREFERRED_LANGUAGE": "Јазик", "PREFERRED_LANGUAGE": "Јазик",
"GENDER": "Пол", "GENDER": "Пол",
"PASSWORD": "Лозинка", "PASSWORD": "Лозинка",
@@ -796,7 +797,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "Статус", "STATE": "Статус",
"DOMAINLIST": "Домени" "DOMAINLIST": "Прилагодени домени"
}, },
"STATE": { "STATE": {
"0": "Ненаведено", "0": "Ненаведено",
@@ -1352,7 +1353,7 @@
"MAXAGEDAYS": "Максимална возраст во денови", "MAXAGEDAYS": "Максимална возраст во денови",
"USERLOGINMUSTBEDOMAIN": "Додади организациски домен како суфикс на корисничките имиња", "USERLOGINMUSTBEDOMAIN": "Додади организациски домен како суфикс на корисничките имиња",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Ако го овозможите ова подесување, сите кориснички имиња ќе имаат суфикс на организацискиот домен. Доколку ова подесување е оневозможено, морате да се осигурате дека корисничките имиња се уникатни низ сите организации.", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Ако го овозможите ова подесување, сите кориснички имиња ќе имаат суфикс на организацискиот домен. Доколку ова подесување е оневозможено, морате да се осигурате дека корисничките имиња се уникатни низ сите организации.",
"VALIDATEORGDOMAINS": "Валидирај организациски домени", "VALIDATEORGDOMAINS": "Потврда на доменот на организацијата е неопходна (DNS или HTTP предизвик)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP адресата на испраќачот се поклопува со доменот на инстанцата", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP адресата на испраќачот се поклопува со доменот на инстанцата",
"ALLOWUSERNAMEPASSWORD": "Дозволено корисничко име и лозинка", "ALLOWUSERNAMEPASSWORD": "Дозволено корисничко име и лозинка",
"ALLOWEXTERNALIDP": "Дозволен надворешен IDP", "ALLOWEXTERNALIDP": "Дозволен надворешен IDP",

View File

@@ -495,6 +495,7 @@
"LASTNAME": "Nazwisko", "LASTNAME": "Nazwisko",
"NICKNAME": "Przezwisko", "NICKNAME": "Przezwisko",
"DISPLAYNAME": "Nazwa wyświetlana", "DISPLAYNAME": "Nazwa wyświetlana",
"PREFERREDLOGINNAME": "Preferowana nazwa logowania",
"PREFERRED_LANGUAGE": "Język", "PREFERRED_LANGUAGE": "Język",
"GENDER": "Płeć", "GENDER": "Płeć",
"PASSWORD": "Hasło", "PASSWORD": "Hasło",
@@ -795,7 +796,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "Status", "STATE": "Status",
"DOMAINLIST": "Domeny" "DOMAINLIST": "Własne domeny"
}, },
"STATE": { "STATE": {
"0": "Nieokreślony", "0": "Nieokreślony",
@@ -1350,7 +1351,7 @@
"MAXAGEDAYS": "Maksymalny wiek w dniach", "MAXAGEDAYS": "Maksymalny wiek w dniach",
"USERLOGINMUSTBEDOMAIN": "Dodaj domenę organizacji jako przyrostek do nazw logowania", "USERLOGINMUSTBEDOMAIN": "Dodaj domenę organizacji jako przyrostek do nazw logowania",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Jeśli włączysz to ustawienie, wszystkie nazwy logowania będą miały przyrostek z domeną organizacji. Jeśli to ustawienie jest wyłączone, musisz zapewnić unikalność nazw użytkowników we wszystkich organizacjach.", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Jeśli włączysz to ustawienie, wszystkie nazwy logowania będą miały przyrostek z domeną organizacji. Jeśli to ustawienie jest wyłączone, musisz zapewnić unikalność nazw użytkowników we wszystkich organizacjach.",
"VALIDATEORGDOMAINS": "Sprawdzanie ważności domen organizacji", "VALIDATEORGDOMAINS": "Weryfikacja domeny organizacji jest wymagana (wyzwanie DNS lub HTTP)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "Adres nadawcy SMTP pasuje do domeny instancji", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "Adres nadawcy SMTP pasuje do domeny instancji",
"ALLOWUSERNAMEPASSWORD": "Zezwól na użycie nazwy użytkownika i hasła", "ALLOWUSERNAMEPASSWORD": "Zezwól na użycie nazwy użytkownika i hasła",
"ALLOWEXTERNALIDP": "Zezwól na zewnętrznego dostawcę tożsamości", "ALLOWEXTERNALIDP": "Zezwól na zewnętrznego dostawcę tożsamości",

View File

@@ -496,6 +496,7 @@
"LASTNAME": "Sobrenome", "LASTNAME": "Sobrenome",
"NICKNAME": "Apelido", "NICKNAME": "Apelido",
"DISPLAYNAME": "Nome de Exibição", "DISPLAYNAME": "Nome de Exibição",
"PREFERREDLOGINNAME": "Nome de login preferido",
"PREFERRED_LANGUAGE": "Idioma", "PREFERRED_LANGUAGE": "Idioma",
"GENDER": "Gênero", "GENDER": "Gênero",
"SENHA": "Senha", "SENHA": "Senha",
@@ -796,7 +797,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "Status", "STATE": "Status",
"DOMAINLIST": "Domínios" "DOMAINLIST": "Domínios personalizados"
}, },
"STATE": { "STATE": {
"0": "Não especificado", "0": "Não especificado",
@@ -1352,7 +1353,7 @@
"MAXAGEDAYS": "Idade máxima em dias", "MAXAGEDAYS": "Idade máxima em dias",
"USERLOGINMUSTBEDOMAIN": "Adicionar domínio da organização como sufixo aos nomes de login", "USERLOGINMUSTBEDOMAIN": "Adicionar domínio da organização como sufixo aos nomes de login",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Se você habilitar essa configuração, todos os nomes de login serão sufixados com o domínio da organização. Se essa configuração estiver desabilitada, você deve garantir que os nomes de usuário sejam exclusivos em todas as organizações.", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Se você habilitar essa configuração, todos os nomes de login serão sufixados com o domínio da organização. Se essa configuração estiver desabilitada, você deve garantir que os nomes de usuário sejam exclusivos em todas as organizações.",
"VALIDATEORGDOMAINS": "Validar domínios da organização", "VALIDATEORGDOMAINS": "Verificação de domínio da organização necessária (desafio DNS ou HTTP)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "O endereço do remetente do SMTP corresponde ao domínio da Instância", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "O endereço do remetente do SMTP corresponde ao domínio da Instância",
"ALLOWUSERNAMEPASSWORD": "Permitir usuário e senha", "ALLOWUSERNAMEPASSWORD": "Permitir usuário e senha",
"ALLOWEXTERNALIDP": "Permitir provedor de ID externo", "ALLOWEXTERNALIDP": "Permitir provedor de ID externo",

View File

@@ -495,6 +495,7 @@
"LASTNAME": "姓", "LASTNAME": "姓",
"NICKNAME": "昵称", "NICKNAME": "昵称",
"DISPLAYNAME": "展示名称", "DISPLAYNAME": "展示名称",
"PREFERREDLOGINNAME": "首选登录名",
"PREFERRED_LANGUAGE": "语言", "PREFERRED_LANGUAGE": "语言",
"GENDER": "性别", "GENDER": "性别",
"PASSWORD": "密码", "PASSWORD": "密码",
@@ -795,7 +796,7 @@
}, },
"PAGES": { "PAGES": {
"STATE": "状态", "STATE": "状态",
"DOMAINLIST": "域名" "DOMAINLIST": "自定义域名"
}, },
"STATE": { "STATE": {
"0": "未指定", "0": "未指定",
@@ -1349,7 +1350,7 @@
"MAXAGEDAYS": "Max Age in days", "MAXAGEDAYS": "Max Age in days",
"USERLOGINMUSTBEDOMAIN": "用户名必须包含组织域名", "USERLOGINMUSTBEDOMAIN": "用户名必须包含组织域名",
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "如果启用此设置,所有登录名都将以组织域为后缀。如果禁用此设置,您必须确保用户名在所有组织中都是唯一的。", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "如果启用此设置,所有登录名都将以组织域为后缀。如果禁用此设置,您必须确保用户名在所有组织中都是唯一的。",
"VALIDATEORGDOMAINS": "验证组织域名", "VALIDATEORGDOMAINS": "组织域名验证需要 (DNS 或 HTTP 挑战)",
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP 发件人地址与实例域名匹配", "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP 发件人地址与实例域名匹配",
"ALLOWUSERNAMEPASSWORD": "允许用户名密码", "ALLOWUSERNAMEPASSWORD": "允许用户名密码",
"ALLOWEXTERNALIDP": "允许外部身份提供者", "ALLOWEXTERNALIDP": "允许外部身份提供者",

View File

@@ -1,5 +1,5 @@
--- ---
title: API Reference Overview title: ZITADEL API Reference Overview
sidebar_label: Overview sidebar_label: Overview
--- ---

View File

@@ -1,5 +1,6 @@
--- ---
title: Ready / Healthy title: ZITADEL Ready and Health Enpoints
sidebar_label: Ready and Health Enpoints
--- ---
ZITADEL exposes a `Ready`- and `Healthy` endpoint to allow external systems like load balancers, orchestration systems, uptime probes and others to check the status. ZITADEL exposes a `Ready`- and `Healthy` endpoint to allow external systems like load balancers, orchestration systems, uptime probes and others to check the status.

View File

@@ -1,5 +1,6 @@
--- ---
title: Metrics title: ZITADEL Metrics
sidebar_label: Metrics
--- ---
ZITADEL provides a `metrics` endpoint with the help of the [opentelemetry-go](https://github.com/open-telemetry/opentelemetry-go) package. ZITADEL provides a `metrics` endpoint with the help of the [opentelemetry-go](https://github.com/open-telemetry/opentelemetry-go) package.

View File

@@ -1,5 +1,6 @@
--- ---
title: Authentication Methods title: Authentication Methods in ZITADEL
sidebar_label: Authentication Methods
--- ---
## Client Secret Basic ## Client Secret Basic
@@ -45,7 +46,7 @@ JWT
| Claim | Example | Description | | Claim | Example | Description |
|:------|:---------------------------|:----------------------------------------------------------------------------------------------------------------| |:------|:---------------------------|:----------------------------------------------------------------------------------------------------------------|
| aud | `"https://{your_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 |
@@ -55,7 +56,7 @@ JWT
{ {
"iss": "78366401571920522@acme", "iss": "78366401571920522@acme",
"sub": "78366401571920522@acme", "sub": "78366401571920522@acme",
"aud": "https://{your_domain}", "aud": "https://$CUSTOM-DOMAIN",
"exp": 1605183582, "exp": 1605183582,
"iat": 1605179982 "iat": 1605179982
} }

View File

@@ -1,5 +1,5 @@
--- ---
title: OIDC Authentication Request Playground title: ZITADEL OIDC Authentication Request Playground
sidebar_label: OIDC Playground sidebar_label: OIDC Playground
--- ---

View File

@@ -1,5 +1,6 @@
--- ---
title: Claims title: Claims in ZITADEL
sidebar_label: Claims
--- ---
ZITADEL asserts claims on different places according to the corresponding specifications or project and clients settings. ZITADEL asserts claims on different places according to the corresponding specifications or project and clients settings.
@@ -42,7 +43,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 |
| 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 |
| auth_time | `1311280969` | Unix time of the authentication | | auth_time | `1311280969` | Unix time of the authentication |
@@ -54,7 +55,7 @@ Please check below the matrix for an overview where which scope is asserted.
| gender | `other` | Gender of the subject | | gender | `other` | Gender of the subject |
| given_name | `Road` | Given name of the subject | | given_name | `Road` | Given name of the subject |
| iat | `1311280970` | Time of the token was issued at (as unix time) | | iat | `1311280970` | Time of the token was issued at (as unix time) |
| iss | `{your_domain}` | Issuing domain of a token | | iss | `$CUSTOM-DOMAIN` | Issuing domain of a token |
| jti | `69234237813329048` | Unique id of the token | | jti | `69234237813329048` | Unique id of the token |
| locale | `en` | Language from the subject | | locale | `en` | Language from the subject |
| name | `Road Runner` | The subjects full name | | name | `Road Runner` | The subjects full name |

View File

@@ -1,5 +1,6 @@
--- ---
title: OpenID Connect Endpoints title: OpenID Connect Endpoints in ZITADEL
sidebar_label: OpenID Connect Endpoints
--- ---
import Tabs from "@theme/Tabs"; import Tabs from "@theme/Tabs";

View File

@@ -1,5 +1,6 @@
--- ---
title: Grant Types title: Grant Types in ZITADEL
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.
@@ -75,19 +76,19 @@ Key JSON
JWT JWT
| Claim | Example | Description | | Claim | Example | Description |
|:------|:--------------------------|:--------------------------------------------------------------------------------------------------------------| |:------|:-------------------------|:--------------------------------------------------------------------------------------------------------------|
| aud | `"https://{your_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
{ {
"iss": "77479219772321307", "iss": "77479219772321307",
"sub": "77479219772321307", "sub": "77479219772321307",
"aud": "https://{your_domain}", "aud": "https://$CUSTOM-DOMAIN",
"exp": 1605183582, "exp": 1605183582,
"iat": 1605179982 "iat": 1605179982
} }

View File

@@ -1,5 +1,6 @@
--- ---
title: Scopes title: Scopes in ZITADEL
sidebar_label: Scopes
--- ---
ZITADEL supports the usage of scopes as way of requesting information from the IAM and also instruct ZITADEL to do certain operations. ZITADEL supports the usage of scopes as way of requesting information from the IAM and also instruct ZITADEL to do certain operations.

View File

@@ -1,10 +1,10 @@
--- ---
title: SAML endpoints title: SAML Endpoints in ZITADEL
--- ---
## SAML 2.0 metadata ## SAML 2.0 metadata
The SAML Metadata is located within the issuer domain. This would give us {your_domain}/saml/v2/metadata. The SAML Metadata is located within the issuer domain. This would give us $CUSTOM-DOMAIN/saml/v2/metadata.
This metadata contains all the information defined in the spec. This metadata contains all the information defined in the spec.
@@ -13,14 +13,14 @@ spec.** [Metadata for the OASIS Security Assertion Markup Language (SAML) V2.0
## Certificate endpoint ## Certificate endpoint
{your_domain}/saml/v2/certificate $CUSTOM-DOMAIN/saml/v2/certificate
The certificate endpoint provides the certificate which is used to sign the responses for download, for easier use with The certificate endpoint provides the certificate which is used to sign the responses for download, for easier use with
different service providers which want the certificate separately instead of inside the metadata. different service providers which want the certificate separately instead of inside the metadata.
## SSO endpoint ## SSO endpoint
{your_domain}/saml/v2/SSO $CUSTOM-DOMAIN/saml/v2/SSO
The SSO endpoint is the starting point for all initial user authentications. The user agent (browser) will be redirected The SSO endpoint is the starting point for all initial user authentications. The user agent (browser) will be redirected
to this endpoint to authenticate the user. to this endpoint to authenticate the user.

View File

@@ -1,5 +1,6 @@
--- ---
title: GRPC Status Codes title: GRPC Status Codes in ZITADEL
sidebar_label: GRPC Status Codes
--- ---
| GRPC Number | GRPC Code | HTTP Status Code | HTTP Status Text |Description | | GRPC Number | GRPC Code | HTTP Status Code | HTTP Status Text |Description |

View File

@@ -1,5 +1,6 @@
--- ---
title: Secrets title: How ZITADEL Processes and Stores Secrets
sidebar_label: Secrets
--- ---
In this chapter you can find information of how ZITADEL processes and stores secrets and credentials in a secure fashion. In this chapter you can find information of how ZITADEL processes and stores secrets and credentials in a secure fashion.

View File

@@ -1,5 +1,6 @@
--- ---
title: Software title: ZITADEL's Software Architecture
sidebar_label: Software Architecture
--- ---
ZITADEL is built with two essential patterns. Event Sourcing (ES) and Command and Query Responsibility Segregation (CQRS). ZITADEL is built with two essential patterns. Event Sourcing (ES) and Command and Query Responsibility Segregation (CQRS).
@@ -14,7 +15,7 @@ Each ZITADEL binary contains all components necessary to serve traffic
From serving the API, rendering GUI's, background processing of events and task. From serving the API, rendering GUI's, background processing of events and task.
This All in One (AiO) approach makes operating ZITADEL simple. This All in One (AiO) approach makes operating ZITADEL simple.
## Software Structure ## The Architecture
ZITADELs software architecture is built around multiple components at different levels. ZITADELs 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.

View File

@@ -1,5 +1,6 @@
--- ---
title: Deployment title: ZITADEL's Deployment Architecture
sidebar_label: Deployment Architecture
--- ---
## High Availability ## High Availability

View File

@@ -1,5 +1,6 @@
--- ---
title: Implementation title: ZITADEL Database Structure
sidebar_label: Database Structure
--- ---
This documentation gives you an insight into the structure of the ZITADEL database. This documentation gives you an insight into the structure of the ZITADEL database.

View File

@@ -1,5 +1,5 @@
--- ---
title: Eventstore title: ZITADEL Event Store
sidebar_label: Overview sidebar_label: Overview
--- ---

View File

@@ -1,5 +1,6 @@
--- ---
title: Actions title: ZITADEL Actions
sidebar_label: Actions
--- ---
By using ZITADEL actions, you can manipulate ZITADELs behavior on specific Events. By using ZITADEL actions, you can manipulate ZITADELs behavior on specific Events.

View File

@@ -1,5 +1,6 @@
--- ---
title: Audit Trail title: ZITADEL's In-built 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 an built-in audit trail to track all changes and events over an unlimited period of time.
@@ -26,7 +27,7 @@ The same view is available on several other objects such as organization or proj
### Event View ### Event View
Administrators can see all events across an instance and filter them directly in [Console](/docs/guides/manage/console/overview). Administrators can see all events across an instance and filter them directly in [Console](/docs/guides/manage/console/overview).
Go to your instance settings and then click on the Tab **Events** to open the Event Viewer or browse to $YOUR_DOMAIN/ui/console/events Go to your instance settings and then click on the Tab **Events** to open the Event Viewer or browse to $CUSTOM-DOMAIN/ui/console/events
![Event viewer](/img/concepts/audit-trail/event-viewer.png) ![Event viewer](/img/concepts/audit-trail/event-viewer.png)

View File

@@ -1,5 +1,6 @@
--- ---
title: Identity Brokering title: Identity Brokering in ZITADEL
sidebar_label: Identity Brokering
--- ---
## What are Identity Brokering and Federated Identities? ## What are Identity Brokering and Federated Identities?

View File

@@ -1,5 +1,6 @@
--- ---
title: Self-Service title: Self Service in ZITADEL
sidebar_label: Self Service
--- ---
ZITADEL allows users to perform many tasks themselves. ZITADEL allows users to perform many tasks themselves.
@@ -138,7 +139,7 @@ A client can also implement this, by calling the [specific endpoint](/apis/openi
## Profile ## Profile
These actions are available for authenticated users only. These actions are available for authenticated users only.
ZITADEL provides a self-service UI for the user profile out-of-the box under the path _{your_domain}/ui/console/users/me_. ZITADEL provides a self-service UI for the user profile out-of-the box under the path _$CUSTOM-DOMAIN/ui/console/users/me_.
You can also implement your own version in your application by using our APIs. You can also implement your own version in your application by using our APIs.
### Change password ### Change password

View File

@@ -1,5 +1,6 @@
--- ---
title: Applications title: ZITADEL Applications
sidebar_label: Applications
--- ---
# Applications # Applications

View File

@@ -1,5 +1,6 @@
--- ---
title: Granted Projects title: ZITADEL's Granted Projects
sidebar_label: Granted Projects
--- ---
# Granted Project # Granted Project

View File

@@ -1,5 +1,6 @@
--- ---
title: Instance title: ZITADEL Instances
sidebar_label: Instances
--- ---
## Instance Structure ## Instance Structure

View File

@@ -1,5 +1,6 @@
--- ---
title: Managers title: ZITADEL Managers
sidebar_label: Managers
--- ---
import ManagerDescription from "./_manager_description.mdx"; import ManagerDescription from "./_manager_description.mdx";

View File

@@ -1,5 +1,6 @@
--- ---
title: Organizations title: ZITADEL Organizations
sidebar_label: Organizations
--- ---
import OrgDescription from './_org_description.mdx'; import OrgDescription from './_org_description.mdx';

View File

@@ -1,8 +1,9 @@
--- ---
title: Settings/Policies title: ZITADEL Settings and Policies
sidebar_label: Setting and Policies
--- ---
Settings and policies are configurations of all the different parts of the Instance or an organization. For all parts we have a suitable default in the Instance. Settings and policies are configurations of all the different parts of the instance or an organization. For all parts we have a suitable default in the instance.
The default configuration can be overridden for each organization, some policies are currently only available on the instance level. Learn more about our different policies [here](/guides/manage/console/instance-settings.mdx). The default configuration can be overridden for each organization, some policies are currently only available on the instance level. Learn more about our different policies [here](/guides/manage/console/instance-settings.mdx).
API wise, settings are often called policies. You can read the proto and swagger definitions [here](../../apis/introduction.mdx). API wise, settings are often called policies. You can read the proto and swagger definitions [here](../../apis/introduction.mdx).

View File

@@ -1,5 +1,6 @@
--- ---
title: Projects title: ZITADEL Projects
sidebar_label: Projects
--- ---
# Project # Project

View File

@@ -1,5 +1,6 @@
--- ---
title: Users title: ZITADEL Users
sidebar_label: Users
--- ---
## Types of users ## Types of users

View File

@@ -1,5 +1,6 @@
--- ---
title: .NET title: Integrate ZITADEL into a .NET Application
sidebar_label: .NET
--- ---
This integration guide shows you how to integrate **ZITADEL** into your .NET application. This integration guide shows you how to integrate **ZITADEL** into your .NET application.

View File

@@ -1,5 +1,6 @@
--- ---
title: Go title: Integrate ZITADEL into a Go Application
sidebar_label: Go
--- ---
This integration guide shows you how to integrate **ZITADEL** into your Go application. This integration guide shows you how to integrate **ZITADEL** into your Go application.

View File

@@ -43,7 +43,7 @@ provider = "oidc"
user_id_claim = "sub" #uses the subject as ID instead of the email user_id_claim = "sub" #uses the subject as ID instead of the email
provider_display_name = "ZITADEL" provider_display_name = "ZITADEL"
redirect_url = "http://127.0.0.1:4180/oauth2/callback" redirect_url = "http://127.0.0.1:4180/oauth2/callback"
oidc_issuer_url = "https://{your_domain}.zitadel.cloud" oidc_issuer_url = "https://$CUSTOM-DOMAIN"
upstreams = [ upstreams = [
"https://example.corp.com" "https://example.corp.com"
] ]

View File

@@ -1,5 +1,5 @@
--- ---
title: Overview of examples, quickstarts, and SDKs title: Overview of ZITADEL Examples, Quickstarts, and SDKs
sidebar_label: Overview sidebar_label: Overview
--- ---

View File

@@ -1,5 +1,6 @@
--- ---
title: Angular title: ZITADEL with Angular
sidebar_label: Angular
--- ---
This integration guide demonstrates the recommended way to incorporate ZITADEL into your Angular application. This integration guide demonstrates the recommended way to incorporate ZITADEL into your Angular application.

View File

@@ -1,5 +1,7 @@
--- ---
title: Flutter title: ZITADEL with Flutter
sidebar_label: Flutter
--- ---
This guide demonstrates how you integrate **ZITADEL** into a Flutter app. It refers to our example on [GitHub](https://github.com/zitadel/zitadel_flutter) This guide demonstrates how you integrate **ZITADEL** into a Flutter app. It refers to our example on [GitHub](https://github.com/zitadel/zitadel_flutter)

View File

@@ -1,8 +1,9 @@
--- ---
title: Next.js B2B Scenario title: ZITADEL with Next.js - A B2B Scenario
sidebar_label: Next.js - B2B
--- ---
This is our Zitadel [Next.js](https://nextjs.org/) B2B template. It shows how to authenticate as a user with multiple organizations. The application shows your users roles on the selected organizations, other projects your organization is allowed to use and other users having a grant to use the application. This is our ZITADEL [Next.js](https://nextjs.org/) B2B template. It shows how to authenticate as a user with multiple organizations. The application shows your users roles on the selected organizations, other projects your organization is allowed to use and other users having a grant to use the application.
If you need more info on B2B use cases consider reading our guide for the [B2B solution scenario](/guides/solution-scenarios/b2b.mdx). If you need more info on B2B use cases consider reading our guide for the [B2B solution scenario](/guides/solution-scenarios/b2b.mdx).

View File

@@ -1,5 +1,6 @@
--- ---
title: Next.js title: ZITADEL with Next.js
sidebar_label: Next.js
--- ---
This is our Zitadel [Next.js](https://nextjs.org/) template. It shows how to authenticate as a user and retrieve user information from the OIDC endpoint. This is our Zitadel [Next.js](https://nextjs.org/) template. It shows how to authenticate as a user and retrieve user information from the OIDC endpoint.

View File

@@ -1,5 +1,6 @@
--- ---
title: React title: ZITADEL with React
sidebar_label: React
--- ---
This Integration guide shows you the recommended way to integrate **ZITADEL** into your React Application. This Integration guide shows you the recommended way to integrate **ZITADEL** into your React Application.

View File

@@ -1,5 +1,6 @@
--- ---
title: SDKs title: ZITADEL SDKs
sidebar_label: SDKs
--- ---
On this page you find our official SDKs, links to supporting frameworks and providers, and resources to help with SDKs. On this page you find our official SDKs, links to supporting frameworks and providers, and resources to help with SDKs.

View File

@@ -1,4 +1,5 @@
--- ---
title: .NET title: ZITADEL with .NET
sidebar_label: .NET
--- ---
Coming soon Coming soon

View File

@@ -1,5 +1,6 @@
--- ---
title: Go title: ZITADEL with Go
sidebar_label: Go
--- ---
This integration guide shows you how to integrate **ZITADEL** into your Go API. It demonstrates how to secure your API using This integration guide shows you how to integrate **ZITADEL** into your Go API. It demonstrates how to secure your API using

View File

@@ -1,5 +1,6 @@
--- ---
title: Python title: ZITADEL with Python
sidebar_label: Python
--- ---
This example shows you how to secure a Python3 Flask API with both authentication and authorization using ZITADEL. This example shows you how to secure a Python3 Flask API with both authentication and authorization using ZITADEL.

View File

@@ -44,7 +44,7 @@ Use the scope `urn:zitadel:iam:org:project:id:zitadel:aud` to include the ZITADE
```bash ```bash
curl --request POST \ curl --request POST \
--url {your_domain}/oauth/v2/token \ --url $CUSTOM-DOMAIN/oauth/v2/token \
--header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Content-Type: application/x-www-form-urlencoded' \
--data grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer \ --data grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer \
--data scope='openid profile email urn:zitadel:iam:org:project:id:zitadel:aud' \ --data scope='openid profile email urn:zitadel:iam:org:project:id:zitadel:aud' \

View File

@@ -59,7 +59,7 @@ The JWT payload will need to contain the following claims:
{ {
"iss": "<userid>", "iss": "<userid>",
"sub": "<userid>", "sub": "<userid>",
"aud": "<https://your_domain>", "aud": "<https://$CUSTOM-DOMAIN>",
"exp": <now+1h>, "exp": <now+1h>,
"iat": <now> "iat": <now>
} }
@@ -95,7 +95,7 @@ Now that you configured ZITADEL and created a JWT, you can call the System API a
```bash ```bash
curl --request POST \ curl --request POST \
--url {your_domain}/system/v1/instances/_search \ --url $CUSTOM-DOMAIN/system/v1/instances/_search \
--header 'Authorization: Bearer {token}' \ --header 'Authorization: Bearer {token}' \
--header 'Content-Type: application/json' --header 'Content-Type: application/json'
``` ```

View File

@@ -1,5 +1,6 @@
--- ---
title: Authenticated MongoDB Charts title: Embed Authenticated MongoDB Charts Using ZITADEL
sidebar_label: Authenticated MongoDB Charts
--- ---
This integration guide shows how you can embed authenticated MongoDB Charts in your web application using ZITADEL as authentication provider. This integration guide shows how you can embed authenticated MongoDB Charts in your web application using ZITADEL as authentication provider.
@@ -28,7 +29,7 @@ Configure ZITADEL as your _Custom JWT Provider_ following the [MongoDB docs](htt
Configure the following values: Configure the following values:
- Signing Algorithm: RS256 - Signing Algorithm: RS256
- Signing Key: JWK or JWKS URL - Signing Key: JWK or JWKS URL
- JWKS: https://{your_domain}.zitadel.cloud/oauth/v2/keys - JWKS: https://$CUSTOM-DOMAIN/oauth/v2/keys
- Audience: Your app's client ID which you copied when you created the ZITADEL app - Audience: Your app's client ID which you copied when you created the ZITADEL app
Your configuration should look similar to this: Your configuration should look similar to this:

View File

@@ -41,7 +41,7 @@ You will need to craft a POST request to ZITADEL's token endpoint:
```bash ```bash
curl --request POST \ curl --request POST \
--url https://{your_domain}.zitadel.cloud/oauth/v2/token \ --url https://$CUSTOM-DOMAIN/oauth/v2/token \
--header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic ${BASIC_AUTH}' \ --header 'Authorization: Basic ${BASIC_AUTH}' \
--data grant_type=client_credentials \ --data grant_type=client_credentials \
@@ -72,7 +72,7 @@ In this example we read the organization of the service user.
```bash ```bash
curl --request GET \ curl --request GET \
--url {your-domain}/management/v1/orgs/me \ --url $CUSTOM-DOMAIN/management/v1/orgs/me \
--header 'Authorization: Bearer ${TOKEN}' --header 'Authorization: Bearer ${TOKEN}'
``` ```

View File

@@ -1,5 +1,6 @@
--- ---
title: Get events from ZITADEL title: Get Events from ZITADEL
sidebar_label: Events
--- ---
ZITADEL leverages the power of eventsourcing, meaning every action and change within the system generates a corresponding event that is stored in the database. ZITADEL leverages the power of eventsourcing, meaning every action and change within the system generates a corresponding event that is stored in the database.
@@ -23,7 +24,7 @@ To further restrict your result you can add the following filters:
```bash ```bash
curl --request POST \ curl --request POST \
--url $YOUR-DOMAIN/admin/v1/events/_search \ --url $CUSTOM-DOMAIN/admin/v1/events/_search \
--header "Authorization: Bearer $TOKEN" --header "Authorization: Bearer $TOKEN"
``` ```
@@ -33,7 +34,7 @@ To be able to filter for the different event types ZITADEL knows, you can reques
```bash ```bash
curl --request POST \ curl --request POST \
--url $YOUR-DOMAIN/admin/v1/events/types/_search \ --url $CUSTOM-DOMAIN/admin/v1/events/types/_search \
--header "Authorization: Bearer $TOKEN" \ --header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \ --header 'Content-Type: application/json' \
' '
@@ -69,7 +70,7 @@ To be able to filter for the different aggregate types (resources) ZITADEL knows
```bash ```bash
curl --request POST \ curl --request POST \
--url $YOUR-DOMAIN/admin/v1/aggregates/types/_search \ --url $CUSTOM-DOMAIN/admin/v1/aggregates/types/_search \
--header "Authorization: Bearer $TOKEN" \ --header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' --header 'Content-Type: application/json'
``` ```
@@ -100,7 +101,7 @@ This example shows you how to get all events from users, filtered with the creat
```bash ```bash
curl --request POST \ curl --request POST \
--url $YOUR-DOMAIN/admin/v1/events/_search \ --url $CUSTOM-DOMAIN/admin/v1/events/_search \
--header "Authorization: Bearer $TOKEN" \ --header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \ --header 'Content-Type: application/json' \
--data '{ --data '{
@@ -120,7 +121,7 @@ Also we include the refresh tokens in this example to know when the user has bec
```bash ```bash
curl --request POST \ curl --request POST \
--url $YOUR-DOMAIN/admin/v1/events/_search \ --url $CUSTOM-DOMAIN/admin/v1/events/_search \
--header "Authorization: Bearer $TOKEN" \ --header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \ --header 'Content-Type: application/json' \
--data '{ --data '{
@@ -146,7 +147,7 @@ In this case this are the following events:
```bash ```bash
curl --request POST \ curl --request POST \
--url $YOUR-DOMAIN/admin/v1/events/_search \ --url $CUSTOM-DOMAIN/admin/v1/events/_search \
--header "Authorization: Bearer $TOKEN" \ --header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \ --header 'Content-Type: application/json' \
--data '{ --data '{

View File

@@ -1,5 +1,5 @@
--- ---
title: Configure Apple as Identity Provider title: Configure Apple as an Identity Provider in ZITADEL
sidebar_label: Apple sidebar_label: Apple
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Configure Azure AD as Identity Provider title: Configure Azure AD as an Identity Provider in ZITADEL
sidebar_label: Azure AD sidebar_label: Azure AD
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Configure GitHub as Identity Provider title: Configure GitHub as an Identity Provider in ZITADEL
sidebar_label: GitHub sidebar_label: GitHub
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Configure GitLab as Identity Provider title: Configure GitLab as an Identity Provider in ZITADEL
sidebar_label: GitLab sidebar_label: GitLab
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Configure Google as Identity Provider title: Configure Google as an Identity Provider in ZITADEL
sidebar_label: Google sidebar_label: Google
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Configure LDAP as Identity Provider title: Configure LDAP as an Identity Provider in ZITADEL
sidebar_label: LDAP sidebar_label: LDAP
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Configure OKTA as Identity Provider title: Configure OKTA as an Identity Provider in ZITADEL
sidebar_label: OKTA generic OIDC sidebar_label: OKTA generic OIDC
id: okta id: okta
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Configure local OpenLDAP as Identity Provider title: Configure Local OpenLDAP as an Identity Provider in ZITADEL
sidebar_label: Local OpenLDAP sidebar_label: Local OpenLDAP
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Handle External Login title: Handle External Logins in ZITADEL
sidebar_label: External Identity Provider sidebar_label: External Identity Provider
--- ---

View File

@@ -1,5 +1,6 @@
--- ---
title: Logout title: Logging Out via ZITADEL
sidebar_label: Logout
--- ---
import Logout from './_logout.mdx'; import Logout from './_logout.mdx';

View File

@@ -1,6 +1,6 @@
--- ---
title: Multi-Factor (MFA) title: Multi-Factor Authentication(MFA) in ZITADEL
sidebar_label: Multi-Factor (MFA) sidebar_label: Multi-Factor Authentication(MFA)
--- ---
import MfaOptions from './_list-mfa-options.mdx'; import MfaOptions from './_list-mfa-options.mdx';

View File

@@ -1,5 +1,6 @@
--- ---
title: OIDC Standard title: Support for the OpenID Connect(OIDC) Standard in ZITADEL
sidebar_label: OIDC Standard
--- ---
To build your own login ui for your own application it is not necessary to have the OIDC standard included or any additional work that has to be done. To build your own login ui for your own application it is not necessary to have the OIDC standard included or any additional work that has to be done.

View File

@@ -1,5 +1,5 @@
--- ---
title: Passkeys title: Passkeys in ZITADEL
sidebar_label: Passkeys sidebar_label: Passkeys
--- ---

View File

@@ -1,5 +1,6 @@
--- ---
title: Password Reset/Change title: Password Reset/Change in ZITADEL
sidebar_label: Password Reset/Change
--- ---
When your user is on the password screen and has forgotten his password you will probably want him to be able to reset by himself. When your user is on the password screen and has forgotten his password you will probably want him to be able to reset by himself.

View File

@@ -1,5 +1,5 @@
--- ---
title: Register and Login User with Password title: Register and Login User with Password in ZITADEL
sidebar_label: Username and Password sidebar_label: Username and Password
--- ---

View File

@@ -1,5 +1,6 @@
--- ---
title: Login Users into your Application title: Login Users into your Application with ZITADEL
sidebar_label: Login
--- ---
import Tabs from "@theme/Tabs"; import Tabs from "@theme/Tabs";

View File

@@ -1,5 +1,6 @@
--- ---
title: Logout title: Log Out Users from an Application with ZITADEL
sidebar_label: Logout
--- ---
This guide shows you the different concepts and use cases of the logout process and how to use it in ZITADEL. This guide shows you the different concepts and use cases of the logout process and how to use it in ZITADEL.
@@ -36,7 +37,7 @@ If you have specified some post_logout_redirect_uris on your client you have to
So ZITADEL is able to read the configured redirect uris. So ZITADEL is able to read the configured redirect uris.
``` ```
GET {your_domain}/oidc/v1/end_session GET $CUSTOM-DOMAIN/oidc/v1/end_session
?id_token_hint={id_token} ?id_token_hint={id_token}
&post_logout_redirect_uri=https://rp.example.com/logged_out &post_logout_redirect_uri=https://rp.example.com/logged_out
&state=random_string &state=random_string

View File

@@ -1,5 +1,5 @@
--- ---
title: Recommended authorization flows title: Recommended Authorization Flows
--- ---
<table className="table-wrapper"> <table className="table-wrapper">

View File

@@ -1,5 +1,6 @@
--- ---
title: PAT (Personal Access Token) title: ZITADEL's Personal Access Tokens(PATs)
sidebar_label: Personal Access Tokens(PATs)
--- ---
@@ -40,6 +41,6 @@ In this example we read the organization of the service user.
```bash ```bash
curl --request GET \ curl --request GET \
--url {your-domain}/management/v1/orgs/me \ --url $CUSTOM-DOMAIN/management/v1/orgs/me \
--header 'Authorization: Bearer {PAT}' --header 'Authorization: Bearer {PAT}'
``` ```

View File

@@ -1,5 +1,6 @@
--- ---
title: Private Key JWT title: Service Users in ZITADEL
sidebar_label: Service Users
--- ---
This is a guide on how to create service users in ZITADEL. You can read more about users [here](/concepts/structure/users.md). This is a guide on how to create service users in ZITADEL. You can read more about users [here](/concepts/structure/users.md).
@@ -67,7 +68,7 @@ Payload
{ {
"iss": "100507859606888466", "iss": "100507859606888466",
"sub": "100507859606888466", "sub": "100507859606888466",
"aud": "https://{your_domain}.zitadel.cloud", "aud": "https://$CUSTOM-DOMAIN",
"iat": [Current UTC timestamp, e.g. 1605179982, max. 1 hour ago], "iat": [Current UTC timestamp, e.g. 1605179982, max. 1 hour ago],
"exp": [UTC timestamp, e.g. 1605183582] "exp": [UTC timestamp, e.g. 1605183582]
} }
@@ -89,7 +90,7 @@ With the encoded JWT from the prior step, you will need to craft a POST request
```bash ```bash
curl --request POST \ curl --request POST \
--url https://{your_domain}.zitadel.cloud/oauth/v2/token \ --url https:/$CUSTOM-DOMAIN/oauth/v2/token \
--header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Content-Type: application/x-www-form-urlencoded' \
--data grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer \ --data grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer \
--data scope='openid profile email' \ --data scope='openid profile email' \
@@ -121,7 +122,7 @@ For this example let's call the userinfo endpoint to verify that our access toke
```bash ```bash
curl --request POST \ curl --request POST \
--url https://{your_domain}.zitadel.cloud/oidc/v1/userinfo \ --url $CUSTOM-DOMAIN/oidc/v1/userinfo \
--header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Bearer MtjHodGy4zxKylDOhg6kW90WeEQs2q...' --header 'Authorization: Bearer MtjHodGy4zxKylDOhg6kW90WeEQs2q...'
``` ```
@@ -134,7 +135,7 @@ Content-Type: application/json
{ {
"name": "MyServiceUser", "name": "MyServiceUser",
"preferred_username": "service_user@{your_domain}.zitadel.cloud", "preferred_username": "service_user@$CUSTOM-DOMAIN",
"updated_at": 1616417938 "updated_at": 1616417938
} }
``` ```

View File

@@ -1,5 +1,6 @@
--- ---
title: Retrieve user roles title: Retrieve User Roles in ZITADEL
sidebar_label: Retrieve User Roles
--- ---
This guide explains all the possible ways of retrieving user roles across different organizations and projects using ZITADEL's APIs. This guide explains all the possible ways of retrieving user roles across different organizations and projects using ZITADEL's APIs.
@@ -82,7 +83,7 @@ Alternatively, you can include the claims `urn:iam:org:project:roles` or/and `ur
### Retrieve roles from the userinfo endpoint ### Retrieve roles from the userinfo endpoint
The user info endpoint is **ZITADEL_DOMAIN/oidc/v1/userinfo**. The user info endpoint is **$CUSTOM-DOMAIN/oidc/v1/userinfo**.
This endpoint will return information about the authenticated user. This endpoint will return information about the authenticated user.
Send the access token of the user as `Bearer Token` in the `Authorization` header: Send the access token of the user as `Bearer Token` in the `Authorization` header:
@@ -90,7 +91,7 @@ Send the access token of the user as `Bearer Token` in the `Authorization` heade
**cURL Request:** **cURL Request:**
```bash ```bash
curl --request GET \ curl --request GET \
--url $ZITADEL_DOMAIN/oidc/v1/userinfo --url $CUSTOM-DOMAIN/oidc/v1/userinfo
--header 'Authorization: Bearer <TOKEN>' --header 'Authorization: Bearer <TOKEN>'
``` ```
@@ -205,11 +206,11 @@ Lets start with a user who has multiple roles in different organizations in a
Returns a list of roles for the authenticated user and for the requesting project (based on the token). Returns a list of roles for the authenticated user and for the requesting project (based on the token).
**URL: https://$ZITADEL_DOMAIN/auth/v1/permissions/me/_search** **URL: https://$CUSTOM-DOMAIN/auth/v1/permissions/me/_search**
**cURL request:** **cURL request:**
```bash ```bash
curl -L -X POST 'https://$ZITADEL_DOMAIN/auth/v1/permissions/me/_search' \ curl -L -X POST 'https://$CUSTOM-DOMAIN/auth/v1/permissions/me/_search' \
-H 'Accept: application/json' \ -H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' -H 'Authorization: Bearer <TOKEN>'
``` ```
@@ -230,12 +231,12 @@ Returns a list of permissions the authenticated user has in ZITADEL based on the
This request can be used if you are building a management UI. For instance, if the UI is managing users, you can show the management functionality based on the permissions the user has. Heres an example: if the user has `user.read` and `user.write` permission you can show the edit buttons, if the user only has `user.read` permission, you can hide the edit buttons. This request can be used if you are building a management UI. For instance, if the UI is managing users, you can show the management functionality based on the permissions the user has. Heres an example: if the user has `user.read` and `user.write` permission you can show the edit buttons, if the user only has `user.read` permission, you can hide the edit buttons.
**URL: https://ZITADEL_DOMAIN/auth/v1/permissions/zitadel/me/_search** **URL: https://$CUSTOM-DOMAIN/auth/v1/permissions/zitadel/me/_search**
**cURL Request:** **cURL Request:**
```bash ```bash
curl -L -X POST 'https://$ZITADEL_DOMAIN/auth/v1/permissions/zitadel/me/_search' \ curl -L -X POST 'https://$CUSTOM-DOMAIN/auth/v1/permissions/zitadel/me/_search' \
-H 'Accept: application/json' \ -H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' -H 'Authorization: Bearer <TOKEN>'
``` ```
@@ -276,12 +277,12 @@ curl -L -X POST 'https://$ZITADEL_DOMAIN/auth/v1/permissions/zitadel/me/_search'
Returns a list of user grants the authenticated user has. User grants consist of an organization, a project and roles. Returns a list of user grants the authenticated user has. User grants consist of an organization, a project and roles.
**URL: https://$ZITADEL_DOMAIN/auth/v1/usergrants/me/_search** **URL: https://$CUSTOM-DOMAIN/auth/v1/usergrants/me/_search**
**cURL request:** **cURL request:**
```bash ```bash
curl -L -X POST 'https://$ZITADEL_DOMAIN/auth/v1/usergrants/me/_search' \ curl -L -X POST 'https://$CUSTOM-DOMAIN/auth/v1/usergrants/me/_search' \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
-H 'Accept: application/json' \ -H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \ -H 'Authorization: Bearer <TOKEN>' \
@@ -378,7 +379,7 @@ curl -L -X POST 'https://$ZITADEL_DOMAIN/auth/v1/usergrants/me/_search' \
### Retrieve roles using the management API ### Retrieve roles using the management API
Now we will use the management API to retrieve user roles under an admin user. Now we will use the management API to retrieve user roles under an admin user.
The base URL is: **https://$ZITADEL_DOMAIN/management/v1** The base URL is: **https://$CUSTOM-DOMAIN/management/v1**
In [APIs listed under user grants in the management API](/docs/category/apis/resources/mgmt/user-grants), you will see that you can use the management API to retrieve and modify user grants. The two API paths that we are interested in to fetch user roles are given below. In [APIs listed under user grants in the management API](/docs/category/apis/resources/mgmt/user-grants), you will see that you can use the management API to retrieve and modify user grants. The two API paths that we are interested in to fetch user roles are given below.
@@ -388,12 +389,12 @@ In [APIs listed under user grants in the management API](/docs/category/apis/res
Returns a list of user roles that match the search queries. A user with manager permissions will call this API and will also have to reside in the same organization as the user. Returns a list of user roles that match the search queries. A user with manager permissions will call this API and will also have to reside in the same organization as the user.
**URL: https://$ZITADEL_DOMAIN/management/v1/users/grants/_search** **URL: https://$CUSTOM-DOMAIN/management/v1/users/grants/_search**
**cURL request:** **cURL request:**
```bash ```bash
curl -L -X POST 'https://$ZITADEL_DOMAIN/management/v1/users/grants/_search' \ curl -L -X POST 'https://$CUSTOM-DOMAIN/management/v1/users/grants/_search' \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
-H 'Accept: application/json' \ -H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \ -H 'Authorization: Bearer <TOKEN>' \

View File

@@ -1,5 +1,5 @@
--- ---
title: Connect with Atlassian through SAML 2.0 title: Log in with ZITADEL on Atlassian through SAML 2.0
sidebar_label: Atlassian sidebar_label: Atlassian
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Connect with Auth0 through OIDC title: Log in with ZITADEL on Auth0 through OIDC
sidebar_label: Auth0 (OIDC) sidebar_label: Auth0 (OIDC)
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Connect with Auth0 through SAML 2.0 title: Log in with ZITADEL on Auth0 through SAML 2.0
sidebar_label: Auth0 (SAML) sidebar_label: Auth0 (SAML)
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Connect with AWS through SAML 2.0 title: Log in with ZITADEL on AWS through SAML 2.0
sidebar_label: Amazon Web Services sidebar_label: Amazon Web Services
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Configure as OIDC Identity Provider for Cloudflare Zero Trust title: Configure ZITADEL as an OIDC Identity Provider on Cloudflare Zero Trust
sidebar_label: Cloudflare Zero Trust sidebar_label: Cloudflare Zero Trust
--- ---

View File

@@ -1,5 +1,5 @@
--- ---
title: Connect with Gitlab through SAML 2.0 title: Log in with ZITADEL on Gitlab through SAML 2.0
sidebar_label: Gitlab sidebar_label: Gitlab
--- ---
@@ -51,7 +51,7 @@ Check your application, if everything is correct, press "Create".
Complete the configuration as follows: Complete the configuration as follows:
- `Identity provider single sign-on URL`: {your_instance_domain}/saml/v2/SSO - `Identity provider single sign-on URL`: $CUSTOM-DOMAIN/saml/v2/SSO
- `Certificate fingerprint`: You need to download the certificate from {your_instance_domain}/saml/v2/certificate and create a SHA1 fingerprint - `Certificate fingerprint`: You need to download the certificate from {your_instance_domain}/saml/v2/certificate and create a SHA1 fingerprint
Save the changes. Save the changes.

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