From c080e196af3bb69d243867e52e49be6dcfba7d08 Mon Sep 17 00:00:00 2001 From: Alec LaLonde Date: Tue, 17 Aug 2021 14:13:02 -0600 Subject: [PATCH] Fixed oauth handler / guild insert --- .../actions/guild/discord/oauthHandler.ts | 19 +++++++------------ packages/discord-bot/src/auth.ts | 16 +++++++++------- packages/web/pages/join/guild/auth.tsx | 8 +++++--- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/packages/backend/src/handlers/actions/guild/discord/oauthHandler.ts b/packages/backend/src/handlers/actions/guild/discord/oauthHandler.ts index 74337dba..ada5c234 100644 --- a/packages/backend/src/handlers/actions/guild/discord/oauthHandler.ts +++ b/packages/backend/src/handlers/actions/guild/discord/oauthHandler.ts @@ -1,7 +1,5 @@ -/* eslint-disable no-console */ import { exchangeCodeForAccessToken, - getCurrentAuthorization, GuildDiscordMetadata, OAuth2CodeExchangeResponse, PartialGuild, @@ -23,7 +21,7 @@ export const handleOAuthCallback = async ( req: Request, res: Response, ): Promise => { - const { input } = req.body; + const { input, session_variables: sessionVariables } = req.body; try { // when confirmed, `code` parameter is sent. @@ -79,20 +77,14 @@ export const handleOAuthCallback = async ( // Guild doesn't already exist: persist guild info fetched in this request const discordMetadata = parseDiscordMetadata(response.oauthResponse); - const currentDiscordUser = await getCurrentAuthorization( - response.oauthResponse.access_token, - ); - - const getPlayerResponse = await client.GetPlayerByDiscordId({ - discordId: currentDiscordUser.user.id, - }); + const playerId = sessionVariables['x-hasura-user-id']; let createGuildResponse: DiscordGuildAuthResponse = { success: false }; try { createGuildResponse = await createNewGuild( discordGuild, discordMetadata, - getPlayerResponse.player[0].id, + playerId, ); } catch (creationError) { // if there was a guildname clash, try again with a uuid @@ -101,9 +93,11 @@ export const handleOAuthCallback = async ( createGuildResponse = await createNewGuild( discordGuild, discordMetadata, - getPlayerResponse.player[0].id, + playerId, ); res.json(createGuildResponse); + } else { + throw new Error(creationError); } } res.json(createGuildResponse); @@ -141,6 +135,7 @@ const createNewGuild = async ( guildname: discordGuild.name.toLowerCase().replace(/[^a-z0-9]/g, ''), discord_id: discordGuild.id, status: GuildStatus_Enum.Pending, + position: 'EXTERNAL', }; if (discordMetadata.logoHash != null) { diff --git a/packages/discord-bot/src/auth.ts b/packages/discord-bot/src/auth.ts index 1ea589de..372f0208 100644 --- a/packages/discord-bot/src/auth.ts +++ b/packages/discord-bot/src/auth.ts @@ -13,7 +13,6 @@ export const tokenRequestData = { client_secret: CONFIG.discordBotClientSecret, grant_type: 'authorization_code', redirect_uri: `${CONFIG.frontendUrl}/${Constants.DISCORD_OAUTH_CALLBACK_PATH}`, - scope: Constants.DISCORD_OAUTH_SCOPES, }; export const exchangeCodeForAccessToken = async ( @@ -24,13 +23,16 @@ export const exchangeCodeForAccessToken = async ( code, }; - const discordResponse = await fetch('https://discord.com/api/oauth2/token', { - method: 'POST', - body: new URLSearchParams(data), - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', + const discordResponse = await fetch( + 'https://discord.com/api/v8/oauth2/token', + { + method: 'POST', + body: new URLSearchParams(data), + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, }, - }); + ); const response: DiscordAccessTokenResponse = { statusCode: discordResponse.status, }; diff --git a/packages/web/pages/join/guild/auth.tsx b/packages/web/pages/join/guild/auth.tsx index 0649019b..1fb61219 100644 --- a/packages/web/pages/join/guild/auth.tsx +++ b/packages/web/pages/join/guild/auth.tsx @@ -7,14 +7,15 @@ const GuildSetupAuthCallback: React.FC = () => { const router = useRouter(); const [authGuildRes, authGuild] = useAuthenticateDiscordGuildMutation(); - const [error, setError] = useState(''); + const [fetching, setFetching] = useState(false); useEffect(() => { // when auth request is denied, we get `error=access_denied` and `error_description` and `state` parameters const { code, error_description: discordErrorDetail } = router.query; if (discordErrorDetail != null) { setError(discordErrorDetail as string); + return; } const submitAuthCode = async () => { @@ -32,10 +33,11 @@ const GuildSetupAuthCallback: React.FC = () => { } } }; - if (!error.length && code) { + if (!fetching && code) { + setFetching(true); submitAuthCode(); } - }, [router, authGuild, error]); + }, [router, authGuild, error, fetching, setFetching]); return (