From d688a64e364f4e300f73fbc3c84705eba8f3654b Mon Sep 17 00:00:00 2001 From: Maksim Eltyshev Date: Tue, 27 Jan 2026 22:34:08 +0100 Subject: [PATCH] feat: Add OIDC debug mode --- client/src/actions/login.js | 7 + client/src/api/access-tokens.js | 3 + .../src/components/common/Login/Content.jsx | 50 ++-- .../common/Login/Content.module.scss | 10 + client/src/constants/ActionTypes.js | 1 + client/src/locales/ar-YE/login.js | 1 + client/src/locales/bg-BG/login.js | 1 + client/src/locales/ca-ES/login.js | 1 + client/src/locales/cs-CZ/login.js | 1 + client/src/locales/da-DK/login.js | 1 + client/src/locales/de-DE/login.js | 1 + client/src/locales/el-GR/login.js | 1 + client/src/locales/en-GB/login.js | 1 + client/src/locales/en-US/login.js | 1 + client/src/locales/es-ES/login.js | 1 + client/src/locales/et-EE/login.js | 1 + client/src/locales/fa-IR/login.js | 1 + client/src/locales/fi-FI/login.js | 1 + client/src/locales/fr-FR/login.js | 1 + client/src/locales/hu-HU/login.js | 1 + client/src/locales/id-ID/login.js | 1 + client/src/locales/it-IT/login.js | 1 + client/src/locales/ja-JP/login.js | 1 + client/src/locales/ko-KR/login.js | 1 + client/src/locales/nl-NL/login.js | 1 + client/src/locales/pl-PL/login.js | 1 + client/src/locales/pt-BR/login.js | 1 + client/src/locales/pt-PT/login.js | 1 + client/src/locales/ro-RO/login.js | 1 + client/src/locales/ru-RU/login.js | 1 + client/src/locales/sk-SK/login.js | 1 + client/src/locales/sr-Cyrl-RS/login.js | 1 + client/src/locales/sr-Latn-RS/login.js | 1 + client/src/locales/sv-SE/login.js | 1 + client/src/locales/tr-TR/login.js | 1 + client/src/locales/uk-UA/login.js | 1 + client/src/locales/uz-UZ/login.js | 1 + client/src/locales/vi-VN/login.js | 1 + client/src/locales/zh-CN/login.js | 1 + client/src/locales/zh-TW/login.js | 1 + client/src/reducers/ui/authenticate-form.js | 7 + client/src/sagas/login/services/login.js | 14 ++ docker-compose-dev.yml | 1 + docker-compose.yml | 1 + server/.env.sample | 1 + .../controllers/access-tokens/debug-oidc.js | 223 ++++++++++++++++++ server/api/controllers/config/test-smtp.js | 9 +- .../users/get-or-create-one-with-oidc.js | 1 + server/api/hooks/oidc/index.js | 7 +- server/config/custom.js | 1 + server/config/policies.js | 1 + server/config/routes.js | 1 + 52 files changed, 349 insertions(+), 24 deletions(-) create mode 100644 server/api/controllers/access-tokens/debug-oidc.js diff --git a/client/src/actions/login.js b/client/src/actions/login.js index da0ccaa1..7cd14692 100644 --- a/client/src/actions/login.js +++ b/client/src/actions/login.js @@ -54,6 +54,13 @@ authenticateWithOidc.failure = (error, terms) => ({ }, }); +authenticateWithOidc.debug = (logs) => ({ + type: ActionTypes.WITH_OIDC_AUTHENTICATE__DEBUG, + payload: { + logs, + }, +}); + const clearAuthenticateError = () => ({ type: ActionTypes.AUTHENTICATE_ERROR_CLEAR, payload: {}, diff --git a/client/src/api/access-tokens.js b/client/src/api/access-tokens.js index 5b423558..426c0501 100755 --- a/client/src/api/access-tokens.js +++ b/client/src/api/access-tokens.js @@ -13,6 +13,8 @@ const createAccessToken = (data, headers) => const exchangeForAccessTokenWithOidc = (data, headers) => http.post('/access-tokens/exchange-with-oidc?withHttpOnlyToken=true', data, headers); +const debugOidc = (data, headers) => http.post('/access-tokens/debug-oidc', data, headers); + // TODO: rename? const acceptTerms = (data, headers) => http.post('/access-tokens/accept-terms', data, headers); @@ -24,6 +26,7 @@ const deleteCurrentAccessToken = (headers) => http.delete('/access-tokens/me', u export default { createAccessToken, exchangeForAccessTokenWithOidc, + debugOidc, acceptTerms, revokePendingToken, deleteCurrentAccessToken, diff --git a/client/src/components/common/Login/Content.jsx b/client/src/components/common/Login/Content.jsx index 29d35963..03904133 100644 --- a/client/src/components/common/Login/Content.jsx +++ b/client/src/components/common/Login/Content.jsx @@ -8,7 +8,8 @@ import React, { useCallback, useEffect, useMemo } from 'react'; import classNames from 'classnames'; import { useDispatch, useSelector } from 'react-redux'; import { useTranslation, Trans } from 'react-i18next'; -import { Button, Divider, Form, Grid, Header, Message } from 'semantic-ui-react'; +import TextareaAutosize from 'react-textarea-autosize'; +import { Button, Divider, Form, Grid, Header, Message, TextArea } from 'semantic-ui-react'; import { useDidUpdate, usePrevious, useToggle } from '../../../lib/hooks'; import { Input } from '../../../lib/custom-ui'; @@ -23,7 +24,7 @@ import logo from '../../../assets/images/logo.png'; import styles from './Content.module.scss'; -const createMessage = (error) => { +const createMessage = (error, isDebug) => { if (!error) { return error; } @@ -82,7 +83,7 @@ const createMessage = (error) => { default: return { type: 'warning', - content: 'common.unknownError', + content: isDebug ? error.message : 'common.unknownError', }; } }; @@ -95,6 +96,7 @@ const Content = React.memo(() => { isSubmitting, isSubmittingWithOidc, error, + debugLogs, step, } = useSelector(selectors.selectAuthenticateForm); @@ -124,7 +126,11 @@ const Content = React.memo(() => { return initialData; }); - const message = useMemo(() => createMessage(error), [error]); + const withOidc = !!bootstrap.oidc; + const isOidcEnforced = withOidc && bootstrap.oidc.isEnforced; + const isOidcDebug = withOidc && bootstrap.oidc.debug; + + const message = useMemo(() => createMessage(error, isOidcDebug), [error, isOidcDebug]); const [focusPasswordFieldState, focusPasswordField] = useToggle(); const [emailOrUsernameFieldRef, handleEmailOrUsernameFieldRef] = useNestedRef('inputRef'); @@ -157,14 +163,11 @@ const Content = React.memo(() => { dispatch(entryActions.clearAuthenticateError()); }, [dispatch]); - const withOidc = !!bootstrap.oidc; - const isOidcEnforced = withOidc && bootstrap.oidc.isEnforced; - useEffect(() => { if (!isOidcEnforced) { emailOrUsernameFieldRef.current.focus(); } - }, [emailOrUsernameFieldRef, isOidcEnforced]); + }, [isOidcEnforced, emailOrUsernameFieldRef]); useDidUpdate(() => { if (wasSubmitting && !isSubmitting && error) { @@ -269,16 +272,27 @@ const Content = React.memo(() => { )} {withOidc && ( -