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 && ( -