From e3853ae402412719bb13fc1d6f9dc711e17f68e1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 20 Sep 2021 11:48:51 +0100 Subject: [PATCH] Improve error reporting with oauth login strategies --- .../@node-red/editor-api/lib/auth/index.js | 24 ++++++++++++--- .../@node-red/editor-api/lib/editor/ui.js | 11 ++++++- .../editor-client/src/images/node-red-256.svg | 1 + .../@node-red/editor-client/src/js/user.js | 30 +++++++++++++++---- .../editor-client/templates/index.mst | 4 +++ 5 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/images/node-red-256.svg diff --git a/packages/node_modules/@node-red/editor-api/lib/auth/index.js b/packages/node_modules/@node-red/editor-api/lib/auth/index.js index 5552301d0..f32f6d0d6 100644 --- a/packages/node_modules/@node-red/editor-api/lib/auth/index.js +++ b/packages/node_modules/@node-red/editor-api/lib/auth/index.js @@ -199,8 +199,12 @@ function genericStrategy(adminApp,strategy) { passport.use(new strategy.strategy(options, verify)); adminApp.get('/auth/strategy', - passport.authenticate(strategy.name, {session:false, failureRedirect: settings.httpAdminRoot }), - completeGenerateStrategyAuth + passport.authenticate(strategy.name, {session:false, + failureMessage: true, + failureRedirect: settings.httpAdminRoot + }), + completeGenerateStrategyAuth, + handleStrategyError ); var callbackMethodFunc = adminApp.get; @@ -208,8 +212,13 @@ function genericStrategy(adminApp,strategy) { callbackMethodFunc = adminApp.post; } callbackMethodFunc.call(adminApp,'/auth/strategy/callback', - passport.authenticate(strategy.name, {session:false, failureRedirect: settings.httpAdminRoot }), - completeGenerateStrategyAuth + passport.authenticate(strategy.name, { + session:false, + failureMessage: true, + failureRedirect: settings.httpAdminRoot + }), + completeGenerateStrategyAuth, + handleStrategyError ); } @@ -219,6 +228,13 @@ function completeGenerateStrategyAuth(req,res) { // Successful authentication, redirect home. res.redirect(settings.httpAdminRoot + '?access_token='+tokens.accessToken); } +function handleStrategyError(err, req, res, next) { + if (res.headersSent) { + return next(err) + } + log.audit({event: "auth.login.fail.oauth",error:err.toString()}); + res.redirect(settings.httpAdminRoot + '?session_message='+err.toString()); +} module.exports = { init: init, diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/ui.js b/packages/node_modules/@node-red/editor-api/lib/editor/ui.js index 5fff30725..998816f5e 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/ui.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/ui.js @@ -91,7 +91,16 @@ module.exports = { }, editor: async function(req,res) { - res.send(Mustache.render(editorTemplate,await theme.context())); + + let sessionMessages; + if (req.session && req.session.messages) { + sessionMessages = JSON.stringify(req.session.messages); + delete req.session.messages + } + res.send(Mustache.render(editorTemplate,{ + sessionMessages, + ...await theme.context() + })); }, editorResources: express.static(path.join(editorClientDir,'public')) }; diff --git a/packages/node_modules/@node-red/editor-client/src/images/node-red-256.svg b/packages/node_modules/@node-red/editor-client/src/images/node-red-256.svg new file mode 100644 index 000000000..a8bb17861 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/node-red-256.svg @@ -0,0 +1 @@ + diff --git a/packages/node_modules/@node-red/editor-client/src/js/user.js b/packages/node_modules/@node-red/editor-client/src/js/user.js index bd7339285..6f265df38 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/user.js +++ b/packages/node_modules/@node-red/editor-client/src/js/user.js @@ -21,10 +21,10 @@ RED.user = (function() { opts = {}; } - var dialog = $('
'+ - '
'+ - '
'+ - '
'+ + var dialog = $('
'+ + '
'+ + '
'+ + '
'+ '
'+ '
'); @@ -76,7 +76,7 @@ RED.user = (function() { } row.appendTo("#node-dialog-login-fields"); } - $('
'+RED._("user.loginFailed")+''+ + $('
'+RED._("user.loginFailed")+''+ (opts.cancelable?''+RED._("common.label.cancel")+'':'')+ '
').appendTo("#node-dialog-login-fields"); @@ -121,6 +121,24 @@ RED.user = (function() { i = 0; for (;i",{class:"form-row",style:"text-align: center"}).appendTo("#node-dialog-login-fields"); + RED.sessionMessages.forEach(function (msg) { + $('
').css("color","var(--red-ui-text-color-error)").text(msg).appendTo(sessionMessages); + }); + delete RED.sessionMessages; + } var row = $("
",{class:"form-row",style:"text-align: center"}).appendTo("#node-dialog-login-fields"); var loginButton = $('',{style: "padding: 10px"}).appendTo(row).on("click", function() { @@ -152,7 +170,7 @@ RED.user = (function() { }); } - var loginImageSrc = data.image || "red/images/node-red-256.png"; + var loginImageSrc = data.image || "red/images/node-red-256.svg"; $("#node-dialog-login-image").load(function() { dialog.dialog("open"); diff --git a/packages/node_modules/@node-red/editor-client/templates/index.mst b/packages/node_modules/@node-red/editor-client/templates/index.mst index 334e9f95e..e3d578be9 100644 --- a/packages/node_modules/@node-red/editor-client/templates/index.mst +++ b/packages/node_modules/@node-red/editor-client/templates/index.mst @@ -45,6 +45,10 @@ {{# page.scripts }} {{/ page.scripts }} +{{#sessionMessages}} + +{{/sessionMessages}} +