aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2024-07-09 21:11:13 +0100
committerGravatar Joe Banks <[email protected]>2024-07-10 01:56:38 +0100
commit0bf31556d7afc359ce0ebb145c962f224e547bd1 (patch)
treeb76cffa1845fa5bbac13c2636f6f3ba6220de1a0
parentAdd AuthorizationSplash to display above content when auth in progress (diff)
Gracefully handle user cancelled authorization
-rw-r--r--src/api/auth.ts9
-rw-r--r--src/components/OAuth2Button.tsx6
2 files changed, 12 insertions, 3 deletions
diff --git a/src/api/auth.ts b/src/api/auth.ts
index 2838e4b..11baaa6 100644
--- a/src/api/auth.ts
+++ b/src/api/auth.ts
@@ -36,6 +36,7 @@ export enum APIErrorMessages {
BackendValidationDev = "Backend could not authorize with Discord, possibly due to being on a preview branch. Please contact the forms team.",
BackendUnresponsive = "Unable to reach the backend, please retry, or contact the forms team.",
BadResponse = "The server returned a bad response, please contact the forms team.",
+ AccessRejected = "Authorization was cancelled.",
Unknown = "An unknown error occurred, please contact the forms team."
}
@@ -98,7 +99,7 @@ export function checkScopes(scopes?: OAuthScopes[]): boolean {
* @returns {code, cleanedScopes} The discord authorization code and the scopes the code is granted for.
* @throws {Error} Indicates that an integrity check failed.
*/
-export async function getDiscordCode(scopes: OAuthScopes[], disableFunction?: (disable: boolean) => void): Promise<{code: string, cleanedScopes: OAuthScopes[]}> {
+export async function getDiscordCode(scopes: OAuthScopes[], disableFunction?: (disable: boolean) => void): Promise<{code: string | null, cleanedScopes: OAuthScopes[]}> {
const cleanedScopes = ensureMinimumScopes(scopes, OAuthScopes.Identify);
// Generate a new user state
@@ -267,6 +268,12 @@ export default async function authorize(scopes: OAuthScopes[] = [], disableFunct
if (disableFunction) { disableFunction(true); }
await getDiscordCode(scopes, disableFunction).then(async discord_response =>{
+ if (!discord_response.code) {
+ throw {
+ Message: APIErrorMessages.AccessRejected,
+ Error: null
+ };
+ }
await requestBackendJWT(discord_response.code).then(backend_response => {
const options: CookieSetOptions = {sameSite: "strict", secure: PRODUCTION, path: "/", expires: new Date(3000, 1)};
cookies.set(CookieNames.Username, backend_response.username, options);
diff --git a/src/components/OAuth2Button.tsx b/src/components/OAuth2Button.tsx
index be8d160..67399ee 100644
--- a/src/components/OAuth2Button.tsx
+++ b/src/components/OAuth2Button.tsx
@@ -55,8 +55,10 @@ async function login(props: OAuth2ButtonProps, errorDialog: React.RefObject<HTML
}
// Propagate to sentry
- reason.Error.stack = new Error(`OAuth: ${reason.Message}`).stack + "\n" + reason.Error.stack;
- throw reason.Error;
+ if (reason.Error) {
+ reason.Error.stack = new Error(`OAuth: ${reason.Message}`).stack + "\n" + reason.Error.stack;
+ throw reason.Error;
+ }
});
if (checkScopes(props.scopes) && props.rerender) {