mirror of
https://github.com/zitadel/zitadel.git
synced 2025-06-10 23:28:34 +00:00

# Which Problems Are Solved As an administrator I want to be able to invite users to my application with the API V2, some user data I will already prefil, the user should add the authentication method themself (password, passkey, sso). # How the Problems Are Solved - A user can now be created with a email explicitly set to false. - If a user has no verified email and no authentication method, an `InviteCode` can be created through the User V2 API. - the code can be returned or sent through email - additionally `URLTemplate` and an `ApplicatioName` can provided for the email - The code can be resent and verified through the User V2 API - The V1 login allows users to verify and resend the code and set a password (analog user initialization) - The message text for the user invitation can be customized # Additional Changes - `verifyUserPasskeyCode` directly uses `crypto.VerifyCode` (instead of `verifyEncryptedCode`) - `verifyEncryptedCode` is removed (unnecessarily queried for the code generator) # Additional Context - closes #8310 - TODO: login V2 will have to implement invite flow: https://github.com/zitadel/typescript/issues/166
64 lines
2.7 KiB
HTML
64 lines
2.7 KiB
HTML
{{template "main-top" .}}
|
|
|
|
<div class="lgn-head">
|
|
<h1>{{t "InviteUser.Title"}}</h1>
|
|
|
|
{{ template "user-profile" . }}
|
|
|
|
<p>{{t "InviteUser.Description"}}</p>
|
|
</div>
|
|
|
|
<form action="{{ inviteUserUrl }}" method="POST">
|
|
|
|
{{ .CSRF }}
|
|
|
|
<input type="hidden" name="authRequestID" value="{{ .AuthReqID }}" />
|
|
<input type="hidden" name="userID" value="{{ .UserID }}" />
|
|
<input type="hidden" name="orgID" value="{{ .OrgID }}" />
|
|
<input type="text" name="loginName" value="{{if .DisplayLoginNameSuffix}}{{.LoginName}}{{else}}{{.UserName}}{{end}}" autocomplete="username" class="hidden" />
|
|
|
|
<div class="fields">
|
|
<div class="field">
|
|
<label class="lgn-label" for="code">{{t "InviteUser.CodeLabel"}}</label>
|
|
<input class="lgn-input" {{if .ErrMessage}}shake {{end}} type="text" id="code" name="code" value="{{.Code}}" autocomplete="one-time-code" autofocus
|
|
required>
|
|
</div>
|
|
|
|
<div class="field">
|
|
<label class="lgn-label" for="password">{{t "InviteUser.NewPasswordLabel"}}</label>
|
|
<input data-minlength="{{ .MinLength }}" data-has-uppercase="{{ .HasUppercase }}"
|
|
data-has-lowercase="{{ .HasLowercase }}" data-has-number="{{ .HasNumber }}"
|
|
data-has-symbol="{{ .HasSymbol }}" class="lgn-input" type="password" id="password" name="password"
|
|
autocomplete="new-password" autofocus required>
|
|
</div>
|
|
<div class="field">
|
|
<label class="lgn-label" for="passwordconfirm">{{t "InviteUser.NewPasswordConfirm"}}</label>
|
|
<input class="lgn-input" type="password" id="passwordconfirm" name="passwordconfirm"
|
|
autocomplete="new-password" autofocus required>
|
|
{{ template "password-complexity-policy-description" . }}
|
|
</div>
|
|
</div>
|
|
|
|
{{ template "error-message" .}}
|
|
|
|
<div class="lgn-actions lgn-reverse-order">
|
|
<!-- position element in header -->
|
|
<a class="lgn-icon-button lgn-left-action" href="{{ loginUrl }}">
|
|
<i class="lgn-icon-arrow-left-solid"></i>
|
|
</a>
|
|
|
|
<button type="submit" id="init-button" name="resend" value="false"
|
|
class="lgn-primary lgn-raised-button">{{t "InviteUser.NextButtonText"}}</button>
|
|
|
|
<span class="fill-space"></span>
|
|
|
|
<button type="submit" name="resend" value="true" class="lgn-stroked-button" formnovalidate>{{t "InviteUser.ResendButtonText"}}</button>
|
|
</div>
|
|
</form>
|
|
|
|
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
|
|
<script src="{{ resourceUrl "scripts/password_policy_check.js" }}"></script>
|
|
<script src="{{ resourceUrl "scripts/init_password_check.js" }}"></script>
|
|
|
|
{{template "main-bottom" .}}
|