From 912958e7067b466a193ff7320d72e7307a71afff Mon Sep 17 00:00:00 2001 From: Max Peintner Date: Wed, 28 Jun 2023 11:32:01 +0200 Subject: [PATCH 1/5] rm login part --- apps/login/app/(login)/passkey/login/page.tsx | 57 ------- apps/login/ui/LoginPasskey.tsx | 153 ------------------ 2 files changed, 210 deletions(-) delete mode 100644 apps/login/app/(login)/passkey/login/page.tsx delete mode 100644 apps/login/ui/LoginPasskey.tsx diff --git a/apps/login/app/(login)/passkey/login/page.tsx b/apps/login/app/(login)/passkey/login/page.tsx deleted file mode 100644 index a48578e6596..00000000000 --- a/apps/login/app/(login)/passkey/login/page.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { getSession, server } from "#/lib/zitadel"; -import Alert, { AlertType } from "#/ui/Alert"; -import LoginPasskey from "#/ui/LoginPasskey"; -import RegisterPasskey from "#/ui/RegisterPasskey"; -import UserAvatar from "#/ui/UserAvatar"; -import { getMostRecentCookieWithLoginname } from "#/utils/cookies"; - -export default async function Page({ - searchParams, -}: { - searchParams: Record; -}) { - const { loginName, prompt } = searchParams; - - const sessionFactors = await loadSession(loginName); - - async function loadSession(loginName?: string) { - const recent = await getMostRecentCookieWithLoginname(loginName); - return getSession(server, recent.id, recent.token).then((response) => { - if (response?.session) { - return response.session; - } - }); - } - const title = !!prompt - ? "Authenticate with a passkey" - : "Use your passkey to confirm it's really you"; - const description = !!prompt - ? "When set up, you will be able to authenticate without a password." - : "Your device will ask for your fingerprint, face, or screen lock"; - - return ( -
-

{title}

- - {sessionFactors && ( - - )} -

{description}

- - {!sessionFactors && ( -
- - Could not get the context of the user. Make sure to enter the - username first or provide a loginName as searchParam. - -
- )} - - {sessionFactors?.id && } -
- ); -} diff --git a/apps/login/ui/LoginPasskey.tsx b/apps/login/ui/LoginPasskey.tsx deleted file mode 100644 index 3b067038eb9..00000000000 --- a/apps/login/ui/LoginPasskey.tsx +++ /dev/null @@ -1,153 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { Button, ButtonVariants } from "./Button"; -import { useForm } from "react-hook-form"; -import { useRouter } from "next/navigation"; -import { Spinner } from "./Spinner"; -import Alert from "./Alert"; -import { RegisterPasskeyResponse } from "@zitadel/server"; -import { coerceToArrayBuffer, coerceToBase64Url } from "#/utils/base64"; -type Inputs = {}; - -type Props = { - sessionId: string; -}; - -export default function LoginPasskey({ sessionId }: Props) { - const { login, handleSubmit, formState } = useForm({ - mode: "onBlur", - }); - - const [error, setError] = useState(""); - - const [loading, setLoading] = useState(false); - - const router = useRouter(); - - async function submitLogin( - passkeyId: string, - passkeyName: string, - publicKeyCredential: any, - sessionId: string - ) { - setLoading(true); - const res = await fetch("/passkeys/verify", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - passkeyId, - passkeyName, - publicKeyCredential, - sessionId, - }), - }); - - const response = await res.json(); - - setLoading(false); - if (!res.ok) { - setError(response.details); - return Promise.reject(response.details); - } - return response; - } - - function submitLoginAndContinue(value: Inputs): Promise { - navigator.credentials - .get({ - publicKey: resp.publicKeyCredentialCreationOptions, - }) - .then((assertedCredential: any) => { - if (assertedCredential) { - let authData = new Uint8Array( - assertedCredential.response.authenticatorData - ); - let clientDataJSON = new Uint8Array( - assertedCredential.response.clientDataJSON - ); - let rawId = new Uint8Array(assertedCredential.rawId); - let sig = new Uint8Array(assertedCredential.response.signature); - let userHandle = new Uint8Array( - assertedCredential.response.userHandle - ); - - let data = JSON.stringify({ - id: assertedCredential.id, - rawId: coerceToBase64Url(rawId, "rawId"), - type: assertedCredential.type, - response: { - authenticatorData: coerceToBase64Url(authData, "authData"), - clientDataJSON: coerceToBase64Url( - clientDataJSON, - "clientDataJSON" - ), - signature: coerceToBase64Url(sig, "sig"), - userHandle: coerceToBase64Url(userHandle, "userHandle"), - }, - }); - - return submitLogin(passkeyId, "", data, sessionId); - } else { - setLoading(false); - setError("An error on retrieving passkey"); - return null; - } - }) - .catch((error) => { - console.error(error); - setLoading(false); - // setError(error); - - return null; - }); - } - // return router.push(`/accounts`); - } - - const { errors } = formState; - - return ( -
- {error && ( -
- {error} -
- )} - -
- {isPrompt ? ( - - ) : ( - - )} - - - -
-
- ); -} From a3b412e356f6d9c9d40cbf081b535b86c5642d59 Mon Sep 17 00:00:00 2001 From: Elio Bischof Date: Wed, 28 Jun 2023 14:56:16 +0200 Subject: [PATCH 2/5] fix configuring acceptance env --- CONTRIBUTING.md | 2 +- acceptance/docker-compose.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a3f0e7767b4..44e0914bda4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -51,7 +51,7 @@ docker compose --file ./acceptance/docker-compose.yaml pull docker compose --file ./acceptance/docker-compose.yaml run setup # Configure your shell to use the environment variables written to ./apps/login/.env.acceptance -source ./apps/login/.env.acceptance +export $(cat ./apps/login/.env.acceptance | xargs) ``` ### Developing Against Your ZITADEL Cloud Instance diff --git a/acceptance/docker-compose.yaml b/acceptance/docker-compose.yaml index d12a4291a13..ac2fa512f59 100644 --- a/acceptance/docker-compose.yaml +++ b/acceptance/docker-compose.yaml @@ -45,7 +45,7 @@ services: environment: KEY: /key/zitadel-admin-sa.json SERVICE: http://zitadel:8080 - WRITE_ENVIRONMENT_FILE: /apps/login/.env.local + WRITE_ENVIRONMENT_FILE: /apps/login/.env.acceptance volumes: - "./machinekey:/key" - "../apps/login:/apps/login" From 0f2968ecccc8bd0a71315732b7da456d2d46e5fb Mon Sep 17 00:00:00 2001 From: Max Peintner Date: Thu, 29 Jun 2023 10:26:51 +0200 Subject: [PATCH 3/5] cleanup --- apps/login/ui/RegisterPasskey.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/login/ui/RegisterPasskey.tsx b/apps/login/ui/RegisterPasskey.tsx index 800a57879e9..21f33d6a184 100644 --- a/apps/login/ui/RegisterPasskey.tsx +++ b/apps/login/ui/RegisterPasskey.tsx @@ -152,12 +152,11 @@ export default function RegisterPasskey({ sessionId, isPrompt }: Props) { .catch((error) => { console.error(error); setLoading(false); - // setError(error); + setError(error); return null; }); } - // return router.push(`/accounts`); }); } From 00c8b640c67d60a0661fe3d86be0e30f86e2f102 Mon Sep 17 00:00:00 2001 From: Max Peintner Date: Thu, 29 Jun 2023 12:53:48 +0200 Subject: [PATCH 4/5] spread --- apps/login/app/(login)/passkey/add/page.tsx | 2 +- apps/login/lib/zitadel.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/login/app/(login)/passkey/add/page.tsx b/apps/login/app/(login)/passkey/add/page.tsx index eab8fa47ae6..15237a2d4de 100644 --- a/apps/login/app/(login)/passkey/add/page.tsx +++ b/apps/login/app/(login)/passkey/add/page.tsx @@ -44,7 +44,7 @@ export default async function Page({ A passkey is an authentication method on a device like your - fingerprint, Apple FaceID or similar.{" "} + fingerprint, Apple FaceID or similar. { const mgmt = user.getUser(server); + + const payload = { + email: { email }, + username: email, + profile: { firstName, lastName }, + }; return mgmt .addHumanUser( password ? { - email: { email }, - username: email, - profile: { firstName, lastName }, + ...payload, password: { password }, } - : { - email: { email }, - username: email, - profile: { firstName, lastName }, - }, + : payload, {} ) .then((resp: AddHumanUserResponse) => { From 5e93ed7cd38ca99928cd36a72b637e2c2871295a Mon Sep 17 00:00:00 2001 From: Max Peintner Date: Thu, 29 Jun 2023 13:10:28 +0200 Subject: [PATCH 5/5] empty avatar without loginname --- apps/login/ui/UserAvatar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/login/ui/UserAvatar.tsx b/apps/login/ui/UserAvatar.tsx index 6ab823bc4d1..053656d83d0 100644 --- a/apps/login/ui/UserAvatar.tsx +++ b/apps/login/ui/UserAvatar.tsx @@ -18,8 +18,8 @@ export default function UserAvatar({
{loginName}