From 8a6d405bd315c720ce561d52f072cbd069aeca4a Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 30 Jul 2024 21:44:04 -0400 Subject: [PATCH] feat(SocialLogins.tsx): Finish login with Apple implementation --- bun.lockb | Bin 158030 -> 164531 bytes index.html | 1 - package.json | 2 +- src/backend/types.ts | 14 ++++++++ src/ui/components/SocialLogins.tsx | 56 +++++++++++++++++++++++++---- 5 files changed, 64 insertions(+), 9 deletions(-) diff --git a/bun.lockb b/bun.lockb index 71a7ff4138c42efbc3d0214b47e6bca26ad3f3e0..9639694553cfdc211ffd5ae270dd6b4e67566c25 100644 GIT binary patch delta 32122 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 delta 27529 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 diff --git a/index.html b/index.html index 0f4a8c6..d07178c 100644 --- a/index.html +++ b/index.html @@ -9,7 +9,6 @@ - seiKiMo Inc. diff --git a/package.json b/package.json index a2b0952..078e400 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "axios": "^1.4.0", "highlight.js": "^11.8.0", "react": "^18.2.0", - "react-apple-login": "^1.1.6", + "react-apple-signin-auth": "^1.1.0", "react-dom": "^18.2.0", "react-icons": "^4.10.1", "react-router-dom": "^6.8.1", diff --git a/src/backend/types.ts b/src/backend/types.ts index fcc0e75..8a134f8 100644 --- a/src/backend/types.ts +++ b/src/backend/types.ts @@ -24,6 +24,20 @@ export type AccountCredentials = { token: string; }; +export type AppleLoginResponse = { + authorization: { + code: string; + id_token: string; + }; + user?: { + name: { + firstName: string; + lastName: string; + }; + email: string; + }; +}; + export type Profile = { icon: string; displayName: string; diff --git a/src/ui/components/SocialLogins.tsx b/src/ui/components/SocialLogins.tsx index 7ec9ffe..db1b620 100644 --- a/src/ui/components/SocialLogins.tsx +++ b/src/ui/components/SocialLogins.tsx @@ -1,12 +1,13 @@ import React from "react"; -import AppleLogin from "react-apple-login"; +import AppleLogin from "react-apple-signin-auth"; import { ReactComponent as GoogleIcon } from "@icons/google.svg"; import { ReactComponent as DiscordIcon } from "@icons/discord.svg"; import { expectedOrigin, newCall } from "@app/index"; import { getRedirectUrl, handoffCode } from "@utils/login"; +import type { AppleLoginResponse } from "@backend/types"; import "@css/Account.scss"; @@ -28,6 +29,14 @@ function socialLogin(route: string, name: string): void { // Focus the window. authWindow.focus(); + + waitForLogin(); +} + +/** + * Adds an event listener which waits for a login response. + */ +function waitForLogin() { // Add a message handler. window.addEventListener("message", (event) => { // Check the event origin. @@ -48,6 +57,34 @@ function socialLogin(route: string, name: string): void { }); } +/** + * Invoked when the completion of an Apple login takes place. + * + * @param appleResponse The response from the Apple login. + */ +async function onAppleLogin(appleResponse: AppleLoginResponse) { + const { user, authorization: { code } } = appleResponse; + + // Check if the user was specified. + const userEncoded = user == null ? "none" : btoa(JSON.stringify(user)); + + // Exchange with the backend server for a token. + const response = await fetch(newCall(`account/login/apple?code=${code}&user=${userEncoded}`)); + if (response.status != 200) { + alert("Failed to authenticate with Apple."); + return; + } + + // Store the credentials in the local storage. + const credentials = await response.text(); + localStorage.setItem("credentials", credentials); + + // Encode the credentials. + const encoded = btoa(credentials); + // Redirect to the redirect URL. + window.location.replace(getRedirectUrl(handoffCode() ? encoded : undefined)); +} + interface IButtonProps { gap: number; service: string; @@ -91,19 +128,24 @@ function SocialLogins() { ( + authOptions={{ + clientId: import.meta.env.VITE_APPLE_CLIENT_ID ?? "", + redirectURI: import.meta.env.VITE_APPLE_REDIRECT_URI ?? "", + scope: "email name", + usePopup: true + }} + render={(props: any) => ( )} - usePopup={true} - clientId={import.meta.env.VITE_APPLE_CLIENT_ID ?? ""} - redirectURI={import.meta.env.VITE_APPLE_REDIRECT_URI ?? ""} + uiType={"dark"} + onSuccess={onAppleLogin} + onError={(error: any) => alert(error)} /> );