mirror of
https://github.com/andwati/zitadel.git
synced 2026-11-07 22:55:12 +00:00
feat(idp): provide option to auto link user (#7734)
* init auto linking * prompt handling * working * translations * console * fixes * unify * custom texts * fix tests * linting * fix check of existing user * fix bg translation * set unspecified as default in the form
This commit is contained in:
@@ -15,6 +15,7 @@ import {
|
||||
InitPasswordDoneScreenText,
|
||||
InitPasswordScreenText,
|
||||
LinkingUserDoneScreenText,
|
||||
LinkingUserPromptScreenText,
|
||||
LoginScreenText,
|
||||
LogoutDoneScreenText,
|
||||
MFAProvidersText,
|
||||
@@ -375,5 +376,12 @@ export function mapRequestValues(map: Partial<Map>, req: Req): Req {
|
||||
r34.setUsernameLabel(map.externalRegistrationUserOverviewText?.usernameLabel ?? '');
|
||||
req.setExternalRegistrationUserOverviewText(r34);
|
||||
|
||||
const r35 = new LinkingUserPromptScreenText();
|
||||
r35.setTitle(map.linkingUserPromptText?.title ?? '');
|
||||
r35.setDescription(map.linkingUserPromptText?.description ?? '');
|
||||
r35.setLinkButtonText(map.linkingUserPromptText?.linkButtonText ?? '');
|
||||
r35.setOtherButtonText(map.linkingUserPromptText?.otherButtonText ?? '');
|
||||
req.setLinkingUserPromptText(r35);
|
||||
|
||||
return req;
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ const KeyNamesArray = [
|
||||
'initPasswordText',
|
||||
'initializeDoneText',
|
||||
'initializeUserText',
|
||||
'linkingUserPromptText',
|
||||
'linkingUserDoneText',
|
||||
'loginText',
|
||||
'logoutText',
|
||||
|
||||
@@ -23,4 +23,12 @@
|
||||
<mat-checkbox formControlName="isLinkingAllowed">{{ 'IDP.OPTIONS.ISLINKINGALLOWED' | translate }}</mat-checkbox>
|
||||
</div>
|
||||
</cnsl-info-section>
|
||||
<cnsl-info-section class="auto-reg-info">
|
||||
<p class="checkbox-desc">{{ 'IDP.OPTIONS.AUTOLINKING_DESC' | translate }}</p>
|
||||
<mat-select formControlName="autoLinking">
|
||||
<mat-option *ngFor="let linkingType of linkingTypes" [value]="linkingType">
|
||||
{{ 'IDP.OPTIONS.AUTOLINKINGTYPE.' + linkingType | translate }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</cnsl-info-section>
|
||||
</form>
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Component, EventEmitter, Input, OnChanges, OnDestroy, Output } from '@angular/core';
|
||||
import { FormControl, FormGroup } from '@angular/forms';
|
||||
import { Subject, takeUntil } from 'rxjs';
|
||||
import { Options } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { Options, AutoLinkingOption } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AccessTokenType } from '../../proto/generated/zitadel/user_pb';
|
||||
|
||||
@Component({
|
||||
selector: 'cnsl-provider-options',
|
||||
@@ -17,8 +18,15 @@ export class ProviderOptionsComponent implements OnChanges, OnDestroy {
|
||||
isAutoUpdate: new FormControl(false, []),
|
||||
isCreationAllowed: new FormControl(true, []),
|
||||
isLinkingAllowed: new FormControl(true, []),
|
||||
autoLinking: new FormControl(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED, []),
|
||||
});
|
||||
|
||||
public linkingTypes: AutoLinkingOption[] = [
|
||||
AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED,
|
||||
AutoLinkingOption.AUTO_LINKING_OPTION_USERNAME,
|
||||
AutoLinkingOption.AUTO_LINKING_OPTION_EMAIL,
|
||||
];
|
||||
|
||||
constructor() {
|
||||
this.form.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((value) => {
|
||||
if (value) {
|
||||
@@ -27,6 +35,7 @@ export class ProviderOptionsComponent implements OnChanges, OnDestroy {
|
||||
opt.setIsAutoUpdate(value.isAutoUpdate);
|
||||
opt.setIsCreationAllowed(value.isCreationAllowed);
|
||||
opt.setIsLinkingAllowed(value.isLinkingAllowed);
|
||||
opt.setAutoLinking(value.autoLinking);
|
||||
this.optionsChanged.emit(opt);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -2,13 +2,22 @@ import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { InfoSectionModule } from '../info-section/info-section.module';
|
||||
import { ProviderOptionsComponent } from './provider-options.component';
|
||||
|
||||
@NgModule({
|
||||
declarations: [ProviderOptionsComponent],
|
||||
imports: [CommonModule, MatCheckboxModule, FormsModule, InfoSectionModule, ReactiveFormsModule, TranslateModule],
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatCheckboxModule,
|
||||
MatSelectModule,
|
||||
FormsModule,
|
||||
InfoSectionModule,
|
||||
ReactiveFormsModule,
|
||||
TranslateModule,
|
||||
],
|
||||
exports: [ProviderOptionsComponent],
|
||||
})
|
||||
export class ProviderOptionsModule {}
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateAppleProviderRequest as AdminUpdateAppleProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddAppleProviderRequest as MgmtAddAppleProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -34,7 +34,10 @@ const MAX_ALLOWED_SIZE = 5 * 1024;
|
||||
})
|
||||
export class ProviderAppleComponent {
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
// DEPRECATED: assert service$ instead
|
||||
|
||||
@@ -10,7 +10,14 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateAzureADProviderRequest as AdminUpdateAzureADProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { AzureADTenant, AzureADTenantType, IDPOwnerType, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AutoLinkingOption,
|
||||
AzureADTenant,
|
||||
AzureADTenantType,
|
||||
IDPOwnerType,
|
||||
Options,
|
||||
Provider,
|
||||
} from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddAzureADProviderRequest as MgmtAddAzureADProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -32,7 +39,10 @@ import { ProviderNextService } from '../provider-next/provider-next.service';
|
||||
})
|
||||
export class ProviderAzureADComponent {
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
// DEPRECATED: assert service$ instead
|
||||
|
||||
+5
-2
@@ -10,7 +10,7 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateGitHubEnterpriseServerProviderRequest as AdminUpdateGitHubEnterpriseServerProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddGitHubEnterpriseServerProviderRequest as MgmtAddGitHubEnterpriseServerProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -32,7 +32,10 @@ import { ProviderNextService } from '../provider-next/provider-next.service';
|
||||
})
|
||||
export class ProviderGithubESComponent {
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateGitHubProviderRequest as AdminUpdateGithubProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddGitHubProviderRequest as MgmtAddGithubProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -32,7 +32,10 @@ import { ProviderNextService } from '../provider-next/provider-next.service';
|
||||
})
|
||||
export class ProviderGithubComponent {
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
// DEPRECATED: assert service$ instead
|
||||
|
||||
+5
-2
@@ -10,7 +10,7 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateGitLabSelfHostedProviderRequest as AdminUpdateGitLabSelfHostedProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddGitLabSelfHostedProviderRequest as MgmtAddGitLabSelfHostedProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -32,7 +32,10 @@ import { ProviderNextService } from '../provider-next/provider-next.service';
|
||||
})
|
||||
export class ProviderGitlabSelfHostedComponent {
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
// DEPRECATED: assert service$ instead
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateGitLabProviderRequest as AdminUpdateGitLabProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddGitLabProviderRequest as MgmtAddGitLabProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -32,7 +32,10 @@ import { ProviderNextService } from '../provider-next/provider-next.service';
|
||||
})
|
||||
export class ProviderGitlabComponent {
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
// DEPRECATED: assert service$ instead
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateGoogleProviderRequest as AdminUpdateGoogleProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddGoogleProviderRequest as MgmtAddGoogleProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -32,7 +32,10 @@ import { ProviderNextService } from '../provider-next/provider-next.service';
|
||||
})
|
||||
export class ProviderGoogleComponent {
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
// DEPRECATED: assert service$ instead
|
||||
|
||||
@@ -9,7 +9,7 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateJWTProviderRequest as AdminUpdateJWTProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddJWTProviderRequest as MgmtAddJWTProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -32,7 +32,10 @@ import { ProviderNextService } from '../provider-next/provider-next.service';
|
||||
})
|
||||
export class ProviderJWTComponent {
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
|
||||
@@ -9,7 +9,7 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateLDAPProviderRequest as AdminUpdateLDAPProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { LDAPAttributes, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, LDAPAttributes, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddLDAPProviderRequest as MgmtAddLDAPProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -32,7 +32,10 @@ import { ProviderNextService } from '../provider-next/provider-next.service';
|
||||
export class ProviderLDAPComponent {
|
||||
public updateBindPassword: boolean = false;
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
public attributes: LDAPAttributes = new LDAPAttributes();
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateGenericOAuthProviderRequest as AdminUpdateGenericOAuthProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddGenericOAuthProviderRequest as MgmtAddGenericOAuthProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -32,7 +32,10 @@ import { ProviderNextService } from '../provider-next/provider-next.service';
|
||||
})
|
||||
export class ProviderOAuthComponent {
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
GetProviderByIDRequest as AdminGetProviderByIDRequest,
|
||||
UpdateGenericOIDCProviderRequest as AdminUpdateGenericOIDCProviderRequest,
|
||||
} from 'src/app/proto/generated/zitadel/admin_pb';
|
||||
import { Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, Options, Provider } from 'src/app/proto/generated/zitadel/idp_pb';
|
||||
import {
|
||||
AddGenericOIDCProviderRequest as MgmtAddGenericOIDCProviderRequest,
|
||||
GetProviderByIDRequest as MgmtGetProviderByIDRequest,
|
||||
@@ -32,7 +32,10 @@ import { ProviderNextService } from '../provider-next/provider-next.service';
|
||||
})
|
||||
export class ProviderOIDCComponent {
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
|
||||
// DEPRECATED: use id$ instead
|
||||
public id: string | null = '';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Component, Injector, Type } from '@angular/core';
|
||||
import { Location } from '@angular/common';
|
||||
import { Options, Provider, SAMLBinding } from '../../../proto/generated/zitadel/idp_pb';
|
||||
import { AutoLinkingOption, Options, Provider, SAMLBinding } from '../../../proto/generated/zitadel/idp_pb';
|
||||
import { AbstractControl, FormGroup, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
|
||||
import { PolicyComponentServiceType } from '../../policies/policy-component-types.enum';
|
||||
import { ManagementService } from '../../../services/mgmt.service';
|
||||
@@ -37,7 +37,10 @@ export class ProviderSamlSpComponent {
|
||||
public provider?: Provider.AsObject;
|
||||
public form!: FormGroup;
|
||||
public showOptional: boolean = false;
|
||||
public options: Options = new Options().setIsCreationAllowed(true).setIsLinkingAllowed(true);
|
||||
public options: Options = new Options()
|
||||
.setIsCreationAllowed(true)
|
||||
.setIsLinkingAllowed(true)
|
||||
.setAutoLinking(AutoLinkingOption.AUTO_LINKING_OPTION_UNSPECIFIED);
|
||||
// DEPRECATED: assert service$ instead
|
||||
public serviceType: PolicyComponentServiceType = PolicyComponentServiceType.MGMT;
|
||||
// DEPRECATED: use service$ instead
|
||||
|
||||
Reference in New Issue
Block a user