Я пытаюсь интегрировать функцию входа в систему Microsoft Azure AD с помощью мс-адал-угловой6.
Этот проект основан на Angular-6 для создания настольного приложения с использованием Электрон.
Везде логин работает нормально, кроме тех случаев, когда я создаю файл *.exe
, потому что он имеет систему URL-адресов файл://. Ниже показан экран неудачного входа в систему после ввода правильного OTP в процессе входа.
Я попытался добавить файл://*Reply URL
в portal.azure.com -> Azure Active Directory -> Регистрация приложений -> Настройки (одного приложения) -> URL-адреса перенаправления. Но система этого не приняла.
Я хочу добиться того, чтобы это приложение Electron работало в любой системе (на данный момент Windows) без проблем с входом в Azure.
Не могли бы вы помочь в определении того, что я мог бы сделать иначе, чтобы эта работа работала?
Похоже, это проблема OAuth. OAuth не поддерживает схему URI файла. Несколько дней назад я столкнулся с той же проблемой. Отсюда можно действовать двумя способами:
Существует также третий способ аутентификации с использованием OAuth с узлом в основном процессе. Но вход OAuth с помощью узла рекомендуется только на серверах, а не в электронных приложениях из соображений безопасности. Лично я бы выбрал второй вариант.
Поскольку Azure AD
не поддерживает URL-адреса файловой системы, я создал локальный сервер внутри приложения Electron и обслуживал статические файлы. Таким образом, страница входа в Azure успешно перенаправляется на правильный URL-адрес localhost (он был добавлен в Redirection URLs
настроек Azure).
В приведенном ниже коде используется метод, описанный в служить-статический. Код для создания локального сервера в приложении Electron -
const port = 18090; // port number for local server
const appFolder = 'my_app'; // app folder
const staticFolders = './my_app/path-to-files'; // relative path to static files
// required plugins
const http = require('http');
const finalhandler = require('finalhandler');
const serveStatic = require('serve-static');
// serve up public/ftp folder
let serve = serveStatic(staticPath, {'index': ['index.html', 'index.htm', 'default.html']});
// create server
let server = http.createServer(function onRequest(req, res) {
serve(req, res, finalhandler(req, res));
});
server.listen(port); // listen on mentioned port
// Creating a new browser window
function createWindow() {
let win = new BrowserWindow({
... // required options
});
win.loadURL(`http://localhost:${port}/`); // listen to local server
}
Теперь ваше приложение Electron будет прослушивать локальный сервер вместо файловой системы.
ПРИМЕЧАНИЕ- Вышеупомянутый метод не работает для пакета сборки с файлом формата asar
. Может быть, есть способ сделать то, что я добавлю после того, как найду его.
Я хочу избежать второго варианта из-за некоторых вариантов использования. Последнее, что я могу сделать, это разместить где-нибудь веб-сайт и загрузить его в Electron. Есть еще один вопрос, который я задал, чтобы понять это как MS Teams делает.