diff options
author | Sebastian <sebasjm@gmail.com> | 2023-03-15 07:21:26 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2023-03-15 07:22:03 -0300 |
commit | 41339c1db25306d8135084d24b1452a3ddd75dbb (patch) | |
tree | 930421098405de341162ff70bd390e666869c934 | |
parent | 64c3cbc1dbc94c207bece0b9f6a399cdacd8dc22 (diff) |
check credetials on login
3 files changed, 34 insertions, 10 deletions
diff --git a/packages/merchant-backoffice-ui/src/components/exception/login.tsx b/packages/merchant-backoffice-ui/src/components/exception/login.tsx index 9a0411642..435ff1d6a 100644 --- a/packages/merchant-backoffice-ui/src/components/exception/login.tsx +++ b/packages/merchant-backoffice-ui/src/components/exception/login.tsx @@ -24,6 +24,7 @@ import { h, VNode } from "preact"; import { useState } from "preact/hooks"; import { useBackendContext } from "../../context/backend.js"; import { useInstanceContext } from "../../context/instance.js"; +import { useCredentialsChecker } from "../../hooks/backend.js"; import { Notification } from "../../utils/types.js"; interface Props { @@ -31,15 +32,15 @@ interface Props { onConfirm: (backend: string, token?: string) => void; } -function getTokenValuePart(t?: string): string | undefined { +function getTokenValuePart(t: string): string { if (!t) return t; const match = /secret-token:(.*)/.exec(t); - if (!match || !match[1]) return undefined; + if (!match || !match[1]) return ""; return match[1]; } -function normalizeToken(r: string | undefined): string | undefined { - return r ? `secret-token:${encodeURIComponent(r)}` : undefined; +function normalizeToken(r: string): string { + return `secret-token:${encodeURIComponent(r)}`; } function cleanUp(s: string): string { @@ -53,8 +54,9 @@ function cleanUp(s: string): string { export function LoginModal({ onConfirm, withMessage }: Props): VNode { const { url: backendUrl, token: baseToken } = useBackendContext(); const { admin, token: instanceToken } = useInstanceContext(); + const testLogin = useCredentialsChecker(); const currentToken = getTokenValuePart( - !admin ? baseToken : instanceToken || "", + (!admin ? baseToken : instanceToken) ?? "", ); const [token, setToken] = useState(currentToken); @@ -137,8 +139,14 @@ export function LoginModal({ onConfirm, withMessage }: Props): VNode { > <button class="button is-info" - onClick={(): void => { - onConfirm(url, normalizeToken(token)); + onClick={async () => { + const secretToken = normalizeToken(token); + const isOk = await testLogin(url, secretToken); + if (isOk) { + onConfirm(url, secretToken); + } else { + onConfirm(url); + } }} > <i18n.Translate>Confirm</i18n.Translate> diff --git a/packages/merchant-backoffice-ui/src/hooks/backend.ts b/packages/merchant-backoffice-ui/src/hooks/backend.ts index 6c4e5c176..93e95934e 100644 --- a/packages/merchant-backoffice-ui/src/hooks/backend.ts +++ b/packages/merchant-backoffice-ui/src/hooks/backend.ts @@ -139,6 +139,25 @@ interface useBackendBaseRequestType { type YesOrNo = "yes" | "no"; +export function useCredentialsChecker() { + const { request } = useApiContext(); + //check against instance details endpoint + //while merchant backend doesn't have a login endpoint + return async function testLogin( + instance: string, + token: string, + ): Promise<boolean> { + try { + const response = await request(instance, `/private/`, { + token, + }); + return true; + } catch (e) { + return false; + } + }; +} + /** * * @param root the request is intended to the base URL and no the instance URL diff --git a/packages/merchant-backoffice-ui/src/hooks/index.ts b/packages/merchant-backoffice-ui/src/hooks/index.ts index bb210c9ba..316620cf7 100644 --- a/packages/merchant-backoffice-ui/src/hooks/index.ts +++ b/packages/merchant-backoffice-ui/src/hooks/index.ts @@ -59,7 +59,6 @@ export function useBackendDefaultToken( export function useBackendInstanceToken( id: string, ): [string | undefined, StateUpdater<string | undefined>] { - const [random, setRandom] = useState(0); const [token, setToken] = useLocalStorage(`backend-token-${id}`); const [defaultToken, defaultSetToken] = useBackendDefaultToken(); @@ -74,8 +73,6 @@ export function useBackendInstanceToken( ): void { setToken((p) => { const toStore = value instanceof Function ? value(p) : value; - // setToken(value) - setRandom(new Date().getTime()); return toStore; }); } |