diff --git a/console/src/app/pages/users/user-create-machine/user-create-machine.component.html b/console/src/app/pages/users/user-create-machine/user-create-machine.component.html
index d2ae668c77..d9e10c3695 100644
--- a/console/src/app/pages/users/user-create-machine/user-create-machine.component.html
+++ b/console/src/app/pages/users/user-create-machine/user-create-machine.component.html
@@ -30,6 +30,15 @@
{{ 'USER.MACHINE.DESCRIPTION' | translate }}
+
+
+ {{ 'USER.MACHINE.ACCESSTOKENTYPE' | translate }}
+
+
+ {{ 'USER.MACHINE.ACCESSTOKENTYPES.' + aTT | translate }}
+
+
+
diff --git a/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.ts b/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.ts
index 5d741689c0..78598bd3b7 100644
--- a/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.ts
+++ b/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.ts
@@ -1,7 +1,7 @@
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';
import { AbstractControl, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { Subscription } from 'rxjs';
-import { Human, Machine } from 'src/app/proto/generated/zitadel/user_pb';
+import { AccessTokenType, Human, Machine } from 'src/app/proto/generated/zitadel/user_pb';
@Component({
selector: 'cnsl-detail-form-machine',
@@ -16,6 +16,11 @@ export class DetailFormMachineComponent implements OnInit, OnDestroy {
public machineForm!: UntypedFormGroup;
+ public accessTokenTypes: AccessTokenType[] = [
+ AccessTokenType.ACCESS_TOKEN_TYPE_BEARER,
+ AccessTokenType.ACCESS_TOKEN_TYPE_JWT,
+ ];
+
private sub: Subscription = new Subscription();
constructor(private fb: UntypedFormBuilder) {
@@ -23,6 +28,7 @@ export class DetailFormMachineComponent implements OnInit, OnDestroy {
userName: [{ value: '', disabled: true }, [Validators.required]],
name: [{ value: '', disabled: this.disabled }, Validators.required],
description: [{ value: '', disabled: this.disabled }],
+ accessTokenType: [AccessTokenType.ACCESS_TOKEN_TYPE_BEARER, [Validators.required]],
});
}
@@ -42,10 +48,6 @@ export class DetailFormMachineComponent implements OnInit, OnDestroy {
return this.machineForm.get('name');
}
- public get description(): AbstractControl | null {
- return this.machineForm.get('description');
- }
-
public get userName(): AbstractControl | null {
return this.machineForm.get('userName');
}
diff --git a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts
index 6e17b16fa0..4f9deda7f7 100644
--- a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts
+++ b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts
@@ -274,9 +274,15 @@ export class UserDetailComponent implements OnInit {
if (this.user.machine) {
this.user.machine.name = machineData.name;
this.user.machine.description = machineData.description;
+ this.user.machine.accessTokenType = machineData.accessTokenType;
this.mgmtUserService
- .updateMachine(this.user.id, this.user.machine.name, this.user.machine.description)
+ .updateMachine(
+ this.user.id,
+ this.user.machine.name,
+ this.user.machine.description,
+ this.user.machine.accessTokenType,
+ )
.then(() => {
this.toast.showInfo('USER.TOAST.SAVED', true);
this.refreshChanges$.emit();
diff --git a/console/src/app/services/mgmt.service.ts b/console/src/app/services/mgmt.service.ts
index ec1c792b61..fb2b423905 100644
--- a/console/src/app/services/mgmt.service.ts
+++ b/console/src/app/services/mgmt.service.ts
@@ -473,6 +473,7 @@ import { DomainSearchQuery, DomainValidationType } from '../proto/generated/zita
import { PasswordComplexityPolicy } from '../proto/generated/zitadel/policy_pb';
import { GrantedProject, Project, ProjectQuery, RoleQuery } from '../proto/generated/zitadel/project_pb';
import {
+ AccessTokenType,
Gender,
MembershipQuery,
SearchQuery as UserSearchQuery,
@@ -901,7 +902,12 @@ export class ManagementService {
return this.grpcService.mgmt.addMachineUser(req, null).then((resp) => resp.toObject());
}
- public updateMachine(userId: string, name?: string, description?: string): Promise {
+ public updateMachine(
+ userId: string,
+ name?: string,
+ description?: string,
+ accessTokenType?: AccessTokenType,
+ ): Promise {
const req = new UpdateMachineRequest();
req.setUserId(userId);
if (name) {
@@ -910,6 +916,9 @@ export class ManagementService {
if (description) {
req.setDescription(description);
}
+ if (accessTokenType !== undefined) {
+ req.setAccessTokenType(accessTokenType);
+ }
return this.grpcService.mgmt.updateMachine(req, null).then((resp) => resp.toObject());
}
diff --git a/console/src/assets/i18n/de.json b/console/src/assets/i18n/de.json
index 0797398537..c05e74f832 100644
--- a/console/src/assets/i18n/de.json
+++ b/console/src/assets/i18n/de.json
@@ -452,6 +452,11 @@
"CHOOSEEXPIRY": "Definiere ein Ablaufdatum",
"CREATIONDATE": "Erstelldatum",
"KEYDETAILS": "Schlüssel Details",
+ "ACCESSTOKENTYPE": "Access Token Typ",
+ "ACCESSTOKENTYPES": {
+ "0": "Bearer",
+ "1": "JWT"
+ },
"ADD": {
"TITLE": "Schlüssel hinzufügen",
"DESCRIPTION": "Wähle den Typ und selektiere ein optionales Ablaufdatum."
diff --git a/console/src/assets/i18n/en.json b/console/src/assets/i18n/en.json
index 9bbf34972d..0c180e240d 100644
--- a/console/src/assets/i18n/en.json
+++ b/console/src/assets/i18n/en.json
@@ -452,6 +452,11 @@
"CHOOSEEXPIRY": "Select an expiration date",
"CREATIONDATE": "Creation Date",
"KEYDETAILS": "Key Details",
+ "ACCESSTOKENTYPE": "Access Token Type",
+ "ACCESSTOKENTYPES": {
+ "0": "Bearer",
+ "1": "JWT"
+ },
"ADD": {
"TITLE": "Add Key",
"DESCRIPTION": "Select your key type and choose an optional expiration date."
diff --git a/console/src/assets/i18n/fr.json b/console/src/assets/i18n/fr.json
index 7e7e840adf..580910957b 100644
--- a/console/src/assets/i18n/fr.json
+++ b/console/src/assets/i18n/fr.json
@@ -452,6 +452,11 @@
"CHOOSEEXPIRY": "Sélectionnez une date d'expiration",
"CREATIONDATE": "Date de création",
"KEYDETAILS": "Détails de la clé",
+ "ACCESSTOKENTYPE": "Access Token Type",
+ "ACCESSTOKENTYPES": {
+ "0": "Bearer",
+ "1": "JWT"
+ },
"ADD": {
"TITLE": "Ajouter une clé",
"DESCRIPTION": "Sélectionnez votre type de clé et choisissez une date d'expiration facultative."
diff --git a/console/src/assets/i18n/it.json b/console/src/assets/i18n/it.json
index a99a507a29..9eefdb2f14 100644
--- a/console/src/assets/i18n/it.json
+++ b/console/src/assets/i18n/it.json
@@ -452,6 +452,11 @@
"CHOOSEEXPIRY": "Seleziona una data di scadenza",
"CREATIONDATE": "Data di creazione",
"KEYDETAILS": "Dettagli chiave",
+ "ACCESSTOKENTYPE": "Tipo Access Token",
+ "ACCESSTOKENTYPES": {
+ "0": "Bearer",
+ "1": "JWT"
+ },
"ADD": {
"TITLE": "Aggiungi chiave",
"DESCRIPTION": "Seleziona il tuo tipo di chiave e scegli una data di scadenza opzionale."
diff --git a/console/src/assets/i18n/zh.json b/console/src/assets/i18n/zh.json
index 25fe8a6750..48cc1b253f 100644
--- a/console/src/assets/i18n/zh.json
+++ b/console/src/assets/i18n/zh.json
@@ -452,6 +452,11 @@
"CHOOSEEXPIRY": "选择过期时间",
"CREATIONDATE": "创建于",
"KEYDETAILS": "秘钥详情",
+ "ACCESSTOKENTYPE": "访问令牌类型 ",
+ "ACCESSTOKENTYPES": {
+ "0": "Bearer",
+ "1": "JWT"
+ },
"ADD": {
"TITLE": "添加秘钥",
"DESCRIPTION": "选择您的密钥类型并选择一个可选的到期日期。"
diff --git a/docs/docs/apis/proto/user.md b/docs/docs/apis/proto/user.md
index 82b663bc3a..714b420ab8 100644
--- a/docs/docs/apis/proto/user.md
+++ b/docs/docs/apis/proto/user.md
@@ -134,7 +134,7 @@ title: zitadel/user.proto
| name | string | - | |
| description | string | - | |
| has_secret | bool | - | |
-| access_token_typ | AccessTokenType | - | |
+| access_token_type | AccessTokenType | - | |
diff --git a/internal/api/grpc/user/converter.go b/internal/api/grpc/user/converter.go
index 385c3e5e59..28cd367fb1 100644
--- a/internal/api/grpc/user/converter.go
+++ b/internal/api/grpc/user/converter.go
@@ -70,10 +70,10 @@ func HumanToPb(view *query.Human, assetPrefix, owner string) *user_pb.Human {
func MachineToPb(view *query.Machine) *user_pb.Machine {
return &user_pb.Machine{
- Name: view.Name,
- Description: view.Description,
- HasSecret: view.HasSecret,
- AccessTokenTyp: AccessTokenTypeToPb(view.AccessTokenType),
+ Name: view.Name,
+ Description: view.Description,
+ HasSecret: view.HasSecret,
+ AccessTokenType: AccessTokenTypeToPb(view.AccessTokenType),
}
}
diff --git a/proto/zitadel/user.proto b/proto/zitadel/user.proto
index 241ca7b4c1..43ce77a45f 100644
--- a/proto/zitadel/user.proto
+++ b/proto/zitadel/user.proto
@@ -83,7 +83,7 @@ message Machine {
example: "\"true\"";
}
];
- AccessTokenType access_token_typ = 4 [
+ AccessTokenType access_token_type = 4 [
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Type of access token to receive";
}