mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-18 05:52:51 +00:00
**Supersedes #12471** by @conblem — same fix, rebased onto current `main` with conflicts resolved and review feedback applied. Original commits are preserved, all credit to @conblem. Closes #12252 ### Problem After an RP-initiated logout (`end_session` with `id_token_hint`), Login V2 redirected straight to `/loginname` instead of showing the account picker like Login V1. The `sessions` cookie still referenced the previous accounts, but their server-side sessions had been terminated, so `listSessions` returned nothing and the flow treated the browser as having no accounts at all. ### Solution - `handleOIDCFlowInitiation` now checks the `sessions` cookie (`hasCookieAccount`) when no live session is eligible for the request's organization. If the cookie still knows an account and the RP passed no `login_hint`, the user is sent to `/accounts` instead of `/loginname`. `prompt=none` is excluded since it must never render UI. - `/accounts` synthesizes an (invalid) `Session` for each cookie entry that has no live counterpart, so the account is still listed and a click re-authenticates via `/loginname` → password in one step. - `clearSession` prunes the cookie entry when the server reports the session as already gone (`NotFound` / `PermissionDenied`), so stale cards can be dismissed. Any other error is rethrown so a still-valid server session is never silently orphaned. - `getAllSessionCookieIds` is now a thin wrapper over `getAllSessions`; `FlowInitiationParams.sessionCookies` is typed as `Cookie[]`. - Tests: new `describe` block covering the cookie fallback, `login_hint` precedence, `prompt=none`, org-scope matching/mismatch, and `SELECT_ACCOUNT` / default prompt with live sessions filtered out by org. - Also adds `.claude/`, `.cursor/`, `.codex/`, `.windsurf/`, `.copilot/`, `.aider*` to `.gitignore`. --------- Co-authored-by: conblem <[email protected]>
464 lines
22 KiB
JSON
464 lines
22 KiB
JSON
{
|
|
"common": {
|
|
"back": "戻る",
|
|
"title": "Zitadelでログイン"
|
|
},
|
|
"accounts": {
|
|
"title": "アカウント",
|
|
"description": "使用するアカウントを選択してください。",
|
|
"addAnother": "別のアカウントを追加",
|
|
"noResults": "アカウントが見つかりません",
|
|
"verified": "認証済み",
|
|
"expired": "期限切れ"
|
|
},
|
|
"logout": {
|
|
"title": "ログアウト",
|
|
"description": "セッションを終了するアカウントをクリックしてください",
|
|
"noResults": "アカウントが見つかりません",
|
|
"clear": "セッション終了",
|
|
"verifiedAt": "最後のアクティブ: {time}",
|
|
"success": {
|
|
"title": "ログアウト完了",
|
|
"description": "正常にログアウトしました。"
|
|
}
|
|
},
|
|
"loginname": {
|
|
"title": "お帰りなさい!",
|
|
"description": "ログイン情報を入力してください。",
|
|
"register": "新規ユーザー登録",
|
|
"submit": "続行",
|
|
"labels": {
|
|
"loginname": "ログイン名",
|
|
"username": "ユーザー名",
|
|
"usernameOrPhoneNumber": "ユーザー名または電話番号",
|
|
"usernameOrEmail": "ユーザー名またはメールアドレス"
|
|
},
|
|
"required": {
|
|
"loginName": "必須項目です"
|
|
},
|
|
"errors": {
|
|
"internalError": "内部エラーが発生しました",
|
|
"couldNotGetLoginSettings": "ログイン設定を取得できませんでした",
|
|
"couldNotSearchUsers": "ユーザーを検索できませんでした",
|
|
"couldNotGetDomain": "ドメインを取得できませんでした",
|
|
"couldNotGetHost": "ホストを取得できませんでした",
|
|
"couldNotStartIDPFlow": "IDPフローを開始できませんでした",
|
|
"moreThanOneUserFound": "複数のユーザーが見つかりました。一意の識別子を指定してください。",
|
|
"userNotFound": "ユーザーがシステムに見つかりません",
|
|
"couldNotCreateSession": "ユーザーのセッションを作成できませんでした",
|
|
"initialUserNotSupported": "初期ユーザーはサポートされていません",
|
|
"localAuthenticationNotAllowed": "ローカル認証は許可されていません! 詳細については管理者に問い合わせてください。",
|
|
"passkeysNotAllowed": "パスキーは許可されていません!詳細については管理者にお問い合わせください。",
|
|
"couldNotFindIdentityProvider": "IDプロバイダーが見つかりませんでした。",
|
|
"userNotActive": "ユーザーはアクティブではありません。詳細については管理者にお問い合わせください。"
|
|
}
|
|
},
|
|
"password": {
|
|
"verify": {
|
|
"title": "パスワード",
|
|
"description": "パスワードを入力してください。",
|
|
"resetPassword": "パスワードをリセット",
|
|
"submit": "続行",
|
|
"labels": {
|
|
"password": "パスワード"
|
|
},
|
|
"required": {
|
|
"password": "必須項目です"
|
|
},
|
|
"errors": {
|
|
"couldNotVerifyPassword": "パスワードを確認できませんでした",
|
|
"couldNotResetPassword": "パスワードをリセットできませんでした"
|
|
},
|
|
"info": {
|
|
"passwordResetSent": "パスワードがリセットされました。メールを確認してください"
|
|
}
|
|
},
|
|
"set": {
|
|
"title": "パスワード設定",
|
|
"description": "アカウントのパスワードを設定してください",
|
|
"codeSent": "新しいコードがメールアドレスに送信されました。",
|
|
"noCodeReceived": "コードが届きませんか?",
|
|
"resend": "コードを再送信",
|
|
"submit": "続行",
|
|
"labels": {
|
|
"code": "コード",
|
|
"newPassword": "新しいパスワード",
|
|
"confirmPassword": "パスワード確認"
|
|
},
|
|
"required": {
|
|
"code": "必須項目です",
|
|
"newPassword": "パスワードを入力してください!",
|
|
"confirmPassword": "必須項目です"
|
|
},
|
|
"errors": {
|
|
"couldNotSetPassword": "パスワードを設定できませんでした",
|
|
"couldNotResetPassword": "パスワードをリセットできませんでした",
|
|
"couldNotVerifyPassword": "パスワードを確認できませんでした"
|
|
}
|
|
},
|
|
"change": {
|
|
"title": "パスワード変更",
|
|
"description": "アカウントのパスワードを設定してください",
|
|
"submit": "続行",
|
|
"labels": {
|
|
"currentPassword": "現在のパスワード",
|
|
"newPassword": "新しいパスワード",
|
|
"confirmPassword": "パスワード確認"
|
|
},
|
|
"required": {
|
|
"currentPassword": "現在のパスワードを入力してください!",
|
|
"newPassword": "新しいパスワードを入力してください!",
|
|
"confirmPassword": "必須項目です"
|
|
},
|
|
"errors": {
|
|
"currentPasswordInvalid": "現在のパスワードが正しくありません。",
|
|
"couldNotChangePassword": "パスワードを変更できませんでした",
|
|
"couldNotVerifyPassword": "パスワードを確認できませんでした",
|
|
"unknownError": "不明なエラー"
|
|
}
|
|
},
|
|
"errors": {
|
|
"passwordVerificationMissing": "パスワード確認がありません。",
|
|
"passwordVerificationTooOld": "パスワード確認が古すぎます。もう一度パスワードを確認してください。",
|
|
"noHostFound": "ホストが見つかりません",
|
|
"couldNotSendResetLink": "パスワードリセットリンクを送信できませんでした",
|
|
"couldNotCreateSessionForUser": "ユーザーのセッションを作成できませんでした",
|
|
"couldNotVerifyPassword": "パスワードを確認できませんでした",
|
|
"failedToAuthenticate": "認証に失敗しました。パスワード試行回数 {maxPasswordAttempts} 回中 {failedAttempts} 回失敗しました。{lockoutMessage}",
|
|
"failedToAuthenticateNoLimit": "認証に失敗しました。",
|
|
"accountLockedContactAdmin": " アカウントのロックを解除するには管理者に連絡してください",
|
|
"userNotFound": "ユーザーがシステムに見つかりません",
|
|
"initialUserNotSupported": "初期ユーザーはサポートされていません",
|
|
"userInitialStateNotSupported": "ユーザーの初期状態はサポートされていません",
|
|
"codeOrVerificationRequired": "コードを提供するか、有効なユーザー確認チェックを行う必要があります",
|
|
"verificationRequired": "ユーザー確認チェックを行う必要があります",
|
|
"couldNotLoadSession": "セッションを読み込めませんでした",
|
|
"couldNotLoadAuthMethods": "認証方法を読み込めませんでした",
|
|
"failedPrecondition": "前提条件に失敗しました",
|
|
"sessionNotValid": "セッションが無効です"
|
|
},
|
|
"complexity": {
|
|
"length": "{minLength} 文字以上である必要があります。",
|
|
"hasSymbol": "記号を含める必要があります。",
|
|
"hasNumber": "数字を含める必要があります。",
|
|
"hasUppercase": "大文字を含める必要があります。",
|
|
"hasLowercase": "小文字を含める必要があります。",
|
|
"equals": "パスワード確認が一致しました。",
|
|
"matches": "一致します",
|
|
"doesNotMatch": "一致しません"
|
|
}
|
|
},
|
|
"idp": {
|
|
"title": "SSOでサインイン",
|
|
"description": "以下のプロバイダーを選択してサインインしてください",
|
|
"orSignInWith": "または次でサインイン",
|
|
"signInWithApple": "Appleでサインイン",
|
|
"signInWithGoogle": "Googleでサインイン",
|
|
"signInWithAzureAD": "AzureADでサインイン",
|
|
"signInWithGithub": "GitHubでサインイン",
|
|
"signInWithGitlab": "GitLabでサインイン",
|
|
"signInWithZitadel": "Zitadelでサインイン",
|
|
"loginError": {
|
|
"title": "ログイン失敗",
|
|
"description": "ログインの際にエラーが発生しました。"
|
|
},
|
|
"linkingError": {
|
|
"title": "アカウント連携失敗",
|
|
"description": "アカウント連携の際にエラーが発生しました。"
|
|
},
|
|
"completeRegister": {
|
|
"title": "データを完成させる",
|
|
"description": "メールアドレスと名前を入力して登録を完了してください。"
|
|
},
|
|
"accountNotFound": {
|
|
"title": "アカウントが見つかりません",
|
|
"description": "アイデンティティプロバイダの認証情報に関連付けられたアカウントが見つかりませんでした。",
|
|
"info": "既存のアカウントが見つかりませんでした。既存のアカウントでサインインするか、管理者にお問い合わせください。",
|
|
"backToLogin": "ログインに戻る"
|
|
},
|
|
"registrationFailed": {
|
|
"title": "登録が利用できません",
|
|
"description": "登録プロセスを完了できませんでした。",
|
|
"info": "登録する組織を特定できませんでした。管理者にお問い合わせください。",
|
|
"backToLogin": "ログインに戻る"
|
|
},
|
|
"processing": {
|
|
"message": "認証を処理しています...",
|
|
"noRedirect": "サーバーからリダイレクトまたはエラーが返されませんでした",
|
|
"unexpectedError": "予期しないエラーが発生しました"
|
|
},
|
|
"errors": {
|
|
"missingParameters": "必要なパラメータが不足しています",
|
|
"missingIdpInfo": "IDP情報が不足しています",
|
|
"idpNotFound": "アイデンティティプロバイダが見つかりません",
|
|
"linkingNotAllowed": "このアイデンティティプロバイダとの連携は許可されていません",
|
|
"linkingFailed": "アイデンティティプロバイダのアカウントへの連携に失敗しました",
|
|
"autoLinkingFailed": "アカウントの自動連携に失敗しました",
|
|
"userCreationFailed": "ユーザーアカウントの作成に失敗しました",
|
|
"orgResolutionFailed": "登録する組織を特定できませんでした",
|
|
"sessionCreationFailed": "セッションの作成またはリダイレクトの決定に失敗しました",
|
|
"unknownError": "不明なエラーが発生しました"
|
|
}
|
|
},
|
|
"ldap": {
|
|
"title": "LDAPログイン",
|
|
"description": "LDAP認証情報を入力してください。",
|
|
"submit": "続行",
|
|
"labels": {
|
|
"username": "ユーザー名",
|
|
"password": "パスワード"
|
|
},
|
|
"required": {
|
|
"username": "必須項目です",
|
|
"password": "必須項目です"
|
|
}
|
|
},
|
|
"mfa": {
|
|
"verify": {
|
|
"title": "本人確認",
|
|
"description": "以下の要素の中から一つを選択してください。",
|
|
"noResults": "設定可能な二要素認証がありません。"
|
|
},
|
|
"set": {
|
|
"title": "二要素認証の設定",
|
|
"description": "以下の二要素認証の中から一つを選択してください。",
|
|
"skip": "スキップ"
|
|
}
|
|
},
|
|
"otp": {
|
|
"verify": {
|
|
"title": "二要素認証",
|
|
"totpDescription": "認証アプリからコードを入力してください。",
|
|
"smsDescription": "SMSで受信したコードを入力してください。",
|
|
"emailDescription": "メールで受信したコードを入力してください。",
|
|
"noCodeReceived": "コードが届きませんか?",
|
|
"resendCode": "コードを再送信",
|
|
"submit": "続行",
|
|
"labels": {
|
|
"code": "コード"
|
|
},
|
|
"required": {
|
|
"code": "必須項目です"
|
|
}
|
|
},
|
|
"set": {
|
|
"title": "二要素認証の設定",
|
|
"totpDescription": "認証アプリでQRコードをスキャンしてください。",
|
|
"smsDescription": "SMSでコードを受信する電話番号を入力してください。",
|
|
"emailDescription": "メールでコードを受信するメールアドレスを入力してください。",
|
|
"totpRegisterDescription": "QRコードをスキャンするか、URLに手動でアクセスしてください。",
|
|
"submit": "続行",
|
|
"labels": {
|
|
"code": "コード"
|
|
},
|
|
"required": {
|
|
"code": "必須項目です"
|
|
}
|
|
}
|
|
},
|
|
"passkey": {
|
|
"verify": {
|
|
"title": "パスキーで認証",
|
|
"description": "デバイスが指紋、顔、または画面ロックの入力を求めます",
|
|
"usePassword": "パスワードを使用",
|
|
"submit": "続行",
|
|
"errors": {
|
|
"couldNotRequestChallenge": "パスキーチャレンジを要求できませんでした",
|
|
"couldNotVerifyPasskey": "パスキーを確認できませんでした",
|
|
"noResponseReceived": "パスキー確認に失敗しました - 応答がありません",
|
|
"noRedirectProvided": "パスキー確認は完了しましたが、リダイレクトが提供されませんでした",
|
|
"couldNotRetrievePasskey": "パスキーの取得中にエラーが発生しました",
|
|
"verificationCancelled": "パスキー確認がキャンセルされました",
|
|
"verificationFailed": "パスキー確認中にエラーが発生しました",
|
|
"couldNotFindSession": "セッションが見つかりませんでした",
|
|
"couldNotUpdateSession": "セッションを更新できませんでした",
|
|
"userNotFound": "ユーザーがシステムに見つかりません",
|
|
"couldNotDetermineRedirect": "パスキー確認後のリダイレクトURLを決定できませんでした"
|
|
}
|
|
},
|
|
"set": {
|
|
"title": "パスキーの設定",
|
|
"description": "デバイスが指紋、顔、または画面ロックの入力を求めます",
|
|
"info": {
|
|
"description": "パスキーは、指紋やApple FaceIDなどのデバイス上の認証方法です。",
|
|
"link": "パスキー認証"
|
|
},
|
|
"skip": "スキップ",
|
|
"submit": "続行"
|
|
}
|
|
},
|
|
"u2f": {
|
|
"verify": {
|
|
"title": "二要素認証",
|
|
"description": "デバイスでアカウントを確認してください。"
|
|
},
|
|
"set": {
|
|
"title": "二要素認証の設定",
|
|
"description": "デバイスを二要素認証として設定します。",
|
|
"submit": "続行"
|
|
}
|
|
},
|
|
"register": {
|
|
"methods": {
|
|
"passkey": "パスキー",
|
|
"password": "パスワード"
|
|
},
|
|
"disabled": {
|
|
"title": "登録が無効",
|
|
"description": "登録が無効になっています。管理者にお問い合わせください。"
|
|
},
|
|
"missingdata": {
|
|
"title": "データが不足",
|
|
"description": "登録するにはメールアドレス、姓、名を入力してください。"
|
|
},
|
|
"title": "登録",
|
|
"description": "Zitadelアカウントを作成します。",
|
|
"noMethodAvailableWarning": "使用可能な認証方法がありません。管理者にお問い合わせください。",
|
|
"selectMethod": "認証に使用する方法を選択してください",
|
|
"agreeTo": "登録するには利用規約に同意する必要があります",
|
|
"termsOfService": "利用規約",
|
|
"privacyPolicy": "プライバシーポリシー",
|
|
"submit": "続行",
|
|
"password": {
|
|
"title": "パスワード設定",
|
|
"description": "アカウントのパスワードを設定してください",
|
|
"submit": "続行",
|
|
"labels": {
|
|
"password": "パスワード",
|
|
"confirmPassword": "パスワード確認"
|
|
},
|
|
"required": {
|
|
"password": "パスワードを入力してください!",
|
|
"confirmPassword": "必須項目です"
|
|
}
|
|
},
|
|
"labels": {
|
|
"firstname": "名",
|
|
"lastname": "姓",
|
|
"email": "メールアドレス"
|
|
},
|
|
"required": {
|
|
"firstname": "必須項目です",
|
|
"lastname": "必須項目です",
|
|
"email": "必須項目です"
|
|
},
|
|
"errors": {
|
|
"couldNotCreateUser": "ユーザーを作成できませんでした",
|
|
"couldNotCreateSession": "セッションを作成できませんでした",
|
|
"userNotFound": "ユーザーがシステムに見つかりません",
|
|
"couldNotLinkIDP": "IDPをユーザーにリンクできませんでした",
|
|
"couldNotRegisterUser": "ユーザーを登録できませんでした"
|
|
}
|
|
},
|
|
"invite": {
|
|
"title": "ユーザー招待",
|
|
"description": "招待するユーザーのメールアドレスと名前を入力してください。",
|
|
"info": "ユーザーには詳細な手順が記載されたメールが送信されます。",
|
|
"notAllowed": "設定によりユーザーを招待できません。",
|
|
"submit": "続行",
|
|
"success": {
|
|
"title": "ユーザーを招待しました",
|
|
"description": "メールが正常に送信されました。",
|
|
"verified": "ユーザーが招待され、既にメールアドレスが確認済みです。",
|
|
"notVerifiedYet": "ユーザーが招待されました。詳細な手順が記載されたメールを受信します。",
|
|
"submit": "別のユーザーを招待"
|
|
}
|
|
},
|
|
"signedin": {
|
|
"title": "ようこそ {user}さん!",
|
|
"description": "サインインしました。",
|
|
"continue": "続行",
|
|
"error": {
|
|
"title": "エラー",
|
|
"description": "サインインの際にエラーが発生しました。"
|
|
}
|
|
},
|
|
"verify": {
|
|
"userIdMissing": "ユーザーIDが指定されていません!",
|
|
"successTitle": "ユーザー確認完了",
|
|
"successDescription": "ユーザーの確認が正常に完了しました。",
|
|
"successContinue": "続行",
|
|
"setupAuthenticator": "認証の設定",
|
|
"verify": {
|
|
"title": "ユーザー確認",
|
|
"description": "確認メールに記載されたコードを入力してください。",
|
|
"noCodeReceived": "コードが届きませんか?",
|
|
"resendCode": "コードを再送信",
|
|
"codeSent": "確認コードをメールアドレスに送信しました。",
|
|
"submit": "続行",
|
|
"labels": {
|
|
"code": "コード"
|
|
},
|
|
"required": {
|
|
"code": "必須項目です"
|
|
}
|
|
},
|
|
"errors": {
|
|
"couldNotResendEmail": "メールを再送信できませんでした",
|
|
"couldNotVerifyUser": "ユーザーを確認できませんでした",
|
|
"couldNotVerifyInvite": "招待を確認できませんでした",
|
|
"couldNotVerifyEmail": "メールアドレスを確認できませんでした",
|
|
"couldNotVerify": "確認できませんでした",
|
|
"couldNotLoadUser": "ユーザーを読み込めませんでした",
|
|
"couldNotLoadAuthenticators": "認証方法を読み込めませんでした",
|
|
"couldNotCreateSession": "セッションを作成できませんでした",
|
|
"noHostFound": "ホストが見つかりません",
|
|
"userAlreadyVerified": "ユーザーは既に確認済みです!",
|
|
"couldNotResendInvite": "招待を再送信できませんでした",
|
|
"inviteSendFailed": "招待メールの送信に失敗しました",
|
|
"emailSendFailed": "確認メールの送信に失敗しました",
|
|
"contextMissing": "エラーが発生しました。もう一度お試しください。"
|
|
}
|
|
},
|
|
"authenticator": {
|
|
"title": "認証方法を選択",
|
|
"description": "認証に使用する方法を選択してください",
|
|
"noMethodsAvailable": "使用可能な認証方法がありません",
|
|
"allSetup": "認証の設定は既に完了しています!",
|
|
"linkWithIDP": "またはIDプロバイダーと連携"
|
|
},
|
|
"device": {
|
|
"usercode": {
|
|
"title": "デバイスコード",
|
|
"description": "アプリまたはデバイスに表示されるコードを入力してください。",
|
|
"submit": "続行",
|
|
"labels": {
|
|
"code": "コード"
|
|
},
|
|
"required": {
|
|
"code": "必須項目です"
|
|
}
|
|
},
|
|
"request": {
|
|
"title": "{appName}が接続を要求しています",
|
|
"description": "{appName}は以下にアクセスします:",
|
|
"disclaimer": "「許可」をクリックすることで、{appName}とZitadelがそれぞれの利用規約およびプライバシーポリシーに従ってあなたの情報を使用することを許可します。このアクセスはいつでも取り消すことができます。",
|
|
"submit": "許可",
|
|
"deny": "拒否"
|
|
},
|
|
"scope": {
|
|
"openid": "本人確認を行います。",
|
|
"email": "メールアドレスを表示します。",
|
|
"profile": "すべてのプロフィール情報を表示します。",
|
|
"offline_access": "アカウントへのオフラインアクセスを許可します。"
|
|
}
|
|
},
|
|
"error": {
|
|
"noUserCode": "ユーザーコードが指定されていません!",
|
|
"noDeviceRequest": "デバイスリクエストが見つかりません。",
|
|
"unknownContext": "ユーザーのコンテキストを取得できませんでした。最初にユーザー名を入力するか、検索パラメータとしてloginNameを指定してください。",
|
|
"sessionExpired": "現在のセッションが期限切れです。再度ログインしてください。",
|
|
"failedLoading": "データの読み込みに失敗しました。再試行してください。",
|
|
"tryagain": "再試行",
|
|
"couldNotContinueSession": "セッションを継続できませんでした - ユーザー情報が不足しています",
|
|
"couldNotClearSession": "セッションを終了できませんでした。もう一度お試しください。"
|
|
},
|
|
"zitadel": {
|
|
"errors": {
|
|
"errorOccured": "エラーが発生しました",
|
|
"multipleUsersFound": "複数のユーザーが見つかりました",
|
|
"userNotFound": "ユーザーがシステムに見つかりません"
|
|
}
|
|
}
|
|
}
|