feat(core): Return OAuth2 error body if available (#5794)

Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
This commit is contained in:
Tom 2023-05-16 11:19:41 +02:00 committed by GitHub
parent b4fd9ba94d
commit 79d0a0f247
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 12 deletions

View file

@ -12,7 +12,7 @@ import type {
INodeCredentialsDetails, INodeCredentialsDetails,
ICredentialsEncrypted, ICredentialsEncrypted,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { LoggerProxy } from 'n8n-workflow'; import { LoggerProxy, jsonStringify } from 'n8n-workflow';
import { resolve as pathResolve } from 'path'; import { resolve as pathResolve } from 'path';
import * as Db from '@/Db'; import * as Db from '@/Db';
@ -173,8 +173,8 @@ oauth2CredentialController.get(
}), }),
); );
const renderCallbackError = (res: express.Response, errorMessage: string) => const renderCallbackError = (res: express.Response, message: string, reason?: string) =>
res.render('oauth-error-callback', { error: { message: errorMessage } }); res.render('oauth-error-callback', { error: { message, reason } });
/** /**
* GET /oauth2-credential/callback * GET /oauth2-credential/callback
@ -192,9 +192,8 @@ oauth2CredentialController.get(
if (!code || !stateEncoded) { if (!code || !stateEncoded) {
return renderCallbackError( return renderCallbackError(
res, res,
`Insufficient parameters for OAuth2 callback. Received following query parameters: ${JSON.stringify( 'Insufficient parameters for OAuth2 callback.',
req.query, `Received following query parameters: ${JSON.stringify(req.query)}`,
)}`,
); );
} }
@ -326,7 +325,12 @@ oauth2CredentialController.get(
return res.sendFile(pathResolve(TEMPLATES_DIR, 'oauth-callback.html')); return res.sendFile(pathResolve(TEMPLATES_DIR, 'oauth-callback.html'));
} catch (error) { } catch (error) {
return renderCallbackError(res, (error as Error).message); return renderCallbackError(
res,
(error as Error).message,
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
'body' in error ? jsonStringify(error.body) : undefined,
);
} }
}, },
); );

View file

@ -3,17 +3,21 @@
<title>n8n - OAuth Callback</title> <title>n8n - OAuth Callback</title>
<style> <style>
body { font-family: 'Open Sans', sans-serif; padding: 10px;} body { font-family: 'Open Sans', sans-serif; padding: 10px;}
pre.error { background: #f7f7f7; border: 1px solid #ddd; border-radius: 3px; padding: 10px; overflow: auto; overflow-wrap: break-word; white-space: pre-wrap; } details.error { margin-bottom: 20px; }
pre.reason { background: #f7f7f7; border: 1px solid #ddd; border-radius: 3px; padding: 10px; overflow: auto; overflow-wrap: break-word; white-space: pre-wrap;}
</style> </style>
</head> </head>
<body> <body>
{{#if error}} {{#if error}}
<h4>Error:</h4> <h4>Error: {{error.message}}</h4>
<pre class='error'>{{error.message}}</pre> <details class='error'>
<summary>More details</summary>
{{#if error.reason}}<pre class="reason">{{error.reason}}</pre>{{/if}}
</details>
{{/if}} {{/if}}
Failed to connect. The window can be closed now. Failed to connect. The window can be closed now.
<script> <script>
(function messageParent() { window.opener.postMessage('error', '*'); })(); (function messageParent() { window.opener?.postMessage('error', '*'); })();
</script> </script>
</body> </body>
</html> </html>